用私有 CA 签发证书并应用到 nginx
目标
创建私有CA,签发包含SAN的服务器证书,并配置链文件 在nginx上应用HTTPS,甚至可以制作到过期监控脚本。
为什么重要
认证证书故障的大部分不是密码学,而是链条缺失和过期两种。 如果忘记中间认证书,在浏览器上可以正常运行,但在关联的对方系统上就会失败。 浏览器会缓存或自动接收中间证书,但服务器间HTTP客户端 因为不会那样做。“开发者PC上可以”是这种症状的典型。 而且即使没有提前通知,到期也不会突然到来,但由于负责人更换和通知遗漏,每年都会发生事故。 用私人CA直接制作一次的话,这个结构就会留在手里。
阶段
/root/ng/tls创建目录并设置RSA 2048位个人密钥/root/ng/tls/server.key生成。- 用那个基数制作CSR
/root/ng/tls/server.csr保存为。 主体是CN=labhub.local,O=LabHub,C=KR必须包含。 - 创建私人CA。
/root/ng/tls/ca.key哇/root/ng/tls/ca.crt. CA认证书的主体是CN=LabHub Root CA并且有效期为3650天以上,basicConstraints在CA:TRUE必须去。 - 用CA签署CSR
/root/ng/tls/server.crt制作。 在SAN上DNS:labhub.local科IP:127.0.0.1所有这些都要进去, 发行者(issuer)必须与CA的主体相同。 /root/ng/tls/fullchain.pem制作。 按照服务器证书→CA证书的顺序连在一起,文件中必须有2个正确的证书。openssl verify -CAfile ca.crt server.crt必须成功。- 在nginx中添加8443端口HTTPS服务器块。
ssl_certificate是fullchain,ssl_certificate_key是server.key,ssl_protocols是TLSv1.2 TLSv1.3只允许。openssl s_client -connect 127.0.0.1:8443 -CAfile /root/ng/tls/ca.crt对结果Verify return code: 0这个必须出来。 - 8088端口的所有请求
https://将重定向到301。curl -s -o /dev/null -w '%{http_code} %{redirect_url}' http://127.0.0.1:8088/x结果是301是的,重定向URL是https://以开始8443必须包含。 /root/ng/certcheck.sh制作。两个因子(인증서파일 임계일수接受) 如果剩余的有效期比临界日期长,则终止代码为0。 如果在临界日数内即将到来,则以不是0的终止代码结束。 如果没有认证文件,果然不应该是0,而是应该以终止代码结束。
参考
- 生成键:
openssl genrsa -out server.key 2048 - CSR:
openssl req -new -key server.key -out server.csr -subj "/C=KR/O=LabHub/CN=labhub.local" - 自签CA:
openssl req -x509 -new -key ca.key -days 3650 -out ca.crt -subj "..."(CA扩展是-addext "basicConstraints=critical,CA:TRUE"可以变成) - 签名时注入SAN:创建扩展文件
openssl x509 -req ... -extfile <파일> - 确认到期:
openssl x509 -in <파일> -noout -checkend <초> - 常见的错误1:只输入CN,没有SAN,反复重复“为什么浏览器不拒绝”。
- 常见的错误2:把fullchain的顺序让CA先。服务器证书是先的。
- 常见的错误3:
-checkend把因子给“日”。是初单位。
生成服务器个人密钥
/root/ng/tls创建目录并设置RSA 2048位个人密钥
/root/ng/tls/server.key生成。
RSA 2048位仍然是标准的选择。请同时掌握确认生成的密钥是否正常使用的openssl子命令。
CSR生成
用那个基数制作CSR/root/ng/tls/server.csr保存为。
主体是CN=labhub.local,O=LabHub,C=KR必须包含。
CSR的主体信息可以一次性输入为-subj。国家代码为两个字母大写。
制作私人CA
创建私人CA。/root/ng/tls/ca.key哇/root/ng/tls/ca.crt.
CA认证书的主体是CN=LabHub Root CA并且有效期为3650天以上,
basicConstraints在CA:TRUE必须去。
CA证书必须与普通服务器证书不同。请确认哪些扩展标记为CA。在openssl req中指定-x509,会生成自签名证书。
用CA签署服务器证书
用CA签署CSR/root/ng/tls/server.crt制作。
在SAN上DNS:labhub.local科IP:127.0.0.1所有这些都要进去,
发行者(issuer)必须与CA的主体相同。
最近浏览器和库不是用CN,而是用SAN。用openssl x509签名时,扩展必须作为文件传递给SAN才能加入。
链式文件配置
/root/ng/tls/fullchain.pem制作。
服务器证书→CA证书按顺序连在一起,文件中必须有2个正确的证书。
openssl verify -CAfile ca.crt server.crt必须成功。
将服务器认证书和CA认证书粘贴在一起。顺序很重要。制作后,请用验证命令确认实际是否有信任路径。
应用nginx HTTPS
在nginx中添加8443端口HTTPS服务器块。
ssl_certificate是fullchain,ssl_certificate_key是server.key,
ssl_protocols是TLSv1.2 TLSv1.3只允许。
openssl s_client -connect 127.0.0.1:8443 -CAfile /root/ng/tls/ca.crt对结果
Verify return code: 0这个必须出来。
如果证书和密钥不匹配,nginx甚至无法启动。请指定协议,不包括被弃用的版本。
HTTP → HTTPS 重定向
8088端口的所有请求https://将重定向到301。
curl -s -o /dev/null -w '%{http_code} %{redirect_url}' http://127.0.0.1:8088/x
结果是301是的,重定向URL是https://以开始8443必须包含。
比rewrite,return更明确、更快。状态代码和Location头都必须正确。
到期监控脚本
/root/ng/certcheck.sh制作。两个因子(인증서파일 임계일수接受)
如果剩余有效期比临界日期长,则终止代码为0。
如果在临界日数内即将到来,则以不是0的终止代码结束。
如果没有认证文件的话,果然不应该是0,而是应该以结束代码结束。
openssl x509 有一个选项,可以告诉你“剩余有效期是否超过N秒”的终止代码。监控脚本使用这个的话不需要解析日期。