给nginx从Let's Encrypt申请个SSL证书

1个月前 (10-20) 77℃ 0条 0

时间久了
就忘记了
做个记录而已
先介绍下
Let’s Encrypt是国外一个公共的免费SSL项目,由 Linux 基金会托管,它的来头不小,由Mozilla、思科、Akamai、IdenTrust和EFF等组织发起,目的就是向网站自动签发和管理免费证书,以便加速互联网由HTTP过渡到HTTPS,目前Facebook等大公司开始加入赞助行列。

从Let’s Encrypt申请证书

Let’s Encrypt只提供了DV(Domain Validation,域名验证)类型的SSL证书,只要你持有域名,就可以在验证通过后得到对应域名可用的SSL证书。具体的验证方法,就是在你域名的网站下建立一个/.well-known/acme-challenge文件,LE会去访问这个文件确认你的确持有这个域名。这里有个问题就是.well-known是用点开头的,在Linux中是隐藏文件,需要配置好你的nginx保证从外网可以访问到这个路径先。 整个过程还是比较繁琐的,所以Let’s Encrypt推荐我们使用工具Certbot来搞定这件事。所以在Certbot首页选择好你的系统和nginx之后,打开了具体的安装介绍页。

wget https://dl.eff.org/certbot-autochmod a+x certbot-auto

装好了它之后,Certbot推荐我们使用webroot插件来获得证书。

./certbot-auto certonly --webroot -w /var/www/crayus -d crayus.net -d www.crayus.net -w /var/www/crayus -d crayus.us -d www.crayus.us

这是一个示例的指令。其中/var/www/crayus是第一个虚拟主机的根路径,后面的crazyus.net和www.crazyus.net就是对应的已绑定的域名,也就是-d参数对应的域名会向前取最近一个-w参数对应的根路径。这样Certbot就会在/var/www/crayus路径下创建/.well-known/acme-challenge文件,然后通知Let’s Encrypt去验证,最后获得签名好的SSL证书存在本地,最后删除刚刚创建的验证用文件并输出结果

执行上面certbot-auto命令
接下来会需要输入你的email地址,同意Let’s Encrypt的协议,确认是否把email地址分享给EFF。
三步完成后没有什么问题应该就可以看到Congratulations的提示了,然后信息里也会提到你的证书存在哪里。

配置nginx

nginx的配置文件一般是在/etc/nginx路径下,打开这个路径下的nginx.conf,可以看到实际上它是从其他文件import了server配置:

http {  ...  include /etc/nginx/conf.d/*.conf;}

在这种情况下,就要再去/etc/nginx/conf.d路径下找到对应的*.conf文件来编辑server配置。如果server配置是直接写在nginx.conf里的,那就直接在nginx.conf里编辑server配置:

server
{
listen 443 ssl;   #lnmp1.3+版本默认支持http2,可以加上http2,lnmp1.2版本默认支持spdy,可以加上spdy
server_name www.crazyus.net;     ##这里是你的域名
index index.html index.htm index.php default.html default.htm default.php;
root /home/wwwroot/www.crazyus.net;            #网站目录
ssl_certificate /etc/letsencrypt/live/www.crazyus.net/fullchain.pem;    #前面生成的证书,改一下里面的域名就行
ssl_certificate_key /etc/letsencrypt/live/www.crazyus.net/privkey.pem;   #前面生成的密钥,改一下里面的域名就行
ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
.....

配置示例就是这样了,记得改成你的证书对应地址。在这样配置的情况下,用HTTP和HTTPS都可以访问到网站。

用nginx -t验证一下配置文件没有问题,用nginx -s reload重启nginx,生效后就可以测试访问效果了。  
Certbot工具也可以自动续期SSL证书,使用renew方法即可:

./certbot-auto renew

建议使用crontab进行自动续期:

crontab 里加上如下规则:0 3 */5 * * /root/certbot-auto renew –renew-hook “/etc/init.d/nginx reload” 这样每5天就会执行一次所有域名的续期操作。当然时间也可以自行进行调整,建议别太频繁,因为他们都有请求次数的限制,如果需要强制更新可以在前面命令上加上 –force-renew 参数。

注意事项

在vhost 的 80 conf 配置添加

if ($ssl_protocol = "") { return 301 https://$server_name$request_uri;}


标签: Certbotssl续期

非特殊说明,本博所有文章均为博主原创。

吐槽啦~