配置浏览器信任的 Spring boot https 开发环境

日常大多数前端使用的都是 Chrome 浏览器,由于安全策略的限制,Chrome 不允许在 https 环境之下访问非 https 的资源,包括静态资源和非静态 http 请求,会报 Mixed Content blocked 错误,因此为了让前端同学可以在日常的环境中和后端同学联合调试就需要一套可信任的 https 环境,最终状态是通过自定义域名访问 http 服务事浏览器会显示证书安全的标志,如下访问 freecodecamp.org 一样

本文详细记录了配合 Spring boot 在 Mac 下搭建一套浏览器信任的 https 环境的全部工作,我们假设本地要使用的域名是 dev.com

生成自签名证书

生成一个 RSA-2048 的 key ,用来生成 Root SSL certificate,生成过程中根据提示输入密码,这个密码在后续使用过程中会用到,所谓根证书就是权威机构颁发的证书,详细含义见 What is a Root SSL Certificate?

1
openssl genrsa -des3 -out rootCA.key 2048

然后用这个 key 生成根证书,这个证书的有效期是 1024 天,可以根据自己的需要变更。

1
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.pem

让 Mac 信任证书

打开 Mac 的钥匙串 App,导入生成的 rootCA.pem

然后双击导入的证书进行编辑,改写信任->当使用证书一览:始终信任

为域名 dev.com 签发证书

创建 server.csr.cnf 文件,输入以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn

[dn]
C=US
ST=RandomState
L=RandomCity
O=RandomOrganization
OU=RandomOrganizationUnit
emailAddress=hello@dev.com
CN = dev.com

创建一个 v3.ext 文件,输入以下内容

1
2
3
4
5
6
7
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = dev.com

使用 server.csf.cnf 文件为 dev.com 创建一个certificate key 保存为 server.key 文件

1
openssl req -new -sha256 -nodes -out server.csr -newkey rsa:2048 -keyout server.key -config <( cat server.csr.cnf )

接着生成 certificate signing request 文件 server.crt

1
openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 500 -sha256 -extfile v3.ext

配置 spring boot 的 https

Java 提供了 keytool 工具为 Java 程序生成对应的 https 证书,其格式是 JKS 或 PKCS12,在这里我们在 Spring boot 中 使用 PKCS12 格式,在上面的我们已经为 dev.com 生成了对应的证书,再此我们可以使用 keytool 工具进行转换为 PKCS12

1
openssl pkcs12 -export -out springboot.p12 -inkey server.key -in server.crt

springboot.p12拷贝到 Spring 项目的 resource 下,配置 Spring 的 application.yamlapplication.properties

1
2
3
4
5
6
7
server:
ssl:
key-store: classpath:springboot.p12
key-store-password: password
key-store-type: pkcs12
key-password: password
port: 443

启动 Spring 程序,配置 dev.com 指定到本地 127.0.0.1 即可完成访问

参考

三月沙 wechat
扫描关注 wecatch 的公众号