现在局域网的设备越来越多了,webui 默认都是使用ssl 进行连接的. 但是总是会提示不安全, 忽略之后能用吧但是浏览器重启之后又会重置提示. 如果是选择信任单独的证书, 维护起来也很麻烦. 所以有了这份笔记. 首先自定义一个CA证书, 再由这个CA证书颁发给局域网的设备. 这样我只需要信任这个根证书所有的签发的证书都会被信任. 自签主要是为了局域网IP.
本文介绍如何执行以下操作:
- 创建自己的自定义证书颁发机构
- 创建由自定义 CA 签名的自签名证书
先决条件
- 在运行 Windows 或 Linux 的计算机上安装 Windows OpenSSL, 一般下载 Win64 OpenSSL v1.1.1k Light 版本就足够使用了
本教程将使用 OpenSSL,不过,其他工具可能也可用于证书管理。 你可能会发现,许多 Linux 分发版(如 Ubuntu)中已捆绑 OpenSSL。WSL2 (我死了啊) 这样的子系统也是可以使用的.
分为两个步骤:
- 创建根 CA 证书
- 使用根 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证书