多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
* 本篇文章针对的是BS 的Java 版本,基于Springboot项目部署SSL证书实现https访问 * SSL简介: >SSL(Secure Sockets Layer 安全套接层)是为网络通信提供安全及数据完整性的一种安全协议,SSL在网络传输层对网络连接进行加密,SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通信提供安全支持。SSL协议分为两层,SSL记录协议建立在TCP之上,为高层协议提供数据封装、压缩、加密等基本功能支持。SSL握手协议建立在SSL记录协议之上,用户实际数据传输开始前进行身>份验证、协商加密算法、交换加密秘钥。 <br/> ## 一、SSL证书获取 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;各个平台获取SSL证书的方式不一样,通常只需要找到下载证书的位置点击需要的证书类型下载就可以了,可下载的SSL证书文件格式固定只有几种(.crt、.pfx、cer、.jks等);下图是在阿里云注册的域名下载SSL证书的操作方式: ![](https://img.kancloud.cn/d5/ff/d5ff529d4bd8a52ed85f4d30a781bf4a_1297x729.png) <br/> # 二、SSL证书部署流程 <br/> 1、springboot项目部署各种后缀格式的SSL证书 <br/> (1)部署jks后缀的SSL证书,直接在application.yml文件中添加上下面的配置即可 ![](https://img.kancloud.cn/f3/8b/f38bbb57c5398a66639096bbc5dd928b_1020x140.png) ***** (2)部署p12后缀的SSL证书,同样的在application.yml文件中加上类似的配置; ![](https://img.kancloud.cn/d7/bf/d7bf75c25e2926e02e4c3b6850684908_326x154.png) 一般来说**p12**文件都是由crt文件转换而来,可以在linux环境下操作,因为需要用到openssl依赖,输入完命令回车后需要输入两次密码,这里输入的密码需要写入到application.yml中的**key-store-password**属性中,操作如下: > [root@localhost https]# openssl pkcs12 -export -clcerts -in youSSL.crt -inkey ssl.key -out server.p12 > Enter Export Password: > Verifying - Enter Export Password: > [root@localhost https]# **注意点**:关于application.yml中**key-alias**属性值的配置方式需要特别处理,当执行完上述命令后可以看到对应的目录下会生成出**server.p12 **文件,这时还需要执行命令:keytool -list -keystore server.p12 ![](https://img.kancloud.cn/55/87/5587fa611988b62c996ff2292ccb3ec1_594x163.png) <br/> # 三、关于https的配置类 1、将http请求转发至https,添加一个配置类完成转发 ``` package com.base.https.config; import org.apache.catalina.Context; import org.apache.catalina.connector.Connector; import org.apache.tomcat.util.descriptor.web.SecurityCollection; import org.apache.tomcat.util.descriptor.web.SecurityConstraint; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class HttpsConfig { @Bean public TomcatServletWebServerFactory serverContainer(){  TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory(){  protected void postProcessContext(Context context){   SecurityConstraint constrant = new SecurityConstraint();   constrant.setUserConstraint("CONFIDENTIAL");   SecurityCollection collection = new SecurityCollection();   collection.addPattern("/\*");   constrant.addCollection(collection);   context.addConstraint(constrant);  } };   tomcat.addAdditionalTomcatConnectors(httpConnector());   return tomcat; }   // @Bean  public Connector httpConnector() {   Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT\_PROTOCOL); connector.setScheme("http"); connector.setPort(8889);//指定http的端口为8889, connector.setSecure(false); //自动重定向到 https 端口 默认为443 这里设置为8887 connector.setRedirectPort(8887);   return connector;  } ``` 2、解决程序部署在linux环境下运行时个别请求会被拦截问题(实现接口"**X509TrustManager**") ``` package com.base.https.config; import javax.net.ssl.X509TrustManager; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; /** * 请求Https 配置类 */ public class SslTrustManager implements X509TrustManager { // 检查客户端证书 @Override public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { } // 检查服务端证书 @Override public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { } // 返回受信任的X509 证书数组 @Override public X509Certificate[] getAcceptedIssuers() { return null; } } ```