Spring Boot配置Https访问

有些时候,比如说一些安全敏感性的业务,必须要配置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
image.png

使用openssl

参考:OpenSSL 证书功能

配置Spring Boot应用

1 将上一步生成的jmxdemo.p12文件移到resource目录下。

image-20191123223033466

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
  1. 启动应用,然后查看效果
image-20191123221425827
image-20191123224016178

如果想要配置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);
}

证书对比

是否信任为我们访问的时候选择是不是要将其添加为信任证书。可以看出区别

image.png

问题

有可能再我们使用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

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容