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

标签: none

现在局域网的设备越来越多了,webui 默认都是使用ssl 进行连接的. 但是总是会提示不安全, 忽略之后能用吧但是浏览器重启之后又会重置提示. 如果是选择信任单独的证书, 维护起来也很麻烦. 所以有了这份笔记. 首先自定义一个CA证书, 再由这个CA证书颁发给局域网的设备. 这样我只需要信任这个根证书所有的签发的证书都会被信任. 自签主要是为了局域网IP.

本文介绍如何执行以下操作:

  • 创建自己的自定义证书颁发机构
  • 创建由自定义 CA 签名的自签名证书

先决条件

  • 在运行 Windows 或 Linux 的计算机上安装 Windows OpenSSL, 一般下载 Win64 OpenSSL v1.1.1k Light 版本就足够使用了

本教程将使用 OpenSSL,不过,其他工具可能也可用于证书管理。 你可能会发现,许多 Linux 分发版(如 Ubuntu)中已捆绑 OpenSSL。WSL2 (我死了啊) 这样的子系统也是可以使用的.

分为两个步骤:

  1. 创建根 CA 证书
  2. 使用根 CA 证书签发证书

创建根 CA 证书

使用 OpenSSL 创建根 CA 证书。

创建根密钥

$ openssl ecparam -out ROOT_CA_PRIVATEKEY.key -name secp384r1 -genkey

可选参数如果需要较低的加密强度,可以将上面的 secp384r1 替换成 prime256v1

创建根证书并进行自签名

1.使用以下命令生成 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"

2.创建一个 CA 根证书的配置文件 很重要!! 不然苹果这样严格的设备不会识别为 CA证书

$ vim ROOT_CA.cnf

basicConstraints=critical,CA:TRUE
nsComment = "This Root certificate was generated by AceSheep Blog"
keyUsage=critical, keyCertSign
subjectKeyIdentifier=hash

3.创建根证书。 稍后你将使用此证书来为服务器证书签名。

$ 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

$ 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

$ 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, 虽然最低推荐为 3072-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 根证书为 CSR (证书签名请求) 签名

创建一个 CA 根证书的配置文件 很重要!! 不然浏览器任然会提示不安全 NET::ERR_CERT_COMMON_NAME_INVALID
需要把签发的域名或者IP地址填到 [alt_names] 里面

$ 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 天), 不然浏览器会显示不安全

不太正规的方法, 每次签发都使用 -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.10.3.crt

正规方式, 每个证书是唯一的. 重新签发也需要使用第一次创建的序列号.
第一次使用 -CAcreateserial 创建证书后保存证书序列号文件 192.168.0.1.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.10.3.crt

验证证书是否可信

$ openssl verify -CAfile ROOT_CA_CERT.crt 192.168.10.3.crt
192.168.10.3.crt: OK

剩下就是安装CA根证书, 服务器配置证书了.

原文
使用自定义根 CA 生成 Azure 应用程序网关自签名证书
openssl-x509, x509 - Certificate display and signing utility
x509v3_config - X509 V3 certificate extension configuration format
本地建立CA签发数字证书
创建自签名SSL证书


扫描二维码,在手机上阅读!

已有 2 条评论

  1. pugna pugna

    感谢分享~用你的步骤,一次就成功了

    1. 这么小众的需求, 没想到也有搜到的. 当时找这个教程好多都不能一次成功

添加新评论