愚人节不搞事-喂,https,我要服务,全套的

洗脱罪名

开了博客之后,连不更博都有罪恶感了,哇!我不是一条称职的咸鱼。

临近毕业,就因为毕设的事情忙起来。唉,毕设这个事情怎么说。其实难度没有那么高,真的要做的话,是不会做太久的。可是,问题就在于,咸鱼只想每天咸着。不管说是懒癌,还是怠惰,还是拖延症,每天就这么拖着了。于是,连博客也拖着了。

想着再这么拖下去,怕是要废站了。因此,抱着我今天就算是水也要水一篇的想法,记录一下建站时上SSL的一些微小的工作。

HTTPS

选择SSL证书的时候,没有多想,对于第一次做个人网站的萌新来说,肯定要先上手一个免费的试试,所以选择了Let’s Encrypt,免费,90天有效期。
我上https的时候,是手动生成Let’s Encrypt证书的。直到后来想要解决自动续期问题时,才发现了官方的自动化工具-Certbot。

Certbot

Certbot是一个易于使用的自动客户端,可为Web服务器提取和部署SSL / TLS证书。官网中给出了使用Certbot的详细步骤。不过自己部署的时候并没有完全按照官方文档的步骤,因此想稍作分享。以Debian8和nginx为例。

Certbot安装

首先需要添加Backports包。Backports是Debian下测试的重新编译的包。修改sources.list,添加一行:

deb http://ftp.debian.org/debian jessie-backports main

然后运行apt-get update

更新之后,安装Certbot:

$ sudo apt-get install certbot -t jessie-backports

生成证书

创建配置文件:

$ sudo mkdir /etc/letsencrypt/configs

$ sudo vim /etc/letsencrypt/configs/example.com.conf

配置文件的内容如下:

1
2
3
4
5
6
7
8
\# 替换域名和邮箱
domains = example.com
rsa-key-size = 2048
email = your-email@example.com
text = True
\ 路径改为网站的目录位置
authenticator = webroot
webroot-path = /var/www/example`

一切就绪之后,运行certbot:

$ sudo certbot -c /etc/letsencrypt/configs/example.com.conf certonly

成功运行之后,服务器所需要的证书都生成好了。他们会被放在/etc/letsencrypt/live/example.com下,包括cert.pem, privkey.pem, chain.pem, fullchain.pem.

Nginx配置

nginx的默认配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
server {  
listen 80 default_server;
listen [::]:80 default_server;
# Redirect all HTTP requests to HTTPS with a 301 Moved Permanently response.
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
# certs sent to the client in SERVER HELLO are concatenated in ssl_certificate
ssl_certificate /path/to/signed_cert_plus_intermediates;
ssl_certificate_key /path/to/private_key;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
# Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
ssl_dhparam /path/to/dhparam.pem;
# intermediate configuration. tweak to your needs.
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
ssl_prefer_server_ciphers on;
# HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)
add_header Strict-Transport-Security max-age=15768000;
# OCSP Stapling ---
# fetch OCSP records from URL in ssl_certificate and cache them
ssl_stapling on;
ssl_stapling_verify on;
## verify chain of trust of OCSP response using Root CA and Intermediate certs
# ssl_trusted_certificate /path/to/root_CA_cert_plus_intermediates;
resolver <IP DNS resolver>;
....
}

重点只需要关注其中几行,下面一一说明。

ssl_certificatessl_certificate_key分别对应fullchain.pem和privkey.pem,填上正确的路径就OK了。

ssl_dhparam通过下面命令生成:

$ sudo openssl dhparam -out /path/ssl/dhparam.pem 2048

放在哪个文件夹可以随自己的喜好,我一般都是放在/etc/ssl下。

然后说明一下ssl_trusted_certificate,这是一个可选部分,根据nginx官方所说,ssl_certificate已经包含了,所以不需要再提供,因此注释掉。

至于resolver,是填写DNS服务器的,我直接忽略了,有没有影响倒是没有细究。

配置完之后重启nginx就可以看到网站的HTTPS了。

自动续期

之前看过相关的博客,都是自己写脚本实现自动续期。而Certbot官方文档中说明了Certbot支持自动续期的功能,因此直接使用就好了。

# certbot renew --dry-run

到此就完成了HTTPS的配置。

Tips

不同的linux版本,不同的应用,部署的步骤都不一样,Certbot官方上都标注了。总得来说,Certbot支持Apache、Nginx、Haproxy、Plesk,支持大部分的linux版本。

参考博客

Let’s Encrypt 给网站加 HTTPS 完全指南