How do we apply SSL certificates for free

在之前的文章中我们已经提到过SSL的功能和其重要性。特别是Google已经在它的Chrome Version 68中把HTTP链接全部标识为不安全,给自己的网站部署SSL可以说迫在眉睫。但是对于大部分用户,特别是个人用户,好像没有必要花钱买一个证书,毕竟一张证书的价格可能已经比Hosting的价格还要贵了。

Google有理由强推HTTPS的理由就是Let’s Encrypt,因为所有人都可以通过它来获取免费的证书。

Let’s Encrypt 提供免费的DV证书,支持多域名,支持通配符,支持ECC。在我看来唯一的问题就是有效期太短,Let’s Encrypt的证书有效期只有三个月。网上有很多教程和工具可以在服务器端自动生成/续约Let’s Encrypt的SSL证书,今天我要demonstrate的是如何通过工具在本地生成SSL证书,手动配置到服务器或者在本地测试。

本文会使用ZeroSSL来申请证书,你问为什么用它?主要是因为它颜值高……

网页端申请

Initiate the Request

打开ZeroSSL主页之后基本上就是一路点击Next就可以生成:

CSR - Certificate Signing Request

Account Key - Let’s Encrypt 需要这个key来sign API Request

output_N2Sv9l

Modify DNS Record

这一步就需要登录到域名的DNS Management来做。笔者这里用Alicloud来演示

添加一个TXT记录,按照要求填入信息

Host Name : _acme-challenge.aufomm.win

Value : 8rH21vKs3cuoeRNsEF8teBBjWw2t6YqIyqBKmU9SgjA

TTL : 默认设置即可

zero10

把两个value都添加进去之后,稍等片刻就可以回到ZeroSSL的页面继续了

zero11

Verification

点击Next之后,系统会自动去查DNS的记录zero12

如果成功查到对应的TXT值,证书就完成了。

zero13

接下来我们就可以下载私钥和证书文件使用。

zero14

下面这个方法我更推荐一些,因为私钥和CSR的生成都在本地,因此安全性更有保证。而且每一步都可以自己掌控,因此更加清楚到底是在做什么。

在ZeroSSL下载工具

output_VcSNhe

解压缩文档打开cmd,然后来到这个文件夹

Snap21

分别生成Account Key和证书的私钥
1
2
3
4
5
6
7
8
9
10
11
openssl genrsa -out mydomain.key 2048
Generating RSA private key, 2048 bit long modulus
...............+++
..............................................................+++
e is 65537 (0x010001)

openssl genrsa -out account.key 4096
Generating RSA private key, 2048 bit long modulus
...............+++
..............................................................+++
e is 65537 (0x010001)
生成CSR
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
openssl req -new -key mydomain.key -out mydomain.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:AU
State or Province Name (full name) [Some-State]:Victoria
Locality Name (eg, city) []:Melbourne
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Aufomm
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:www.aufomm.win
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
开始证书的申请

详细的使用手册可以参考ZeroSSL的Usage页面

1
2
3
4
5
6
7
8
9
10
11
le64.exe --key account.key --csr mydomain.csr --csr-key mydomain.key --crt mydomain.crt --domains "www.aufomm.win" --generate-missing --handle-as dns --live --api 2
2018/08/23 18:35:38 [ ZeroSSL Crypt::LE client v0.31 started. ]
2018/08/23 18:35:38 Loading an account key from account.key
2018/08/23 18:35:38 Loading a CSR from mydomain.csr
2018/08/23 18:35:42 Registering the account key
2018/08/23 18:35:43 The key is already registered. ID: ****
2018/08/23 18:35:43 Make sure to check TOS at https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf
Challenge for 'www.aufomm.win' requires the following DNS record to be created:
Host: _acme-challenge.www.aufomm.win, type: TXT, value: hsiAudq0p2Uq7nGHLsIT6D7pLCyLYNCWvnPKjpEpP-k
Wait for DNS to update by checking it with the command: nslookup -q=TXT _acme-challenge.www.aufomm.win
When you see a text record returned, press <Enter>
添加DNS记录

跟上面一样,在DNS里面加入DNS的值,需要注意的是,这里只需要我们加在*_acme-challenge.www.aufomm.win* 这个位置就可以了

Snap22

Verification
1
2
3
4
5
6
7
2018/08/23 18:41:07 Processing the 'dns' verification for 'www.aufomm.win'
2018/08/23 18:41:07 Domain verification results for 'www.aufomm.win': success.
2018/08/23 18:41:07 You can now delete '_acme-challenge.www.aufomm.win' DNS record
2018/08/23 18:41:07 Requesting domain certificate.
2018/08/23 18:41:09 Requesting issuer's certificate.
2018/08/23 18:41:09 Saving the full certificate chain to mydomain.crt.
2018/08/23 18:41:09 The job is done, enjoy your certificate! For feedback and bug reports contact us at [ https://ZeroSSL.com | https://Do-Know.com ]

就是这么简单,我们就申请到了免费的SSL证书。

One thing more

Let’s Encrypt证书上签发的域名严格按照CSR里DNS来生成。如果生成CSR的时候里面只有www的域名,那么base domain是不会包括在证书里面的。但是用在线版生成证书的时候,网页会自动把base domain添加到CSR里面,因此在线版验证的时候需要添加两个DNS记录。

根据这个原理,在使用桌面版的时候我们需要在生成CSR的时候就把所有需要的域名添加进去,然后就是重复上述步骤申请证书,添加DNS记录验证后即可。

至于如何在CSR里面添加SANs,请看本文