生成含有使用者备用名称(SAN) 的 SSL 证书, 解决 Chrome 和 Okhttp HTTPS 报错

之前设置了 ipv6 DDNS, 可以从外网访问到家里 AIO 上的 http 服务器.

由于只是自己使用, 就打算使用自签名证书. 但按照网上教程生成的证书导入 Chrome 后报错 ERR_CERT_COMMON_NAME_INVALID, 在 OkHttp 中报错Hostname xxx is not verified.

查阅资料发现是生成的证书没有 SAN 的缘故, 网上生成 SAN 自签名证书的教程很多都有问题, 最终找到一种可行的方法, 记录在此.

0x00 准备工作

新建一个文件夹, cd 到该文件夹下, 并确保 openssl 命令可用.

0x01 新建配置文件

启用 SAN 拓展的无法直接通过 cli 生成, 故使用配置文件.

新建 openssl.cnf 文件, 写入以下内容.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
[ req ]
default_bits = 4096
default_keyfile = private/ca.key
distinguished_name = req_distinguished_name
req_extensions = req_ext
x509_extensions = x509_ext
string_mask = utf8only

[ req_distinguished_name ]
countryName = Country Name (2 letter code)
stateOrProvinceName = State or Province Name (full name)
localityName = Locality Name (eg, city)
organizationName = Organization Name (eg, company)
commonName = Common Name (e.g. server FQDN or YOUR name)
emailAddress = Email Address

countryName_default = CN
stateOrProvinceName_default = Jiangsu
localityName_default = Suzhou


[ x509_ext ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
subjectAltName = @alt_names

[ req_ext ]
subjectKeyIdentifier = hash
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = example1.com
DNS.2 = *.example2.com(可以使用通配符.)

注意修改最后的 example.com 为你的域名. 其他可以不用修改.

0x02 自签名并生成证书

执行openssl req -x509 -newkey rsa:4096 -sha256 -utf8 -days 3650 -nodes -config ./openssl.cnf -keyout ./server.key -out ./server.crt

按照提示输入相关内容, 证书生成成功. 替换掉原本 https 服务器中的证书.

0x03 完成

Windows 下双击打开 crt 文件, 安装证书到 受信任的根证书颁发机构, 发现 Chrome 连接网站已经不会报错.

本文采用 CC BY-NC-SA 4.0 许可协议发布.

作者: lyc8503, 文章链接: https://blog.lyc8503.net/post/self-signed-cert-with-san/
如果本文给你带来了帮助或让你觉得有趣, 可以考虑赞助我¬_¬