之前设置了 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 连接网站已经不会报错.