使用自定义 CA 根证书生成局域网 IP 自签证书

OpenSSL

现在局域网的设备越来越多了, 默认使用 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证书

最后更新于 2021-07-30
使用 Hugo 构建
主题 StackJimmy 设计