使用 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.key 和 server.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 的申请流程,需要用正常命令生成。