使用 OpenSSL 生成 CSR 文件以申请 SSL 证书

HTTPS 是以安全为目标的 HTTP 通道,通过 TLS 加密协议提供可信、安全的 HTTP 通信。一个网站要使用 HTTPS 协议需要以下三个步骤:

  1. 选择加密方式,生成私钥及公钥。其中公钥为 CSR (Certificate Signing Request) 文件
  2. 将生成的 CSR 提交到 CA 进行申请并验证
  3. CA 下发证书后为站点配置安装证书

本文中使用了必要工具 OpenSSL,通常 Linux / MaxOS 系统上都已经预装完成了,而 Windows 平台可以使用 WSL 或者另行寻找安装。

普通命令生成 CSR 文件

确定 OpenSSL 已经安装后,在 Shell 里输入命令生成 CSR:

1
openssl req -nodes -newkey rsa:2048 -sha256 -keyout myserver.key -out server.csr

该命令解释:
创建一个 RSA 的 2048 位私钥,并指定加密算法使用的哈希值长度为 256 位(SHA256),因为 SHA1 证书可能被伪造而出现安全风险,国际上已决定不再签发超过 2017 年的 SHA1 证书,谷歌和微软等巨头也已经淘汰 SHA1 证书并标记为不安全。在执行该命令之后会要求填写证书主题的各个字段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 填写国家代号,中国填写 CN
Country Name (2 letter code) [AU]:
# 填写省份名称
State or Province Name (full name) [Some-State]:
# 填写位置名称,比如市
Locality Name (eg, city) []:
# 填写组织名称
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
# 填写组织单位名称
Organizational Unit Name (eg, section) []:
# 填写你的域名如 abc.example.com (注:如果要申请泛域名证书记得填的是 *.你的域名 )
Common Name (e.g. server FQDN or YOUR name) []:
# 填写邮件地址
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
# 密码(可不填)
A challenge password []:
# 填写公司名称(可不填)
An optional company name []:

对于填写域名字段需要注意,通常签发 www.example.com 的证书的 DNS Name 里会包含根域 example.com,但申请二级域名诸如 abc.example.com 的话就不会包含根域了。如果需要泛域名证书,则需要填写 *.example.org

填完上述信息后会在当前目录生成 myserver.keyserver.csr 文件 ,其中 server.csr 里面的内容是提交给证书颁发机构的。而 myserver.key 文件是私钥,存放在自己的服务器上的,需要妥善保管。

到这里 CSR 的生成已经完成了,接下来就是向CA提交 CSR 了。对于普通的 DV(域名验证) SSL 证书 只需要保证 CN(Common Name) 字段填上你的域名即可。至于高级的 OV(组织验证),EV(扩展验证)证书都需要向 CA 提交相关资料以验证证书字段内容的真实性。

简化版命令生成 CSR 文件

如果申请的证书为普通的 DV SSL 证书,可以尝试使用以下简化版命令省去填写字段的过程:

1
openssl req -nodes -newkey rsa:2048 -sha256 -keyout server.key -subj "/CN=example.org" -out server.csr

该命令解释:
创建一个 RSA 的 2048 位私钥并在当前目录保存为 server.key 并生成一个域名为 example.org 的 CSR 并保存为 server.csr.一般这样生成的 CSR 即可用于申请大多数 CA 的数字证书。如果该 CSR 不能通过 CA 的申请流程,需要用正常命令生成。