有些时候,比如说一些安全敏感性的业务,必须要配置https才能访问请求,而本地也必须要启动https的应用才能进行后续的调试工作。那么我们需要自签证书,让我们的应用跑在https上。
生成自签证书
在Java中有两种常见的证书格式。
- PKCS12:作为工业标准被广泛使用,文件扩展名一般为
.p12
或者.pfx
,可以使用openssl pkcs12
命令来创建,解析。 在Java中直接使用keytool
工具处理也是可以的。 - JKS:仅仅给Java使用的key存储格式。扩展名一般为
.jks
,使用keytool工具来处理。
使用keytool
# 使用keytool生成pkcs12文件格式证书。
# 如果不指定-storetype,默认为jks类型,即java.security.KeyStore.getDefaultTyp()方法返回的类型
# 参考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/keytool.html
keytool -genkeypair -alias jmxdemo -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore jmxdemo.p12 -validity 3650
# 如果已经生成了默认的jks类型的证书,可以将其转化为pkcs12类型的
# keytool -genkeypair -alias jmxdemo -keyalg RSA -keysize 2048 -keystore jmxdemo.jks -validity 3650
keytool -importkeystore -srckeystore jmxdemo.jks -destkeystore jmxdemo.p12 -deststoretype pkcs12
查看生成的证书:
keytool -list -v -storetype pkcs12 -storepass 123456 -keystore src/main/resources/keystore/jmxdemo.p12
使用openssl
参考:OpenSSL 证书功能
配置Spring Boot应用
1 将上一步生成的jmxdemo.p12
文件移到resource目录下。
2 配置spring boot使用证书
server.ssl.enabled=true
# The format used for the keystore. It could be set to JKS in case it is a JKS file
# 证书存储的类型,可以是JKS,Java支持的类型就行。
server.ssl.key-store-type=PKCS12
# The path to the keystore containing the certificate
# 证书文件的位置
server.ssl.key-store=classpath:keystore/jmxdemo.p12
# The password used to generate the certificate
# 证书生成试指定的密码
server.ssl.key-store-password=123456
# The alias mapped to the certificate
# 证书的alias
server.ssl.key-alias=jmxdemo
- 启动应用,然后查看效果
如果想要配置Resttemplate访问的话:
RestTemplate restTemplate() throws Exception {
SSLContext sslContext = new SSLContextBuilder()
// 证书jmxdemo.p12文件的位置
.loadTrustMaterial(trustStore.getURL(), trustStorePassword.toCharArray())
.build();
SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslContext);
HttpClient httpClient = HttpClients.custom()
.setSSLSocketFactory(socketFactory)
.build();
HttpComponentsClientHttpRequestFactory factory =
new HttpComponentsClientHttpRequestFactory(httpClient);
return new RestTemplate(factory);
}
证书对比
是否信任为我们访问的时候选择是不是要将其添加为信任证书。可以看出区别
问题
有可能再我们使用maven的时候,maven的resource插件会自动过滤掉文件中的内容,导致密钥不可用,那么要配置maven不去过滤对应的pkcs文件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
<configuration>
<delimiters>
<delimiter>@</delimiter>
</delimiters>
<nonFilteredFileExtensions>
<nonFilteredFileExtension>p12</nonFilteredFileExtension>
<nonFilteredFileExtension>pfx</nonFilteredFileExtension>
<nonFilteredFileExtension>pem</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>
最后
pkcs12是工业标准的类型,建议使用pkcs12类型的证书。另外keytool一行命令就可以帮我们生成证书,openssl需要多个步骤。
阿里陶系技术部招人,目前大把机会,HC众多,成功率高,流程快,可辅导修改简历,技术答疑,速来! 不行的话,加个朋友认识下.
邮箱:aihe.ah@alibaba-inc.com
微信:aihehe5211