因为 HTTPS 采用 SSL 加密,所以部署 HTTPS 时需要申请证书,证书的作用就是对浏览器和Web服务器双方的身份验证。
步骤1:申请证书
我们采用Let's Encrypt签发的免费证书,虽然 Let’s Encrypt 只有90天的有效期,但是可以用Certbot自动部署工具,进入Certbot 主页,可以看到下图所示。
Let's Encrypt 签发的证书有效期只有90天,甚至希望缩短到60天。有效期越短,泄密后可供监控的窗口就越短。为了支撑这么短的有效期,就必须自动化验证和签发。
因为自动化了,长远而言,维护反而比手动申请再安装要简单。
在Certbot首页选择自己的web服务器类型和操作系统,我们使用的是 nginx+CentOS6.5,选择后就会自动跳转到install页面,
注意:centos6.5默认的Python版本是2.6.6,安装Certbot需要python2.7版本,未来Certbot会对python3.x支持(Python 3.x support will hopefully be added in the future),
遇到了升级python的问题,可以参考另一篇博客:如何升级Python?
1.安装certbot
wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto
certbot-auto
执行certbot-auto命令会安装一些packages,创建虚拟环境,在创建虚拟环境的过程中,需要输入域名(提醒:用逗号或/或空格分割域名)、输入邮箱(用于急切的通知和找回丢失的key)、同意agreement、选择ssl.conf;看下面的图片
2.申请证书
申请证书有两种验证方式,一种是standalone,这种验证方式虽然也可以部署后,但是以后更新证书的时候需要重启 web 服务器;
第二种是webroot,就是在网站根目录下生成一个文件,通过访问该文件来验证,不需要重启 web 服务器。
第一种命令:./path/to/certbot-auto certonly --standalone -d example.com -d
第二种命令:./path/to/certbot-auto certonly --webroot -w /var/www/example -d example.com -d -w /var/www/baidu -d baidu.com -d (/var/www/example是网站的目录)
我用了第二种方法。执行第二种命令的过程中会有提醒,图片如下
3.测试自动生成证书是否成功
./path/to/certbot-auto renew --dry-run
4.添加定时任务自动更新证书
Since Let's Encrypt certificates last for 90 days,所以我们还是写个定时任务吧
crontab -u root -e (-u root 表示哪个用户的定时任务)
添加:* * * */3 * ./path/to/certbot-auto renew --quiet (表示每3个月执行一次)
步骤2:部署https
修改nginx的配置文件(比如在/usr/local/nginx/conf/nginx.conf),添加如下代码,然后重启nginx
# HTTPS server
# 部署HTTPS
server {
listen 443 ssl;
server_name example.com;
root /var/www/example;
ssl on;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_protocols TLSv1.2;(version1.2 is the only secure protocol version. 请参考SSL Labs: Increased Penalty When TLS 1.2 Is Not Supported)
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
}
另外还可以加入如下代码实现80端口重定向到443,代码片段如下