一、背景
随着各平台越来越严格的安全性要求(例如微信小程序对接必须使用HTTPS接入),网站的HTTPS化势在必行。
二、接入要求
要让一个服务接入HTTPS服务,至少需要以下几个步骤:
- 购买权威机构的SSL证书
- 将证书配置到服务器中(如启用SSL、绑定SSL端口等)。
三、免费SSL证书申请
腾讯云的申请地址是:https://buy.cloud.tencent.com/ssl
申请示意图如下:
选择“域名型免费版(DV)”点击“快速免费申请”,并按要求填写后续信息(如绑定的域名、申请人个人资料等)即可。
3.2 证书文件说明
当申请审批通过后,即可在控制台看到自己的证书相关信息,包括证书文件、绑定域名等:
点击上图中的下载按钮,即可下载证书文件。该压缩包内部按照服务器类型进行了划分,有Apache、tomcat、IIS等主流服务器的证书文件:
由于tomcat是默认内置tomcat服务器,因此我们使用tomcat文件夹下的证书。其内容如下所示:
其中jks即为证书文件,而keystorePass.txt文本文件中存储的是私钥,该文件的内容在配置SpringBoot的时候会使用到。
四、JeecgBoot配置HTTPS
在JeectBoot应用中接入SSL证书并不复杂,只需要几行配置即可。整个过程可以分为证书文件引入、证书文件配置和端口映射3步:
4.1证书文件引入
将jks证书文件放到application.propertis配置文件相同的目录中:
4.2配置SSL
在application.properties配置文件中添加如下几行配置:
#配置SSL
server.port=443
server.ssl.key-store =classpath:***.*******.com.jks
server.ssl.key-store-password=********
server.ssl.keyStoreType= JKS
- 其中port指定了SSL监听的端口,只有访问该端口才会采用https方式。该端口可以随意指定,不会冲突即可。
- key-store制定了证书文件的完整路径名。注意classpath:标志必不可少哦,否则到服务器上会提示证书文件找不到。
- key-store-password指定了私钥,即keystorePass.txt中的内容。
- KeyStoreType指定证书文件的类型,jks证书文件的类型即是JKS。
到了这里,实际上你的应用已经能够使用HTTPS服务了,如访问“https://***.jeecg.com” 则会自动使用https服务。而如果想要其他端口也使用https服务,则还需要第三步:端口映射。
4.3端口映射
在SpringBoot的启动类*Application文件中添加如下配置:
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(httpConnector());
return tomcat;
}
@Bean
public Connector httpConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(8080); //初始端口
connector.setSecure(false);
connector.setRedirectPort(443); //映射端口
return connector;
这部分代码实际上和SSL没有关系,它的作用仅仅是将所有对8080端口的访问重定向到443端口。而443端口又恰巧是我们的SSL端口,因此这样就能让8080端口也享受https服务。
4.4 Maven build排除jks文件
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>bootapi.jeecg.com.jks</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<includes>
<include>bootapi.jeecg.com.jks</include>
</includes>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.json</include>
<include>**/*.ftl</include>
</includes>
</resource>
</resources>
五、总结
实际上服务器接入SSL服务,尤其是SpringBoot接入还是非常简单的。只要有了证书文件,那么仅仅只需要4行配置就可以让我们的SpringBoot应用接入SSL,使用HTTPS服务。
在接入的过程中有以下几点需要注意:
- server.ssl.key-store =classpath:.****.com.jks中的classpath:切记不可忘记,否则定位不到证书文件。
- keystorePass.txt中的私钥要妥善保存,万万不能泄露。
- 端口映射可有可无,我的应用中直接将server.port设置为9999,然后应用也访问该接口,直接使用SSL服务。
- Maven build排除jks文件很重要,不然启动会提示Invalid keystore format错误
来源:oschina
链接:https://my.oschina.net/jeecg/blog/4494367