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

时间:2015-04-08 18:04:42

标签: spring-boot jhipster

我已经创建了示例jHipster app。现在我想在本地添加自签名SSL证书和测试以访问https。怎么做到这一点?

3 个答案:

答案 0 :(得分:69)

这些说明适用于JHipster所基于的所有Spring Boot应用程序。我在新生成的JHipster 2.7项目上测试了这个。

从头开始,您需要完成以下步骤:

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

  5. 生成自签名证书

    首先,您需要在项目目录中生成自签名证书,这可以使用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

    Spring Boot documentation

    中所述,将SSL属性添加到application.propertiesapplication.yml

    现在您需要为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应用程序选择)一起打包,并使用 mvn spring-boot:run 运行应用程序。您现在可以通过 https://localhost:8080

    访问您的应用

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


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

    您只能通过application.properties启用一个协议,因此当您执行此操作时,只有HTTPS才有效。如果您希望HTTP也能正常工作,并重定向到HTTPS,则必须添加@Configuration类,如下所示

    @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;
      }
    

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

答案 1 :(得分:5)

扩展Driss Amri brilliant answer如何重新启用BrowserSync

如果您选择不支持http,或者http被重定向到https,则BrowserSync将无效。为了使其再次起作用,在以下方面进行的改动很少:

  1. gulp / config.js apiPorturi

    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添加到gulp / serve.js中的browserSync调用中:

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

    现在,BrowserSync将使用随附的自签名证书提供内容。可以重复使用为Spring Boot创建的帐户,更多地使用BrowserSync homepage

答案 2 :(得分:1)

对于那些使用webpack而非gulp的人,您可以通过两项更改完成Driss Amri's回答:

修改 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
    }]
},