随笔-网络-openssl制作SSL/TLS自签证书

一、基本理论

参考:理解HTTPS协议的交互过程-CSDN博客

前置条件:

服务器向正规CA机构 将自己的公钥 进行数字签名,制作出数字证书

交互流程:

主要流程1:服务端发送数字证书给客户端,证书内容包含服务器的公钥

主要流程2:客户端校验证书合法性,取得服务器公钥,以继续后面的流程

后续流程:图中描述已经很具体,见图中文字描述

要点:客户端校验证书合法性(即如何知道不是一个第三方攻击者提供的证书)?

参考:浏览器如何验证HTTPS证书的合法性? - 知乎

大致意思:

1、 浏览器或者操作系统会自带或者手动安装CA机构的公钥,收到服务器的用CA机构数字签名后的数字证书后,解析出CA机构,并找到本地对应CA机构的公钥,用找到的对应CA机构的公钥计算出Hash Value H2

2、如果是攻击者在数字签名证书将CA机构信息改成一个正规的CA机构名称,浏览器也就能解析出正规的CA机构,这样不是也能计算出正确的Hash Value H2吗

答:因为Certificate Signature是正规CA机构的私钥加密,这个私钥攻击者是没有,所以计算不出来正确的Hash Value H2

二、制作自签证书

根据上面的流程和理论,制作自签证书的步骤如下:假设域名为www.yanjiuyuan.com

大致流程:: 1、先创建一个私有CA机构;2、然后用私有CA机构为域名颁发数字证书

步骤 1: 创建私有 CA

1.1 生成 CA 私钥

openssl genrsa -out rootCA.key 1024
# openssl genpkey -algorithm RSA -out rootCA.key -aes256 # 选择不同的加密算法和长度

1.2 生成自签名的 CA 证书

使用刚才生成的私钥,创建自签名的 CA 证书。

openssl req -key rootCA.key -new -x509 -out rootCA.crt -days 3650 -subj "/C=CN/ST=Fujian/L=Fuzhou/O=My Private CA/OU=Root CA/CN=My Private CA" -sha1 -extensions v3_ca
# -key rootCA.key 使用刚才生成的 CA 私钥
# -new -x509 创建新的 X.509 自签名证书

1.3 安装根证书(Unbuntu)

cp -a rootCA.crt /usr/local/share/ca-certificates/
update-ca-certificates

步骤 2: 为 www.yanjiuyuan.com 创建证书签名请求(CSR)

在为 www.yanjiuyuan.com 创建证书之前,需要生成一个证书签名请求(CSR)。

2.1 生成私钥

openssl genrsa -out server.key 1024
# openssl genpkey -algorithm RSA -out server.key -aes256 # 选择不同的加密算法和长度

2.2 生成 CSR

openssl req -key server.key -new -out server.csr -subj "/C=CN/ST=Fujian/L=Fuzhou/O=Yanjiuyuan/OU=yanfabu/CN=www.yanjiuyuan.com"

在生成 CSR 时,-subj 参数中的 CN=www.yanjiuyuan.com 需要与将来访问该网站时的域名一致。

步骤 3: 使用私有 CA 为 www.yanjiuyuan.com 签发证书

3.1 创建证书配置文件

创建一个 OpenSSL 配置文件 openssl.cnf,其中需要包含关于 SAN(主题备用名称)的内容。SAN 允许证书支持多个域名。

[ req ]
distinguished_name = req_distinguished_name
req_extensions = v3_req

[ req_distinguished_name ]
C = CN
ST = Fujian
L = Fuzhou
O = Yanjiuyuan
OU = yanfabu
CN = www.yanjiuyuan.com

[ v3_req ]
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = www.yanjiuyuan.com
DNS.2 = yanjiuyuan.com

3.2 使用私有 CA 签发证书

使用私有 CA 签发证书,并确保它包含 SAN。

openssl x509 -req -in server.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out server.crt -days 365 -sha256 -extfile myopenssl.cnf -extensions v3_req
  • -CA rootCA.crt 上述创建的CA证书。
  • -CAkey rootCA.key 上述CA私钥签发证书。
  • -CAcreateserial 创建一个新的序列号文件。
  • -in server.csr 输入 CSR 文件。
  • -out server.crt 输出签发的证书。
  • -days 365 证书有效期设置为 1 年。
  • -extfile myopenssl.cnf -extensions v3_req 指定配置文件,添加 SAN 扩展。

步骤 4: 证书验证

4.1 验证证书链

openssl verify -CAfile rootCA.crt server.crt # 验证 `server.crt` 是否由 `rootCA.crt` 签发

4.2 检查证书的内容

openssl x509 -in server.crt -noout -text # 打印证书的详细信息,包括是否正确包含 SAN

步骤 5: 部署证书

将私钥 server.key 和证书 server.crt 部署到你的 服务器(例如 Apache 或 Nginx)中,确保使用正确的配置文件加载这些证书。

使用 openssl s_client 测试 TLS 连接(只建立 TLS 连接,不发送任何请求)

openssl s_client -connect 192.168.99.124:5067 -CAfile rootCA.crt  -showcerts

使用 curl 测试

curl -v --cacert rootCA.crt 192.168.99.124:5067
posted @   LiYanbin  阅读(481)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示