关于Springboot配置ssl证书使用HTTPS访问
前言
最近要将原本http访问的后端项目改造成Https访问,这里做一下问题记录,也方便后来寻找的同学可以顺利转换,避免采坑。
准备材料
首先你要准备好你已经拿到了的证书文件,当时给我,我解压出来就只有这两个文件,一个是crt文件,另外一个是key文件转换成.pfx格式证书
打开 https://www.chinassl.net/ssltools/convert-ssl.html 进行在线证书格式转换
这个网址也可以免费制作和生成SSL证书
生成完成之后点击下载
Springboot配置
- 将生成好的.pfx文件复制到你springboot项目中的resources文件目录下,并修改你的.yml文件配置:
server:
port: 443 #这个端口就是最终你项目的访问端口,https的跳转端口
ssl:
key-store: classpath:你的pfx文件名称.pfx
key-store-password: 刚才转换pfx文件设置的密码
key-store-type: PKCS12
enabled: true
- 修改你的Application启动文件,加入如下方法
/**
* http重定向到https
* @return
*/
@Bean
public ServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
@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监听的http的端口号
connector.setPort(8080);
connector.setSecure(false);
//监听到http的端口号后转向到的https的端口号
connector.setRedirectPort(443);
return connector;
}
测试
- 启动Springboot,可以看到
2020-10-10 16:40:04.072 [main] INFO o.s.b.w.e.t.TomcatWebServer - [initialize,108] - Tomcat initialized with port(s): 443 (https) 8080 (http)
-
打开浏览器访问 http://localhost:8080/doc.html,这里我项目因为集成了Swagger,所以直接访问的Swagger页面地址测试。使用google浏览器第一次访问会报警告,点击选择详细信息,继续访问即可,然后你就可以看到连接自己跳转使用了https的访问方式。
-
实际测试你可以写一个Get请求的Controller方法,返回字符串,访问http://localhost:8080/test即可,
@Controller
public class TestController {
@ResponseBody
@GetMapping("/test")
public String test() {
return "hello,World";
}
}
配置过程中遇到的问题
我在配置完成,启动项目的过程中曾遇到了这个问题:Caused by: java.io.IOException: DerInputStream.getLength(): lengthTag=111, too big.
at sun.security.util.DerInputStream.getLength(DerInputStream.java:599)
at sun.security.util.DerValue.init(DerValue.java:391)
at sun.security.util.DerValue.<init>(DerValue.java:332)
at sun.security.util.DerValue.<init>(DerValue.java:345)
at sun.security.pkcs12.PKCS12KeyStore.engineLoad(PKCS12KeyStore.java:1938)
at java.security.KeyStore.load(KeyStore.java:1445)
at org.apache.tomcat.util.security.KeyStoreUtil.load(KeyStoreUtil.java:67)
at org.apache.tomcat.util.net.SSLUtilBase.getStore(SSLUtilBase.java:216)
at org.apache.tomcat.util.net.SSLHostConfigCertificate.getCertificateKeystore(SSLHostConfigCertificate.java:207)
at org.apache.tomcat.util.net.SSLUtilBase.getKeyManagers(SSLUtilBase.java:282)
at org.apache.tomcat.util.net.SSLUtilBase.createSSLContext(SSLUtilBase.java:246)
at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:97)
... 26 common frames omitted
解决方法
在pom.xml中加入如下配置,过滤后缀为pkcs12、jks、pfx的证书文件。如果还加载其他文件,可以自行加入。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration><encoding>UTF-8</encoding>
<!-- 过滤后缀为pkcs12、jks、pfx的证书文件 -->
<nonFilteredFileExtensions>
<nonFilteredFileExtension>pkcs12</nonFilteredFileExtension>
<nonFilteredFileExtension>jks</nonFilteredFileExtension>
<nonFilteredFileExtension>pfx</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>