本文从HTTPS证书的四大核心流程(CA签发、域名申请、证书校验、数据加密)切入,带你彻底看懂证书安全机制。更附赠OpenSSL自签证书实操教程与自动化Shell脚本,助你快速生成支持通配符的域名证书。无论是内网开发还是测试环境,都能轻松实现HTTPS加密。
本文分为四个章节,分别从原理、实操和自动化来介绍 HTTPS 证书相关内容,文末还提供《HTTPS权威指南》电子书资源,带你深入PKI体系。
• 章节一:HTTPS证书的CA、签发、校验和数据加密流程 • 章节二:介绍如何使用OpenSSL自签证书 • 章节三:证书自动签发的shell脚本 • 章节四:电子书资源
章节一:HTTPS证书的CA、签发、校验和数据加密流程
HTTPS证书的核心流程有四个阶段,分别是 CA证书分发阶段、域名证书申请阶段、证书校验阶段和通信数据加密阶段。

公众号聊天窗口发送 【https架构】,获取高清 SVG 原图。
阶段一:CA证书分发阶段
1.1、厂商创建私钥,如 ca.key。一般基于非对称加密算法如 RSA 生成私钥,在 ca.key 文件同时包含公钥部分。
1.2、厂商基于 ca.key 和公司信息创建证书请求文件,如 ca.csr。 证书请求文件(CSR)是 CA 厂商用于申请证书的申请文件,里面包含证书的申请信息,如域名、组织、邮箱、地址以及公钥等信息。
1.3、厂商生成自签名证书 ca.crt。使用自己的私钥(ca.key)和证书请求文件(ca.csr)创建自签名证书 ca.crt。
1.4、CA厂商合规评估认证。一般会对厂商书进行合规性检查:符合WebTrust、ETSI等标准;技术审计:密钥管理、签发流程安全性;运营评估:CPS(认证实践声明)审查等。
1.5、CA厂商将 ca.crt 提交到基础软件供应商。需要提交CA根证书 (root-ca.crt),中间证书链 (intermediate-ca.crt),CP/CPS文档,审计报告,技术联系信息等。
1.6、基础软件供应商将 ca.crt 内置到浏览器或操作系统中。用户在下载安装操作系统或软件时就自带了 ca.crt。
操作系统厂商
# Linux系统信任存储
/etc/ssl/certs/ca-certificates.crt
/etc/pki/tls/certs/ca-bundle.crt
# Windows根证书存储
certlm.msc
# macOS钥匙串
/System/Library/Keychains/SystemRootCertificates.keychain浏览器厂商
Mozilla:通过CCADB(Common CA Database)
Google Chrome:使用操作系统存储 + 自有列表
Apple Safari:使用macOS信任存储阶段二:域名证书申请阶段
2.1 运维人员创建私钥 company.key。
2.2 运维人员基于 company.key 和公司信息创建证书请求文件 domain.csr。
2.3 网站公司将 domain.csr 提交给 CA 厂商申请证书。
2.4 CA厂商基于 ca.crt 给 domain.csr 中的公钥进行签名并结合公司信息生成域名证书 domain.crt。
2.5 CA厂商将签发的证书传输给网站公司。
2.6 网站公司将证书文件 domain.crt 和私钥文件 company.key 配置到服务器上,如 Nginx。
server {
listen 443 ssl;
server_name www.test.com;
ssl_certificate /data/pki/domain.crt;
ssl_certificate_key /data/pki/company.key;阶段三:证书校验阶段
3.1 用户向网站发起https请求,网站返回证书文件 domain.crt。
3.2 浏览器使用 ca.crt 对 domain.crt 进行校验。通过则安全,不通过提示证书安全弹框。
验证过程:
• a. 验证证书链:浏览器会检查服务器发送的 domain.crt(站点证书)是否能够通过一个中间证书或根证书链,最终关联到一个它内置信任的根证书。 • b. 验证数字签名:确认证书链后,浏览器会使用上一级证书(如CA的根证书或中间证书)的公钥,来解密当前证书(如domain.crt)的数字签名,得到一个哈希值(摘要)。同时,浏览器会使用相同的哈希算法对收到的证书内容重新计算,得到另一个哈希值。只有当两个哈希值完全一致时,才能证明证书在签发后没有被篡改过,且确实是由该CA签发的 • c. 校验证书内容:签名无误后,浏览器会检查证书本身的关键信息。比如域名匹配、有效期,以及用途合规等。 • d. 查询吊销状态:即使证书本身有效,浏览器还会检查它是否已被颁发机构(CA)提前吊销。这个过程通常通过查询证书吊销列表(CRL) 或使用在线证书状态协议(OCSP) 来完成。

阶段四:通信数据加密阶段
4.1 浏览器生成一个随机数(预主密钥)。浏览器生成一个随机数,作为"预主密钥";使用 domain.crt 中的公钥加密这个预主密钥;将加密后的预主密钥发送给服务器。
4.2 服务器解密预主密钥。服务器使用 domain.key 私钥解密浏览器发送的加密数据;获取明文的预主密钥。
4.3 双方生成相同的对称密钥。浏览器端:结合自己的随机数 + 服务器随机数 + 预主密钥,生成最终的对称加密密钥。服务器端:结合自己的随机数 + 浏览器随机数 + 预主密钥,生成相同的对称加密密钥。
4.4 后续通信使用对称加密。双方使用生成的对称密钥(如AES密钥)进行数据的加密和解密;所有后续的网站传输数据都基于这个对称密钥。
章节二:使用OpenSSL自签名证书
自建 CA 证书
• 创建CA的私钥
私钥在整个证书体系中极为重要,CA 厂商维护的证书私钥 KEY 是最核心的资产,如果 CA 的 KEY 泄漏了,这个 CA 厂商的安全保护能力就会判断不足以提供安全保障,操作系统和浏览器维护者就会移除他们的CA证书,这个CA机构基本离倒闭不远了,典型案例就是荷兰的DigiNota 。
如果你的应用需要面向互联网提供服务,强烈建议使用正规CA厂商来签发证书。也可以使用Let's Encrypt的免费证书,同样安全,申请方式参考永久免费的HTTPS/TLS通配符域名合法证书申请很简单,不要再自签证书啦[最佳实践]
openssl genrsa -out ca/ca.key 2048
该命令会生成 2048 位的 RSA 私钥,保存到 ca/ca.key 文件中。如果你系统对密钥长度要求较高,也可以调大。
• 创建CA的证书请求文件
证书请求文件(CSR)是 CA 厂商用于申请证书的申请文件,里面包含证书的申请信息,如域名、组织、邮箱、地址以及公钥等信息。
openssl req -new -key ca/ca.key \
-subj "/C=CN/ST=ZJ/L=HZ/O=testca.com/OU=testca/CN=testca.com/emailAddress=admin@testca.com" \
-out ca/ca.csr这个命令用于生成CA证书签名请求(CSR)文件,专门用于CA(证书颁发机构)自身的证书申请。
• C=CN:国家代码(China)• ST=ZJ:州/省(ZheJiang)• L=HZ:城市(HangZhou)• O=testca.com:组织名称• OU=testca:组织单位• CN=testca.com:通用名称(对于CA证书,这通常是CA的名称)• emailAddress=admin@testca.com:管理员邮箱• CA自签证书
CA 厂商基于 CA 私钥(ca.key)和 CA 证书签名请求(CSR)文件(ca.csr)生成 CA 自签名的证书(ca.crt)。
openssl x509 -req -in ca/ca.csr -signkey ca/ca.key -out ca/ca.crt -days 36500
days 参数为证书的有效期,越短则越安全。
到这里 CA 证书已经生成完毕,如果你也想成立一个CA公司,请保护好上述的私钥文件,对公司进行认证评估,并将CA证书提交给操作系统或浏览器厂商,然后就可以收费给其他公司签发证书了。
提交域名证书申请
域名证书由服务厂商向CA提交申请,如 DOMAIN=test.com
• 创建用户私钥文件
创建用户的私钥文件。
openssl genrsa -out ${DOMAIN}/${DOMAIN}.key 2048如果有需要也可以从RSA私钥文件中提取出公钥。
openssl rsa -in ${DOMAIN}/${DOMAIN}.key -pubout -out ${DOMAIN}/${DOMAIN}.pem• 创建域名证书请求文件
创建域名证书请求文件 CSR,包含证书的申请信息,如域名、组织、邮箱、地址以及公钥等信息。
openssl req -new -key ${DOMAIN}/${DOMAIN}.key \
-subj "/C=CN/ST=ZJ/L=HZ/O=test.com/OU=test/CN=*.${DOMAIN}/emailAddress=pritest@test.com" \
-addext "subjectAltName = DNS:*.${DOMAIN}, DNS:${DOMAIN}" \
-out ${DOMAIN}/${DOMAIN}.csr这里添加 -addext 参数,目的是为了让这个证书支持通配符域名,如 *.test.com 以及 test.com 域名。
创建好的 csr 文件需要提交给CA 厂商。
CA 签发域名证书
• 证书签发
CA厂商使用CA证书(ca.crt)给域名的请求文件(${DOMAIN}.crt)添加数字签名制作用户证书
openssl x509 -req -CA ca/ca.crt -CAkey ca/ca.key -CAcreateserial -in ${DOMAIN}/${DOMAIN}.csr -out ${DOMAIN}/${DOMAIN}.crt -days 36500CA 厂商将签发的证书传输给网站公司后,网站公司可以将这个证书与私钥部署到服务器中,如 Nginx。
• 查看证书详情
可以通过命令行参考证书详情内容,与浏览器窗口参考的内容一致
openssl x509 -in ${DOMAIN}/${DOMAIN}.crt -noout -text章节三:证书自动签发shell脚本
自动签发脚本,基于 shell 脚本实现,核心逻辑与章节二中的步骤基本一致。添加了详细的提示和描述
执行时在命令后添加域名,或者直接回车输入域名自动创建CA和签发域名证书
./make_https_crt.sh github.com
使用方法: ./make_https_crt.sh [域名]
1. 制作证书分为两个阶段,先创建CA证书, 再创建域名证书
2. 默认会在脚本所在的目录创建证书相关文件夹
3. 默认创建的证书有效期为 100 年
输入的域名是: github.com, 默认会签发 *.github.com 的证书(含 github.com 自身)
#阶段一: 创建/检查 CA 证书
在默认的 ./ca 目录中未发现证书, 创建新CA证书。共3步
(1/3)创建CA的私钥
(2/3)创建CA的证书请求文件
(3/3)CA自签证书
Certificate request self-signature ok
subject=C=CN, ST=ZJ, L=HZ, O=testca.com, OU=testca, CN=testca.com, emailAddress=admin@testca.com
CA证书创建完毕, 相关证书文件路径为:
CA私钥: /tmp/aa/ca/ca.key
CA证书请求文件: /tmp/aa/ca/ca.csr
CA证书: /tmp/aa/ca/ca.crt
#阶段二: 创建/检查域名证书
在默认域名同名的 ./github.com 目录创建域名证书。共3步
(1/3)创建用户的私钥, 并从RSA私钥文件中提取公钥
writing RSA key
(2/3)创建域名证书请求文件
(3/3)使用CA证书给域名的请求文件添加数字签名制作用户证书
Certificate request self-signature ok
subject=C=CN, ST=ZJ, L=HZ, O=test.com, OU=test, CN=*.github.com, emailAddress=pritest@test.com
域名私钥: /tmp/aa/github.com/github.com.key
域名公钥: /tmp/aa/github.com/github.com.pem
域名证书请求文件: /tmp/aa/github.com/github.com.csr
域名证书: /tmp/aa/github.com/github.com.crt
域名证书详情
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
证书的其他部分......• 自动化脚本内容
基于 shell 的自动化脚本,可以将脚本内容复制为 make_https_crt.sh 文件
#!/bin/bash
set -e
echo"使用方法: $0 [域名]"
echo"1. 制作证书分为两个阶段,先创建CA证书, 再创建域名证书"
echo"2. 默认会在脚本所在的目录创建证书相关文件夹"
echo"3. 默认创建的证书有效期为 100 年"
cd"$(dirname $0)"
DOMAIN=$1
if [ -z "$DOMAIN" ];then
read -p "请输入需要制作证书的域名: " DOMAIN
fi
echo"输入的域名是: $DOMAIN, 默认会签发 *.$DOMAIN 的证书(含 $DOMAIN 自身)"
if [ ! -x "$(command -v openssl)" ];then
echo"未检测到openssl命令, 请安装 openssl"
exit 1
fi
make_ca() {
# 添加一个空行
echo
echo"#阶段一: 创建/检查 CA 证书"
if [ -f ca/ca.crt ];then
echo" CA证书已存在, 不需要重新创建。跳过"
echo
return
fi
echo" 在默认的 ./ca 目录中未发现证书, 创建新CA证书。共3步"
mkdir ca
echo" (1/3)创建CA的私钥"
openssl genrsa -out ca/ca.key 2048
echo" (2/3)创建CA的证书请求文件"
openssl req -new -key ca/ca.key \
-subj "/C=CN/ST=ZJ/L=HZ/O=testca.com/OU=testca/CN=testca.com/emailAddress=admin@testca.com" \
-out ca/ca.csr
echo" (3/3)CA自签证书"
openssl x509 -req -in ca/ca.csr -signkey ca/ca.key -out ca/ca.crt -days 36500
echo" CA证书创建完毕, 相关证书文件路径为: "
echo" CA私钥: `pwd`/ca/ca.key"
echo" CA证书请求文件: `pwd`/ca/ca.csr"
echo" CA证书: `pwd`/ca/ca.crt"
}
make_crt(){
echo
echo"#阶段二: 创建/检查域名证书"
if [ -d "$DOMAIN" ];then
echo" 证书目录已存在, 请勿重复创建。若需重新创建, 请mv备份或删除该目录"
return
fi
echo" 在默认域名同名的 ./${DOMAIN} 目录创建域名证书。共3步"
mkdir$DOMAIN
echo" (1/3)创建用户的私钥, 并从RSA私钥文件中提取公钥"
openssl genrsa -out ${DOMAIN}/${DOMAIN}.key 2048
openssl rsa -in${DOMAIN}/${DOMAIN}.key -pubout -out ${DOMAIN}/${DOMAIN}.pem
echo" (2/3)创建域名证书请求文件"
openssl req -new -key ${DOMAIN}/${DOMAIN}.key \
-subj "/C=CN/ST=ZJ/L=HZ/O=test.com/OU=test/CN=*.${DOMAIN}/emailAddress=pritest@test.com" \
-addext "subjectAltName = DNS:*.${DOMAIN}, DNS:${DOMAIN}" \
-out ${DOMAIN}/${DOMAIN}.csr
echo" (3/3)使用CA证书给域名的请求文件添加数字签名制作用户证书"
openssl x509 -req -CA ca/ca.crt -CAkey ca/ca.key -CAcreateserial -in${DOMAIN}/${DOMAIN}.csr -out ${DOMAIN}/${DOMAIN}.crt -days 36500
echo" 域名私钥: `pwd`/${DOMAIN}/${DOMAIN}.key"
echo" 域名公钥: `pwd`/${DOMAIN}/${DOMAIN}.pem"
echo" 域名证书请求文件: `pwd`/${DOMAIN}/${DOMAIN}.csr"
echo" 域名证书: `pwd`/${DOMAIN}/${DOMAIN}.crt"
}
show_crt(){
echo
echo"域名证书详情"
openssl x509 -in${DOMAIN}/${DOMAIN}.crt -noout -text
}
main(){
make_ca
make_crt
show_crt
}
main电子
本文链接:https://kinber.cn/post/5770.html 转载需授权!
推荐本站淘宝优惠价购买喜欢的宝贝:

支付宝微信扫一扫,打赏作者吧~
