美文网首页
springboot https服务配置

springboot https服务配置

作者: BeeHoney | 来源:发表于2018-12-29 17:01 被阅读0次

    说明

    能够使用到https服务,一般是web服务器或者网关服务器。

    步骤1 生成证书文件

    此处用的是自签名证书。

    JDK中keytool是一个证书管理工具,可以生成自签名证书。(找不到keytool命令的先去配置java环境)
    keytool -genkey -alias worktool -keyalg RSA -keystore ssl.keystore
    
    输入密钥库口令:(Pass0rd)
    再次输入新口令:
    您的名字与姓氏是什么?
      [Unknown]:  net
    您的组织单位名称是什么?
      [Unknown]:  net
    您的组织名称是什么?
      [Unknown]:  net
    您所在的城市或区域名称是什么?
      [Unknown]:  WUHAN
    您所在的省/市/自治区名称是什么?
      [Unknown]:  HUBEI
    该单位的双字母国家/地区代码是什么?
      [Unknown]:  CN
    CN=wd, OU=wd, O=wd, L=SHANGHAI, ST=SHANGHAI, C=CN是否正确?
      [否]:  y
    
    

    生成p12证书的方法

    
    keytool支持交互的方式提供证书信息。要生成一个p12证书,必须了解这样几个参数:
    
    -genkeypair 生成证书
    -keystore 生成证书的路径和文件名
    -storetype 生成的证书类型,使用pkcs12指定p12格式证书
    -validity 有效期的天数,用一个足够大的值跳转到2034年
    下面是一个例子:
    
    keytool -genkeypair -keystore ssl.p12 -storetype pkcs12 -validity 365
    输入密钥库口令:(Pass0rd)
    再次输入新口令:
    您的名字与姓氏是什么?
      [Unknown]:  net
    您的组织单位名称是什么?
      [Unknown]:  net
    您的组织名称是什么?
      [Unknown]:  net
    您所在的城市或区域名称是什么?
      [Unknown]:  WUHAN
    您所在的省/市/自治区名称是什么?
      [Unknown]:  HUBEI
    该单位的双字母国家/地区代码是什么?
      [Unknown]:  CN
    CN=wd, OU=wd, O=wd, L=SHANGHAI, ST=SHANGHAI, C=CN是否正确?
      [否]:  y
    还是用上面的方法验证一下证书的有效期:
    
    keytool -list -keystore ssl.p12 -storetype pkcs12 -v
    输入密钥库口令:
    
    密钥库类型: PKCS12
    密钥库提供方: SunJSSE
    
    您的密钥库包含 1 个条目
    
    别名: mykey
    创建日期: 2012-9-27
    条目类型: PrivateKeyEntry
    证书链长度: 1
    证书[1]:
    所有者: CN=.net, OU=.net, O=.net, L=WUHAN, ST=HUBEI, C=CN
    发布者: CN=.net, OU=.net, O=.net, L=WUHAN, ST=HUBEI, C=CN
    序列号: 1faa29fb
    有效期开始日期: Thu Sep 27 18:23:31 CST 2012, 截止日期: Thu Oct 12 18:23:31 CST 2034
    证书指纹:
             MD5: F8:00:9C:3B:7B:4F:F2:9D:A3:B6:3F:E9:78:2D:9A:46
             SHA1: 10:21:FF:B3:DE:3F:D4:0D:44:F7:D1:07:6A:3F:09:D8:36:B9:D1:21
             SHA256: AB:8A:09:5B:69:1F:95:A5:94:F7:60:F6:D0:81:8A:1D:23:42:94:3C:96:D3:04:AD:C9:59:05:14:2E:B6:6D:79
             签名算法名称: SHA1withDSA
             版本: 3
    
    

    步骤2 先设置配置文件 application.yml

    server:
      port: 9001
    #  session:
    #    timeout: 6000
    
    system:
      ssl:
        # 是否开启https
        enable: true
        # https的端口
        port: 9443
        # 证书文件
        key-store: ssl.keystore
        # 生成的密钥
        key-store-password: Pass0Rd
        # 证书类型
        keyStoreType: JKS
        # 证书文件存放位置
        key-store-path: /usr/local/bin
        # 是否http自动跳转https
        redirect_https: true
    

    步骤3 通过注册Bean的方式配置ssl

    @ConditionalOnExpression(value = "${system.ssl.enable:false}")
    @Configuration
    @Slf4j
    public class CustomServerSSLConfiguration {
    
        @Value("${server.port}")
        private Integer serverPort;
    
        @Value("${system.ssl.port}")
        private Integer tomcatSSLPort;
    
        @Value("${system.ssl.key-store}")
        private String tomcatSSLKeyStore;
    
        @Value("${system.ssl.key-store-password}")
        private String keystorePassword;
    
        @Value("${system.ssl.keyStoreType}")
        private String keystoreType;
    
        @Value("${system.ssl.key-store-path}")
        private String keystorePath;
    
        @Value("${system.ssl.redirect_https}")
        private Boolean redirectHttps;
    
        /**
        *  1.5.x以下版本配置
        * @param
        * @return
        * @throws
        */
        @Bean
        public EmbeddedServletContainerFactory servletContainer() {
            TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
            tomcat.addAdditionalTomcatConnectors(createSslConnector()); // 添加https
    
            return tomcat;
        }
    
    
        // 配置https
        private Connector createSslConnector() {
            Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
    //        BufferedReader bre = null;
    //        OutputStreamWriter pw = null;// 定义一个流
            try {
    
                File file = new ClassPathResource(tomcatSSLKeyStore).getFile();
                // log.info("keystore文件路径={},文件名={}", file.getAbsolutePath(),tomcatSSLKeyStore);
    
                connector.setPort(tomcatSSLPort);
                connector.setSecure(true);
                connector.setScheme("https");
    
                protocol.setSSLEnabled(true);
    //            protocol.setSSLProtocol("TLS");
    
                protocol.setKeystoreFile(file.getAbsolutePath());
                protocol.setKeystoreType(keystoreType);
                protocol.setKeystorePass(keystorePassword);
                protocol.setKeyPass(keystorePassword);
                return connector;
            } catch (IOException ex) {
               try {
                   ClassLoader classloader = Thread.currentThread().getContextClassLoader();
                   InputStream stream = classloader.getResourceAsStream(tomcatSSLKeyStore);
    
                   File file = new File(keystorePath);
                   if (!file.exists()){
                       // log.info("===================文件不存在,进行创建");
                       file.mkdirs();
                   }
                   File file1 = new File(keystorePath+"/"+tomcatSSLKeyStore);
                   if (!file1.exists()){
                       // log.info("===================文件不存在,创建文件");
                       file1.createNewFile();
                   }
    //                bre = new BufferedReader(new InputStreamReader(stream, "UTF-8"));
    //                pw = new OutputStreamWriter(new FileOutputStream(tomcatSSLKeyStore);
    
                   FileOutputStream fos = new FileOutputStream(file1);
                   byte[] b = new byte[1024];
                   while ((stream.read(b)) != -1) {
                       fos.write(b);
                   }
                   stream.close();
                   fos.close();
                   // log.info("keystore文件路径={},文件名={}", file1.getAbsolutePath(),tomcatSSLKeyStore);
    
                   connector.setPort(tomcatSSLPort);
                   connector.setSecure(true);
                   connector.setScheme("https");
    
                   protocol.setSSLEnabled(true);
    //            protocol.setSSLProtocol("TLS");
    
                   protocol.setKeystoreFile(file1.getAbsolutePath());
                   protocol.setKeystoreType(keystoreType);
                   protocol.setKeystorePass(keystorePassword);
                   protocol.setKeyPass(keystorePassword);
                   return connector;
               }catch (IOException ex1){
                   log.error("ssl.keystore文件不存在,请放入项目的src/main/resources下面。");
               }
            }
            return null;
        }
    }
    

    更多,请关注:
    springboot 技术实践总结

    相关文章

      网友评论

          本文标题:springboot https服务配置

          本文链接:https://www.haomeiwen.com/subject/ohhklqtx.html