Nginx配置SSL使用Let’s Encrypt免费为网站开启https,本文介绍服务器配置教程如何在nginx 服务器上使用免费的Let’s Encrypt 凭证,提供HTTPS 的安全加密网页。
Let’s Encrypt是一家新的证书颁发机构(Certificate Authority,简称CA),其提供免费的TLS/SSL凭证再配合Certbot这个自动化工具,让一般的网站可以很容易地使用HTTPS的安全加密网页,设定很简单,凭证的更新也可以自动处理。
以下我以Ubuntu Linux 14.04 的系统为例,ubuntu nginx配置ssl,示范nginx 伺服器使用Let’s Encrypt 凭证设定HTTPS 安全加密网页的方法。
下载Let’s Encrypt SSL 凭证
Let’s Encrypt 的凭证可以透过官方建议的Certbot 自动化工具来下载,以下是操作步骤。
STEP 1
从Certbot官方网站下载certbot-auto
指令稿,并设定其执行权限:
wget https://dl.eff.org/certbot-auto chmod a+x certbot-auto
certbot-auto
要放在哪里都可以,建议一开始就找一个适合的地方放好,例如建立一个/opt/letsencrypt
目录,把certbot-auto
放在这里:
mkdir /opt/letsencrypt mv certbot-auto /opt/letsencrypt/
STEP 2
执行certbot-auto
,让它自动安装所有相依套件:
/opt/letsencrypt/certbot-auto
执行certbot-auto
时,会需要输入密码取得root权限。
STEP 3
安装完成所有需要的系统套件后,接着我们要透过webroot
的方式,使用既有的nginx网页伺服器来向Let’s Encrypt取得凭证,而在认证的过程会需要在网页根目录中建立一个.well-known/acme-challenge/
目录,让Let’s Encrypt的伺服器来读取其中的内容。
一般的nginx伺服器通常会设定把句点开头的隐藏档案都挡掉,遇到这样的状况就会无法进行认证,这时候可以再加一小段设定,让.well-known/acme-challenge/
目录可以被正常读取:
location ^~ /.well-known/acme-challenge/ { # the usual settings } location ~ /. { deny all; }
STEP 4
使用certonly
功能下载凭证:
/opt/letsencrypt/certbot-auto certonly --webroot -w /var/www/blog.gtwang.org/ -d blog.gtwang.org -d gtwang.org
STEP 5
输入自己的Email 信箱。
STEP 6
阅读使用条款,选择「Agree」继续。
STEP 7
下载完成后,会出现类似这样的成功讯息。
IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/blog.gtwang.org/fullchain.pem. Your cert will expire on 2016-08-13. To obtain a new version of the certificate in the future, simply run Certbot again. - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le
这样就成功取得Let’s Encrypt的凭证了,而nginx用的凭证就储存在/etc/letsencrypt/live/blog.gtwang.org/
目录之下,其中fullchain.pem
就是nginx需要凭证,而privkey.pem
则是需要保护好的私钥,关于凭证档案的详细说明,请参考Certbot的说明文件。
Certbot还有提供另外一个
standalone
的方式来向Let’s Encrypt取得凭证,这种方式是由Certbot建立一个独立的网页伺服器,提供Let’s Encrypt读取验证用的资料,不过这样的做法需要绑定80
或443
连接埠,所以通常还会需要暂停既有的网页伺服器,对于一般的网站而言,会造成网站有几秒钟的断线现象,所以我个人不喜欢这样的方式。
接下来要设定nginx 伺服器,使用这个新凭证来提供HTTPS 的安全加密网页。
Nginx配置SSL
要让nginx 启用HTTPS 安全加密网页,只要加上SSL 相关的几行设定即可,ubuntu nginx配置ssl,其余的设定保持不变,以下是我个人使用的nginx 伺服器设定:
server { #倾听HTTPS标准埠号443 listen 443; #同时启用IPv6的HTTPS安全加密网页 listen [::]:443; server_name blog.gtwang.org; root /var/www/blog.gtwang.org/; index index.php index.html index.htm; #启用SSL ssl on ; #设定SSL凭证 ssl_certificate /etc/letsencrypt/live/blog.gtwang.org/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/blog.gtwang.org/privkey.pem; #其他SSL选项 ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # omit SSLv3 because of POODLE (CVE-2014-3566) 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 ; # ... }
ssl_protocols
的部分记得要把SSLv3拿掉,ubuntu nginx配置ssl,避免POODLE攻击(CVE-2014-3566)。
如果不想自己写Nginx的设定档,也可以使用Mozilla所提供的Mozilla SSL Configuration Generator设定档产生工具。
设定好之后,检查一下设定档是否正确:
service nginx configtest
确认无误之后,重新载入设定档:
service nginx reload
这样就完成nginx 伺服器的设定了,接着就可以开启HTTPS 加密的网址来测试了,正常来说,使用Google Chrome 浏览器开启自己主机的HTTPS 加密网址,应该就会显示一个绿色的锁头,这样就代表我们安装的SSL 凭证是有效的。
如果想要检视凭证的内容,可以点击网址列的绿色锁头,里面可以看到凭证的详细资料。
另外也可以使用Qualys的SSL伺服器测试工具来检测。
自动更新SSL 凭证
Let’s Encrypt的凭证使用期限只有三个月,在凭证到期前的一个月可以使用certbot-auto
来更新凭证,在实际更新之前我们可以加入--dry-run
参数,先进行测试:
/opt/letsencrypt/certbot-auto renew --dry-run
若测试没问题,就可以使用正式指令来更新:
/opt/letsencrypt/certbot-auto renew --quiet --no-self-upgrade
而为了方便起见,可以将这个更新指令写在/opt/letsencrypt/renew.sh
指令稿中:
#!/bin/sh /opt/letsencrypt/certbot-auto renew --quiet --no-self-upgrade --post-hook " service nginx reload "
这里我又加上一个--post-hook
的设定,让凭证更新完后,可以自动重新载入nginx伺服器的设定,让凭证生效。
接着把这个/opt/letsencrypt/renew.sh
指令稿写进crontab中:
# mh dom mon dow command 30 2 * * 0 /opt/letsencrypt/renew.sh
官方的建议是这个指令可以一天执行两次,让伺服器的凭证随时保持在最新的状态,这里我是设定让伺服器每周日凌晨两点半进行凭证的检查与更新,Certbot 只有在凭证到期前一个月才会进行更新,如果凭证尚未到期,就不会更新。
转载文章,原文链接:https://blog.gtwang.org/linux/secure-nginx-with-lets-encrypt-ssl-certificate-on-ubuntu-and-debian/