如何将自签名 SSL 证书添加到 jHipster 示例应用程序?

How to add self signed SSL certificate to jHipster sample app?

我已经创建了示例 jHipster 应用程序。现在我想添加自签名 SSL 证书并在本地进行测试以访问 https。如何做到这一点?

这些说明适用于 JHipster 所基于的所有 Spring 启动应用程序。我已经在新生成的 JHipster 2.7 项目上对此进行了测试。

从头开始需要完成这些步骤:

  1. 生成自签名证书
  2. 将 SSL 属性添加到 application.properties 或 application.yml,如 Spring Boot documentation
  3. 中所述
  4. (可选)将 HTTP 重定向到 HTTPS

正在生成自签名证书

首先您需要在您的项目目录中生成您的自签名证书,这可以使用 keytool 来完成,这是 Java:

提供的实用脚本
keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650
Enter keystore password:  
Re-enter new password:
What is your first and last name?
  [Unknown]:  
What is the name of your organizational unit?
  [Unknown]:  
What is the name of your organization?
  [Unknown]:  
What is the name of your City or Locality?
  [Unknown]:  
What is the name of your State or Province?
  [Unknown]:  
What is the two-letter country code for this unit?
  [Unknown]:  
Is CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown correct?
  [no]:  yes

我选择了密码 mypassword,所以这是我将在下一步中使用的密码。完成此操作后,您将在当前目录中看到 keystore.p12

将 SSL 属性添加到您的 application.propertiesapplication.yml,如 Spring Boot documentation

中所述

现在您需要为 Tomcat 添加 HTTPS 连接器属性。您可以在 src/main/resources/ 中找到 属性 (yml) 文件,您需要更新 application.yml(或者如果它仅用于 application-dev.yml 中的开发,具有以下属性:

server:
  ssl:
    key-store: keystore.p12
    key-store-password: mypassword
    keyStoreType: PKCS12
    keyAlias: tomcat

现在您可以使用 mvn clean package 使用 Maven(或者 Gradle 如果您为 JHipster 应用程序选择 Maven)打包您的应用程序,并且 运行 使用 mvn 的应用程序spring-引导:运行。您现在可以在 https://localhost:8080

上访问您的应用程序

为简单起见,我没有更改端口,但理想情况下您也应该在属性文件中更改它,但我将其遗漏了,因为它们已经在 application-dev.ymlapplication-prod.yml 中定义,所以你必须在那里更改它或删除它并将它放在一般 application.yml


(可选)添加重定向 HTTP 到 HTTPS

您只能通过 application.properties 启用一种协议,因此当您像上面那样执行此操作时,只有 HTTPS 可以工作。如果您希望 HTTP 也能正常工作,并重定向到 HTTPS,您必须添加如下所示的 @Configuration class

@Bean
  public EmbeddedServletContainerFactory servletContainer() {
    TomcatEmbeddedServletContainerFactory tomcat = new      TomcatEmbeddedServletContainerFactory() {
        @Override
        protected void postProcessContext(Context context) {
          SecurityConstraint securityConstraint = new SecurityConstraint();
          securityConstraint.setUserConstraint("CONFIDENTIAL");
          SecurityCollection collection = new SecurityCollection();
          collection.addPattern("/*");
          securityConstraint.addCollection(collection);
          context.addConstraint(securityConstraint);
        }
      };

    tomcat.addAdditionalTomcatConnectors(initiateHttpConnector());
    return tomcat;
  }

  private Connector initiateHttpConnector() {
    Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
    connector.setScheme("http");
    connector.setPort(8080);
    connector.setSecure(false);
    connector.setRedirectPort(8443);

    return connector;
  }

此回复基本上是我关于同一主题的博客 post 的副本:http://www.drissamri.be/blog/java/enable-https-in-spring-boot/

扩展如何重新启用BrowserSync

如果您选择不支持http,或者http重定向到https,BrowserSync将不起作用。要使其再次运行,需要进行少量更改:

  1. gulp/config.jsapiPorturi 至:

    apiPort: 8443, 
    uri: 'https://localhost:',
    
  2. gulp/serve.js:将options.rejectUnauthorized = false;添加到proxyRoutes中,这样节点就不会抱怨自签名证书:

    proxyRoutes.map(function (r) {
        var options = url.parse(baseUri + r);
        options.route = r;
        options.preserveHost = true;
        options.rejectUnauthorized = false;
        return proxy(options);
    }));
    
  3. 可选择让 BrowserSync 也通过 https 提供内容。我建议使用 Spring Social 来省去一些麻烦。只需将 https: true 添加到 browserSync 调用 gulp/serve.js:

    browserSync({
        open: true,
        port: config.port,
        server: {
            baseDir: config.app,
            middleware: proxies
        },
        https: true
    });
    

    现在 BrowserSync 将使用随附的自签名证书提供内容。可以重用为 Spring Boot 创建的那个,更多关于 BrowserSync homepage

对于那些使用 webpack 而不是 gulp 的人,您可以完成 两个更改的答案:

修改proxy.conf.json:

{
    "*": {
        "target": "https://localhost:8443",
        "secure": true
    }
}

这会将 API 请求重定向到新的 https 地址。 然后也改变 webpack 文件例如这里 webpack.dev.js 修改示例:

module.exports = webpackMerge(commonConfig({ env: ENV }), {
devtool: 'eval-source-map',
devServer: {
    contentBase: './target/www',
    proxy: [{
        context: [
            /* jhipster-needle-add-entity-to-webpack - JHipster will add entity api paths here */
            '/api',
            '/management', ...
            '/auth'
        ],
        target: 'https://127.0.0.1:8443',
        /* set secure to false here, otherwise self-signed certification cause DEPTH_ZERO_SELF_SIGNED_CERT proxy errors */
        secure: false
    }]
},