现在局域网的设备越来越多了, 默认使用 SSL 连接的 Web UI 总是提示不安全。虽然可以选择忽略提示, 但浏览器重启后仍会重置提示。如果为每个设备单独信任证书, 维护成本较高, 所以有了这份笔记。通过创建自定义 CA 根证书, 再由这个 CA 根证书为局域网设备签发证书, 这样只需要信任这个根证书所有的签发的证书都会被信任, 便可解决这一问题。自签主要是为了局域网 IP
本文介绍如何执行以下操作
- 创建自定义证书颁发机构 (CA)
- 使用自定义 CA 签发自签名证书
准备条件
本教程基于 OpenSSL 工具
- 在 Windows 上安装 Windows OpenSSL, 一般下载 Win64 OpenSSL v1.1.1k Light 版本就足够使用了
- 许多 Linux 分发版 (如 Ubuntu) 中已预先安装 OpenSSL。WSL2 (我死了啊) 这样的子系统也是可以使用的
创建根 CA 证书
使用 OpenSSL 创建根 CA 证书
创建根密钥
运行以下命令生成根密钥
openssl ecparam -out ROOT_CA_PRIVATEKEY.key -name secp384r1 -genkey
如果需要较低加密强度, 可将 secp384r1
替换为 prime256v1
创建根证书并进行自签名
生成 CSR 文件
交互模式, 需要手动填资料
openssl req -new -sha256 -key ROOT_CA_PRIVATEKEY.key -out ROOT_CA_CSR.csr
无交互模式
openssl req -new -sha256 -key ROOT_CA_PRIVATEKEY.key -out ROOT_CA_CSR.csr -subj "/C=CN/ST=AceSheep/L=AceSheep/OU=ALL/O=AceSheep Blog/CN=Only Copy CA"
配置 CA 根证书扩展
创建 CA 根证书的配置文件 很重要!! 不然苹果这样严格的设备不会识别为 CA 根证书
创建配置文件 ROOT_CA.cnf
# vim ROOT_CA.cnf
basicConstraints=critical,CA:TRUE
nsComment = "This Root certificate was generated by AceSheep Blog"
keyUsage=critical, keyCertSign
subjectKeyIdentifier=hash
创建根证书
运行以下命令生成根证书。稍后你将使用此证书来为服务器证书签名
openssl x509 -req -sha256 -days 36500 -extfile ROOT_CA.cnf -in ROOT_CA_CSR.csr -signkey ROOT_CA_PRIVATEKEY.key -out ROOT_CA_CERT.crt
文件结构
到这一步我们得到了自定义 CA 根证书
.
├── ROOT_CA.cnf
├── ROOT_CA_CERT.crt
├── ROOT_CA_CSR.csr
└── ROOT_CA_PRIVATEKEY.key
创建服务器证书
接下来, 使用 OpenSSL 创建服务器证书。原理如下: 首先生成私钥和证书签名请求 (CSR), 然后使用 CA 根证书对 CSR 进行签名, 生成最终的证书 (.crt
文件)
生成私钥和 CSR 文件
根据不同设备支持的加密算法选择适合的加密方式。这里使用 IP: 192.168.0.1
作为演示
ECDSA (ECC 算法) P-256
ECC (椭圆曲线密码学) 是一种高效的加密方式, 适合较为现代的设备。P-256 是较为常见的曲线, 适用于许多现代设备和应用程序, 具有较好的性能和安全性
openssl ecparam -out 192.168.0.1.key -name prime256v1 -genkey
openssl req -new -subj "/C=CN/ST=AceSheep/O=AceSheep/OU=LAN/CN=192.168.0.1" -key 192.168.0.1.key -out 192.168.0.1.csr
ECDSA (ECC 算法) P-384
P-384 是一种较强的加密方式, 提供更高的安全性, 适用于需要更高安全要求的设备。虽然它的计算资源消耗比 P-256 更高, 但仍然是许多现代设备支持的有效算法
openssl ecparam -out 192.168.0.1.key -name secp384r1 -genkey
openssl req -new -subj "/C=CN/ST=AceSheep/O=AceSheep/OU=LAN/CN=192.168.0.1" -key 192.168.0.1.key -out 192.168.0.1.csr
RSA 2048-bit
RSA 是一种传统的加密算法, 广泛应用于嵌入式设备及老旧设备中。如果设备不支持 ECC, 可以选择 RSA, 尤其是对某些较旧或资源有限的设备, 虽然最低推荐为 RSA 3072-bit
, 可能只有 RSA 2048-bit
加密才有支持
openssl req -newkey rsa:2048 -nodes -subj "/C=CN/ST=AceSheep/O=AceSheep/OU=LAN/CN=192.168.0.1" -keyout 192.168.0.1.key -out 192.168.0.1.csr
使用 CA 根证书签发证书
配置扩展文件
在使用 CA 根证书签发证书时, 配置文件的设置非常重要。如果配置不当, 浏览器可能仍会提示连接不安全, 显示错误信息: NET::ERR_CERT_COMMON_NAME_INVALID
为了避免这个问题, 需要特别注意域名或 IP 地址的配置
在配置文件中, 必须将需要签发的域名或 IP 地址明确填写到 [alt_names]
部分
[alt_names]
: 用于指定域名 (DNS) 和 IP 地址, 确保证书能够匹配多个名称DNS.x
: 填写需要支持的域名IP.x
: 填写需要支持的 IP 地址
创建配置文件 ssl.cnf
vim ssl.cnf
内容如下
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1= localhost
DNS.2= localhost.loacl
DNS.3= ...
IP.1 = 192.168.0.1
IP.2 = 192.168.0.2
IP.3 = ...
签发证书
证书有效期最长为 13 个月 (398 天), 大于这个时间浏览器会显示不安全。
首次创建证书并生成序列号文件
openssl x509 -req -CA ROOT_CA_CERT.crt -CAkey ROOT_CA_PRIVATEKEY.key -CAcreateserial -days 398 -sha256 -extfile ssl.cnf -in 192.168.0.1.csr -out 192.168.0.1.crt
重新签发证书的正规方式
为了确保每个证书的唯一性, 在重新签发证书时需要使用首次创建的序列号文件。以下是正确的操作步骤
首次签发时创建序列号文件
在第一次创建证书时, 使用 -CAcreateserial
参数生成序列号文件。例如
openssl x509 -req -CA ROOT_CA_CERT.crt -CAkey ROOT_CA_PRIVATEKEY.key -CAcreateserial -days 398 -sha256 -extfile ssl.cnf -in 192.168.0.1.csr -out 192.168.0.1.crt
此时, 会生成一个默认的序列号文件, 例如 ROOT_CA_CERT.srl
保存序列号文件
将生成的序列号文件重命名并妥善保存, 以便后续更新证书时使用
mv ROOT_CA_CERT.srl 192.168.0.1.srl
重新签发证书时使用相同的序列号文件
在更新或重新签发证书时, 需要指定之前保存的序列号文件, 确保证书的唯一性
openssl x509 -req -CA ROOT_CA_CERT.crt -CAkey ROOT_CA_PRIVATEKEY.key -CAserial 192.168.0.1.srl -days 398 -sha256 -extfile ssl.cnf -in 192.168.0.1.csr -out 192.168.0.1.crt
注意事项
- 确保序列号文件对应正确的域名或 IP 地址
- 切勿随意删除或覆盖序列号文件, 否则可能导致证书验证问题
-CAserial
参数用于指定序列号文件, 而不再使用-CAcreateserial
验证证书
验证签发的证书是否可信
$ openssl verify -CAfile ROOT_CA_CERT.crt 192.168.0.1.crt
192.168.0.1.crt: OK
输出 OK
表示证书有效
完成以上步骤后, 将根证书安装到客户端设备, 所有由其签发的证书将被自动信任
原文
使用自定义根 CA 生成 Azure 应用程序网关自签名证书
openssl-x509, x509 - Certificate display and signing utility
x509v3_config - X509 V3 certificate extension configuration format
本地建立CA签发数字证书
创建自签名SSL证书