如何使用Let's Encrypt免费添加HTTPS

HTTPS需要什么

https基于RSA非对称加密算法,客户端利用公钥加密数据(准确来说是会话key),服务端利用对应的私钥来解密;由于公钥的公开性,无法保证正确性,所以引入了第三方权威机构CA来签发数字证书,数字证书中包含服务端的公钥并和私钥一起保存在服务端,客户端必须从服务端获取数字证书,然后从中取出公钥。然而,CA给站点签发数字证书通常都是收费的, 所以,支持HTTPS的站点,需要三个东西:数字证书、私钥和money。

Let’s Encrypt是什么

简单地说,Let’s Encrypt是一个免费的CA,背后有Linux基金会和facebook等知名公司撑腰,目的是加速互联网https化进程,所以大家快快用啊!于是,上面说的https需要的东西变成了两个:数字证书、私钥。下面就看看在服务端如何部署这两样东西,让别人访问我们的站点的时候也能显示出高大上的绿框框。

Linux下Nginx服务端部署Https

确保系统安装了python2.7以上的版本,因为Let’s Encrypt程序基于python编写。然后安装pip,再通过pip安装virtualenv。

$ python get-pip.py
$ pip install virtualenv

按照Let’s Encrypt官方站点的How It Works指导安装Let’s Encrypt程序包,安装过程中如果遇到一些错误或者警告,可能是上述的python环境配置不正确,需要优先确保python的配置正确性。官方指南有针对不同web server的plugin,不过这里推荐standalone模式,与web server类型无关,更加通用。

$ git clone https://github.com/letsencrypt/letsencrypt
$ cd letsencrypt
$ ./letsencrypt-auto –help
$ ./letsencrypt-auto certonly –standalone -d yuanwhy.com

生成数字证书的过程中,会要求输入邮箱,同时会检验该域名是否指向当前机器的ip,其实目的就是验证你是不是该域名的真实所有者。成功之后,会出现Congratulations!,在/etc/letsencrypt目录下生成一系列的文件,这里我们只需要关心两个东西:数字证书和私钥文件,在/etc/letsencrypt/archive/yuanwhy.com/目录下,fullchain1.pem就是数字证书,privkey1.pem 就是私钥文件,可以用cat命令查看文件内容,都是标准的Base64编码。修改nginx的配置文件,启用ssl,指明数字证书和私钥文件的地址即可,本站的配置如下

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
server {
listen 443 ssl;
server_name yuanwhy.com;

ssl_certificate /etc/letsencrypt/archive/yuanwhy.com/fullchain1.pem;
ssl_certificate_key /etc/letsencrypt/archive/yuanwhy.com/privkey1.pem;

ssl_session_cache shared:SSL:100m;
ssl_session_timeout 500m;

ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

location / {
root /usr/share/nginx/yuanwhy.com/wordpress;
index index.php;
}

location ~ \.php {
root /usr/share/nginx/yuanwhy.com/wordpress;
fastcgi_index index.php;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

如果想强制http协议访问跳转到https,配置nginx转发即可

1
2
3
4
5
server {
listen 80;
server_name yuanwhy.com;
return 301 https://$host$request_uri;
}