跳转到主要内容

使用 Openssl 生成多域名/泛域名 CSR

CSR 即 Certificate Signing Request 证书签名请求,在你申请 SSL 证书时需要先生成。它包含证书所需的必要信息,例如组织名称、域名、地区和国家/地区。

当然现在也有一键申请什么的,不需要写 CSR,甚至不支持 CSR 但是它同时帮你生成了公私钥,而你对此毫无掌控,你觉得这真的安全吗?
但自签名证书同样可以使用此方法。

 

请求配置文件

首先我们需要写一个 req.conf 请求配置文件,名称随意。

[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no
[req_distinguished_name]
countryName = 国家名称(2 个字母代码)
stateOrProvinceName = 州或省名称(全名)
localityName = 地区名称(例如城市名)
organizationName = 组织名称
organizationalUnitName = 组织内部部门名称
commonName = 你的完全限定域名
emailAddress = 电子邮件地址
[v3_req]
subjectAltName = @alt_names
[alt_names]
DNS.1 = 别名1
DNS.2 = 别名2
DNS.3 = 别名3

将代码块中的中文部分替换为你想要的。
如果是多域名则在 [alt_names] 部分填上你想要的多个域名
如果是泛域名则在 [alt_names] 填上 *.你的域名你的域名

这是我的泛域名例子:

[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no
[req_distinguished_name]
countryName = CN
stateOrProvinceName = Mars
localityName = Mars
organizationName = Project Halcyon
organizationalUnitName = IT
commonName = *.pha.pub
emailAddress = admin@pha.pub
[v3_req]
subjectAltName = @alt_names
[alt_names]
DNS.1 = *.pha.pub
DNS.2 = pha.pub

当然写这么多不一定有用,因为你的 CA 机构可能不会接受所有参数。
文件的具体内容可以参考 OpenSSL 文档(不全)IBM 文档


公钥算法

选择一个执行,目前最安全的应该是 ECDSA_P384。

ECDSA_P256

生成一个使用 prime256v1(P-256)曲线的 EC 参数文件:

openssl ecparam -name prime256v1 -out ecparam.pem

从 req.conf 中读取设置,并使用参数文件生成秘钥和 CSR 文件:

openssl req -new -SHA256 -newkey ec:ecparam.pem -nodes -keyout private.key -out csr.csr -config req.conf

使用此配置最终你会得到一个 ECDSA_P256 的证书。

ECDSA_P384

生成一个使用 secp384r1(P-384)曲线的 EC 参数文件:

openssl ecparam -name secp384r1 -out ecparam.pem

从 req.conf 中读取设置,并使用参数文件生成秘钥和 CSR 文件:

openssl req -new -SHA256 -newkey ec:ecparam.pem -nodes -keyout private.key -out csr.csr -config req.conf

使用此配置最终你会得到一个 ECDSA_P384 的证书。

RSA_2048

从 req.conf 中读取设置,并使用参数文件生成秘钥和 CSR 文件:

openssl req -new -SHA256 -newkey rsa:2048 -nodes -keyout private.key -out csr.csr -config req.conf

使用此配置最终你会得到一个 RSA 2048 位的证书。

RSA_4096

从 req.conf 中读取设置,并使用参数文件生成秘钥和 CSR 文件:

openssl req -new -SHA256 -newkey rsa:4096 -nodes -keyout private.key -out csr.csr -config req.conf

使用此配置最终你会得到一个 RSA 4096 位的证书。

其他具体参数请参考 Openssl 文档



结束

如果没有意外,你当前的目录就会生成:
ecparam.pem 没有用了,可以删除。
private.key 你的私钥,非常重要,妥善保管。
csr.csr 你的 CSR 文件,把它发给你的 CA 机构进行签名吧。

使用 openssl req -noout -text -in csr.csr 查看 CSR 内容是否正确。
或是使用各种 CSR 查看器 (https://myssl.com/csr_decode.htmlhttps://www.sslchecker.com/csr/decode),虽然 CSR 应当仅包含可以公开的信息,但使用在线服务时我仍然建议在确认信息正确后将相关文件删除,并使用相同参数重新生成,以避免不必要的风险。

确认正确后就可以将其发给 CA 机构进行签名了。

CA 机构签名后,将 csr.csr 删除,将 CA 机构返回给你的 SSL 证书保存为你需要的格式,例如 ssl.crt,配合 private.key 即可使用。

最后可以使用各种证书查看器( https://myssl.com/cert_decode.htmlhttps://www.sslchecker.com/certdecoder)来确认证书有效性,发送证书是安全的,永远不要发送你的 private.key