LabHub
学习 学习路径 课程

Tomcat 与 nginx 运维

用私有 CA 签发证书并应用到 nginx

在 LabHub 中继续学习

目标

创建私有CA,签发包含SAN的服务器证书,并配置链文件 在nginx上应用HTTPS,甚至可以制作到过期监控脚本。

为什么重要

认证证书故障的大部分不是密码学,而是链条缺失和过期两种。 如果忘记中间认证书,在浏览器上可以正常运行,但在关联的对方系统上就会失败。 浏览器会缓存或自动接收中间证书,但服务器间HTTP客户端 因为不会那样做。“开发者PC上可以”是这种症状的典型。 而且即使没有提前通知,到期也不会突然到来,但由于负责人更换和通知遗漏,每年都会发生事故。 用私人CA直接制作一次的话,这个结构就会留在手里。

阶段

  1. /root/ng/tls创建目录并设置RSA 2048位个人密钥 /root/ng/tls/server.key生成。
  2. 用那个基数制作CSR/root/ng/tls/server.csr保存为。 主体是CN=labhub.localO=LabHubC=KR必须包含。
  3. 创建私人CA。/root/ng/tls/ca.key/root/ng/tls/ca.crt. CA认证书的主体是CN=LabHub Root CA并且有效期为3650天以上basicConstraintsCA:TRUE必须去。
  4. 用CA签署CSR/root/ng/tls/server.crt制作。 在SAN上DNS:labhub.localIP:127.0.0.1所有这些都要进去, 发行者(issuer)必须与CA的主体相同。
  5. /root/ng/tls/fullchain.pem制作。 按照服务器证书→CA证书的顺序连在一起,文件中必须有2个正确的证书。 openssl verify -CAfile ca.crt server.crt必须成功。
  6. 在nginx中添加8443端口HTTPS服务器块。 ssl_certificate是fullchain,ssl_certificate_key是server.key, ssl_protocolsTLSv1.2 TLSv1.3只允许。 openssl s_client -connect 127.0.0.1:8443 -CAfile /root/ng/tls/ca.crt对结果 Verify return code: 0这个必须出来。
  7. 8088端口的所有请求https://将重定向到301curl -s -o /dev/null -w '%{http_code} %{redirect_url}' http://127.0.0.1:8088/x 结果是301是的,重定向URL是https://以开始8443必须包含。
  8. /root/ng/certcheck.sh制作。两个因子(인증서파일 임계일수接受) 如果剩余的有效期比临界日期,则终止代码为0。 如果在临界日数内即将到来,则以不是0的终止代码结束。 如果没有认证文件,果然不应该是0,而是应该以终止代码结束。

参考

生成服务器个人密钥

/root/ng/tls创建目录并设置RSA 2048位个人密钥 /root/ng/tls/server.key生成。

RSA 2048位仍然是标准的选择。请同时掌握确认生成的密钥是否正常使用的openssl子命令。

CSR生成

用那个基数制作CSR/root/ng/tls/server.csr保存为。 主体是CN=labhub.localO=LabHubC=KR必须包含。

CSR的主体信息可以一次性输入为-subj。国家代码为两个字母大写。

制作私人CA

创建私人CA。/root/ng/tls/ca.key/root/ng/tls/ca.crt. CA认证书的主体是CN=LabHub Root CA并且有效期为3650天以上basicConstraintsCA:TRUE必须去。

CA证书必须与普通服务器证书不同。请确认哪些扩展标记为CA。在openssl req中指定-x509,会生成自签名证书。

用CA签署服务器证书

用CA签署CSR/root/ng/tls/server.crt制作。 在SAN上DNS:labhub.localIP: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_protocolsTLSv1.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://将重定向到301curl -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秒”的终止代码。监控脚本使用这个的话不需要解析日期。