为什么?
受信任的 CA 通常被操作系统或类库内置,以进行 TLS 握手时的有效 CA 验证。
自签 CA 可用于测试等用途,若其使用现代方式生成,且私钥不被泄露,它的安全性将与受信任的 CA 相当。
创建 CA
在开始前,你需要确保 OpenSSL
已被正确安装。
创建 CA 的私钥
openssl genrsa -des3 -out cakey.key 2048
Code language: CSS (css)
这将为你生成 cakey.key
文件,在过程中可能提示输入密码以加密私钥,不推荐跳过该步骤。
在生成完毕后,请妥善保管该私钥,勿将其泄露。
创建 CA 的证书
通常被实际用来签发证书的 CA 被另一顶级 CA 签发(根 CA),这被称为证书链。
为简单化,我们在此创建的 CA 证书将作为根 CA 使用,不需进行额外嵌套。
openssl req -x509 -new -nodes -key cakey.key -sha256 -days 365 -out cacert.pem
Code language: CSS (css)
- -new 创建新的证书请求
- -x509 输出自签证书而不是证书请求
- -nodes 不加密
- -key 指定私钥路径
- -sha256 使用sha256哈希算法
- -days 指定证书有效天数
- -out 指定输出路径
创建证书私钥
openssl genrsa -out server.key 2048
Code language: CSS (css)
一些参数的作用在先前已描述,将不再阐述。
创建证书 CSR
openssl req -new -key server.key -out server.csr
Code language: CSS (css)
注意,使用此步骤生成的 CSR 将不携带 SAN (Subject Alternative name)。
创建带 SAN 的证书 CSR
SAN (Subject Alternative name) 用于设置证书的额外公有名,它可以是域名,甚至是IP地址。
创建带参数的 OpenSSL 配置文件
以下为配置文件示例,请根据需求自行更改。
[req]
distinguished_name = req_distinguished_name
req_extensions = req_ext
prompt = no
[req_distinguished_name]
C = C
ST = ST
L = L
O = O
OU = OU
CN = CN
[req_ext]
subjectAltName = @alt_names
[alt_names]
IP.1 = 10.10.10.10
IP.2 = 10.10.10.11
DNS.1 = www.example.com
DNS.2 = example.com
将文件保存为 server_cert.cnf
后执行下一步操作。
创建 CSR
openssl req -new -key server.key -out server.csr -config server_cert.cnf
Code language: CSS (css)
由于我们在配置文件定义 prompt=no
,也提供了 CSR 的对应信息,所以执行该命令不会输出任何内容,但生成了 CSR 文件。
签发证书
现在,我们有了自己的 CA 私钥及证书,还有对应的 CSR 申请文件,可以开始进行签发了!
带 SAN 的签发
openssl x509 -req -days 365 -in server.csr -CA cacert.pem -CAkey cakey.key -CAcreateserial -out server.crt -extensions req_ext -extfile server_cert.cnf
Code language: CSS (css)
- -CA 指定CA证书文件路径。
- -CAkey 指定CA证书私钥路径。
- -CAcreateserial 为签发证书分配
01
序列码(在后续签发同证书需替换为 -CAserial 参数,参阅此)。 - -extensions 使用指定扩展
- -extfile 指定额外文件路径
不带 SAN 的签发
openssl x509 -req -days 365 -in server.csr -CA cacert.pem -CAkey cakey.key -CAcreateserial -out server.crt
Code language: CSS (css)
额外的调试
在过程中可能出现问题,以下将额外提供一些方便的命令行以方便进行调试。
验证 CSR 信息
openssl req -noout -text -in server.csr
Code language: CSS (css)
- -noout 不输出文件
- -text 输出文字信息
验证证书信息
openssl x509 -noout -text -in server.crt
Code language: CSS (css)
大功告成
通过上述操作,你应生成以下文件。
- cakey.key CA 密钥
- cacert.pem CA 证书
- server.key 签发证书密钥
- server.csr 签发证书的证书签发请求
- server.crt 签发证书
注意,请妥善保存私钥,以防数据泄露及可能的中间人攻击。
在使用签发的证书前,你需要使系统或程序信任使用上述步骤创建的 CA,否则,TLS 握手将因无法在受信任的 CA 中找到该 CA 而不能正常工作。
0 条评论