https协议越来越流行,很多大型网站早已完成从http到https协议的迁移。安装一个https安全认证CA证书在公司内是很容易的,但是对于个人开发者来说总会遇到一些坑。前段时间自己买了阿里云的ECS虚拟机,所以想玩一下https。阿里云提供的CA证书价格不菲,于是我选择了Let’s Encrypt提供的免费证书。
写此文的目的有二:
记录下自己踩的坑,因为记忆深刻所以值得后面做事时思考。
帮助遇到相同问题的朋友,多一个思路。
由于我的机器上早就安装过nginx,并且也编译了http_ssl模块。所以,我只需要完成安装Let’s Encrypt并生成证书,配置nginx 的ssl模块,就可以了。大致过程网上教程很多,我简单介绍一下。
安装
-
官方建议通过certbot-auto工具安装
wget https://dl.eff.org/certbot-auto chmod a+x certbot-auto
-
停止nginx, 暴力杀死
killall nginx
-
生成证书
./certbot-auto certonly --email [email protected] --agree-tos --webroot -w /home/work/nginx/nginx/conf/ssl/shuibit.com -d shuibit.com
生成的证书在/etc/letsencrypt/live/shuibit.com目录下, 因为我尝试了几次最后目录变成了shuibit.com-0002(不要在意这些细节)。
-
在nginx中配置ssl
listen 80; listen 443 ssl; # Note the lack of
sslservername shuibit.com www.shuibit.com; ssl on; sslcertificate /etc/letsencrypt/live/shuibit.com-0002/fullchain.pem; sslcertificatekey /etc/letsencrypt/live/shuibit.com-0002/privkey.pem; ssltrustedcertificate /etc/letsencrypt/live/shuibit.com-0002/chain.pem; sslprotocols TLSv1 TLSv1.1 TLSv1.2; sslpreferserverciphers on; # 定义session过期时间 sslsessiontimeout 1d;
-
重启nginx
./sbin/nginx
本以为万事俱备,不过并没有生效。浏览器访问显示请求超时,telnet也是超时,并且同样的接口用http协议是可以访问的。
一时间没有头绪,google了一圈,有说证书没有权限的,也有说需要在listen 443 后面加上default_server的,都尝试了并没有奏效。
后来看到一个帖子说到没有开放443端口,检查了一下发现nginx已经监听了443端口。不过帖子上的思路还是很有帮助的:
-
nginx没有收到https协议的请求日志,说明请求并没有到nginx。
-
浏览器收到的错误是请求超时,并没有http状态码,说明可能是连接失败,很有可能是防火墙拦截。 由此,我想到并检查了iptables配置。 也没有任何问题。
不过我突然想起来了,阿里云ECS虚拟机想要开放一个端口,需要进行安全组配置。赶快尝试一下!
从80端口的配置clone了一份,修改协议类型,选择了HTTPS(443)。wow,问题解决了!浏览器可以访问了,telnet也通了!纠结了一下午的问题终于迎刃而解。
验证
https://www.ssllabs.com/ssltest/analyze.html?d=shuibit.com 通过此网站可以验证自己的服务有没有支持https协议,以及一些安全信息。
续签
由于Let’s Encrypt生成的免费证书有效期为3个月时间,但是我们可以无限次续签证书。方法如下:
可以写一个脚本renew-cert.sh: #!/bin/bash # 停止nginx sudo killall nginx # 续签 /home/work/nginx/conf/ssl/certbot-auto renew --force-renew # 启动nginx sudo /home/work/nginx/sbin/nginx
把脚本加到定时任务中,每月1号0点执行一次:
crontab -e 0 0 1 * * /home/work/nginx/conf/ssl/renew-cert.sh
总结
-
Let’s Encrypt很好用,而且以免费形式支持https推广,必将成为主流证书。
-
技术上经常遇到的一些诡异问题,往往都是不起眼的细节原因,所以细节很重要,做技术要细心。
-
分析问题要沿着问题寻找思路,从结果分析原因,不能一遇到问题就google,可能会白白浪费时间,也有可能南辕北辙。
参考文献
https://certbot.eff.org/lets-encrypt/centos6-nginx https://www.freehao123.com/lets-encrypt/ https://blog.csdn.net/qq39594705/article/details/79857451 https://yq.aliyun.com/ziliao/60554 https://blog.csdn.net/sinat21302587/article/details/53641100