Linux系统下配置nginx启用Let’s encrypt的免费SSL证书

鉴于现在越来越多的网站已启用HTTPS,且HTTPS在保护用户隐私,防止流量劫持方面能发挥着非常关键的作用,加上现在各大搜索引擎对HTTPS站点也更加友好了,最主要的是打开你的站点有个绿色小锁会显的更加的酷,所以打算对我的小站启用全站HTTPS!

本教程配置nginx启用HTTPS协议使用的是Let’s Encrypt的免费SSL证书,Let’s Encrypt是国外一个公共的免费SSL项目,由 Linux 基金会托管,它的来头可不小,是由Mozilla、Cisco、Akamai、IdenTrust、EFF等组织人员发起,主要的目的也是为了推进网站从HTTP向HTTPS过度的进程,目前已经有越来越多的商家加入和赞助支持。

一、通过git下载letsencrypt代码到/opt/letsencrypt目录,若没有git,请先安装git,相关命令如下:

二、暂时停止nginx服务以释放443端口,因为后面运行letsencrypt-auto命令时此命令会占用443端口进行验证。
root@www-itkylin-com:/opt/letsencrypt# service nginx stop

三、运行letsencrypt-auto命令
root@www-itkylin-com:/opt/letsencrypt# ./letsencrypt-auto certonly –standalone

注,若执行./letsencrypt-auto certonly –standalone命令时出错,有时是因为网络问题或机器性能等问题,所以你可以多试几次!
在执行过程中,会卡在’Installing Python packages’,请等待一段时间,让程序下载phthon lib,若机器性能原因导致失败,也有可能是因为系统的swap分区太小的原因,你可以手动增加swap,相关教程请参考文章“在Linux系统下增加swap文件”。

执行./letsencrypt-auto certonly –standalone命令之后若没有出现错异常退出则会提示好下信息:
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices) (Enter ‘c’ to cancel): 此处填你的email联系地址

——————————————————————————-
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf. You must agree
in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
——————————————————————————-
(A)gree/(C)ancel: A <–输入A同意

——————————————————————————-
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let’s Encrypt project and the non-profit
organization that develops Certbot? We’d like to send you email about EFF and
our work to encrypt the web, protect its users and defend digital rights.
——————————————————————————-
(Y)es/(N)o: Y <–输入Y同意

之后会提示输入域名,本例域名为www.itkylin.com,若有多个子域名,以空格隔开。
Please enter in your domain name(s) (comma and/or space separated) (Enter ‘c’ to cancel):www.itkylin.com

如果所有的都成功了将会看到下面的信息:

在获取到证书后,你会得到下面几个PEM-编码的文件:

cert.pem: 你域名的证书。
chain.pem: Let’s Encrypt chain 证书。
fullchain.pem: cert.pem 和 chain.pem 联合。
privkey.pem: 你证书的私有 key。

留意刚才创建的几个文件的路径这很重要,因为等下在配置服务器的时候会用到。这些文件在/etc/letsencrypt/archive目下。然而 Let’s Encrypt在/etc/letsencrypt/live/demo.itkylin.com目录下创建了相应证书的符号链接。因为这些链接总是指向最近的证书文件,所以你应该用这些路径来表示你的证书文件。

你可以用下面的命令查看已存在的证书文件(用你自己的域名替换下面的):

root@www-itkylin-com:~# ls /etc/letsencrypt/live/www.itkylin.com

它的输出应该就是之前提到的那四个证书文件。你等下可能会使用fullchain.pem来配置你的服务器作为证书,privkey.pem文件作为证书的key文件。

四、配置nginx启用TLS/SSL

现在你有了一个 SSL 证书,你需要配置服务器才能使用它。

现在你需要编辑包含你服务器块的Nginx文件。默认的位置在/etc/nginx/sites-available/default。

root@www-itkylin-com:~# vi /etc/nginx/sites-available/default
找到server代码块,注释或删掉跟80端口相关的监听代码,如:

listen 80 default_server;
listen [::]:80 default_server ipv6only=on;

将其替换为:
listen 443 ssl;

增加如下代码
server_name www.itkylin.com;
ssl_certificate /etc/letsencrypt/live/www.itkylin.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.itkylin.com/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers ‘EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH’;

这些代码能让你的服务器启用 SSL,并告诉它使用 Let’s Encrypt SSL 证书。

最后,在default文件最前面增加如下代码用来重定向所有的HTTP(80端口)到 HTTPS。

server {
listen 80;
server_name www.itkylin.com;
return 301 https://$host$request_uri;
}

因为之前执行./letsencrypt-auto certonly –standalone命令前要停止nginx释放443端口,所以现在我们要使用下面的命令重启nginx:

root@www-itkylin-com:~# service nginx restart

现在你可以打开浏览器输入https://www.itkylin.com测试HTTPS是否已在你的域名下启用了。正常情况下地址输入框前你会见到一个小绿锁,若是黄色的
点开会发现是:Verified by: Not specified
点开More Information,你会发现Technical Details段是黑体的字“Connection Partially Encrypted”,那是因为你的网站内容还有以http显示的内容,查找源码,发现首页的缩例图用的还是“http://”这样的链接,将其修改为https后刷新一下网页就会发现黄锁变回绿锁了,OK,可以了!
注:网页的http外链不会影响你的Connection Encrypted,所以无需修改为https。

五、Let’s Encrypt免费SSL证书的有效期

Let’s Encrypt的凭证有效期为90天,所以90天后要执行如下命令让它自动更新凭证:
root@www-itkylin-com:~# /opt/letsencrypt/letsencrypt-auto renew

你也可以通过certbot-auto命令让它自动更新凭证:
root@www-itkylin-com:~# /opt/letsencrypt/certbot-auto renew –quiet –no-self-upgrade

六、自动续期SSL证书

90天后早忘了这事了,虽然Let’s Encrypt会提前发邮件通知你,但还是写个脚本放crontab让它自动更新吧:
root@www-itkylin-com:~# chmod +x /opt/letsencrypt/certbot-auto
root@www-itkylin-com:~# vi /opt/letsencrypt/sslrenew.sh
#!/bin/sh
/opt/letsencrypt/certbot-auto renew –quiet –no-self-upgrade
:wq!
root@v:~#chmod +x /opt/letsencrypt/sslrenew.sh

Certbot只有在证书到期前一个月才会进行更新,如果证书还没到期,它是不会进行更新的。所以设定让服务器每周日凌晨01:05分开始自动更新。
root@www-itkylin-com:~# vi /etc/crontab
05 1 * * 0 /opt/letsencrypt/sslrenew.sh
:wq!

七、完结!