白话Https一文中, 介绍了Https存在的目的和工作原理,但多是偏向于原理性的介绍,本文介绍如何一步一步自制一个能够通过浏览器认证的Https证书,并讲解在Spring Boot环境和Nginx环境中服务器端的配置。
如果你还没有读过白话Https,我强烈建议你先去读一下。按照白话Https中的介绍,Https协议涉及到的主体主要有三个:客户端、服务端、以及CA机构。如下图所示:
在白话Https一文中,曾介绍一个服务要申请使用Https的流程。本文所介绍的流程,针对自制Https证书,更多的面向测试场景,当然了,有些网站,比如像12306这样的,也会自制根证书要求用户安装。既然是要DIY,当然也要分别在三个主体上做工作。
openssl genrsa -out ca.key 2048
openssl req -x509 -new -key ca.key -out ca.crt
注意生成过程中需要输入一些CA机构的信息
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr
注意生成过程中需要你输入一些服务端信息
openssl x509 -req -sha256 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -out server.crt
关于sha256,默认使用的是sha1,在新版本的chrome中会被认为是不安全的,因为使用了过时的加密算法。
openssl pkcs12 -export -in server.crt -inkey server.key -out server.pkcs12
生成过程中,需要创建访问密码,请记录下来。
keytool -importkeystore -srckeystore server.pkcs12 -destkeystore server.jks -srcstoretype pkcs12
生成过程中,需要创建访问密码,请记录下来。
keytool -importcert -keystore server.jks -file ca.crt
不管通过什么浏览器吧,总之你要找到下面这个页面,点击导入,将上面生成的CA机构的ca.crt导入到收信任的根证书颁发机构列表中。
注意,收信任的根证书颁发机构列表是操作系统级的,不管通过哪个浏览器进入配置,都是只需要配置一次,再使用其它浏览器时,无需重复配置。
Spring Boot为web容器提供了统一的抽象配置,不管你使用的是Tomcat是Jetty还是其它web容器,如果要在Spring Boot中使用Https,你只需要在你的配置类中,添加如下代码,注册一个EmbeddedServletContainerCustomizer Bean即可。
需要用到上面生成的Server.jks文件。
@Configuration public class WebConfig { @Bean public EmbeddedServletContainerCustomizer containerCustomizer() { return new EmbeddedServletContainerCustomizer() { @Override public void customize(ConfigurableEmbeddedServletContainer container) { Ssl ssl = new Ssl(); ssl.setKeyStore("Server.jks"); ssl.setKeyStorePassword("passwd"); container.setSsl(ssl); container.setPort(8443); } }; } }
如果要在Nginx中使用Https,需要用到上面生成的Server.crt,Server.key。
server { listen 127.0.0.1:443 ssl; ssl on; ssl_certificate Server.crt; ssl_certificate_key Server.key; #省略无关配置... }