https协议越来越流行,很多大型网站早已完成从http到https协议的迁移。安装一个https安全认证CA证书在公司内是很容易的,但是对于个人开发者来说总会遇到一些坑。前段时间自己买了阿里云的ECS虚拟机,所以想玩一下https。阿里云提供的CA证书价格不菲,于是我选择了Let’s Encrypt提供的免费证书。

写此文的目的有二:

  1. 记录下自己踩的坑,因为记忆深刻所以值得后面做事时思考。

  2. 帮助遇到相同问题的朋友,多一个思路。

由于我的机器上早就安装过nginx,并且也编译了http_ssl模块。所以,我只需要完成安装Let’s Encrypt并生成证书,配置nginx 的ssl模块,就可以了。大致过程网上教程很多,我简单介绍一下。

在阿里云上利用Let’s Encrypt和Nginx实现网站支持https协议

安装

  • 官方建议通过certbot-auto工具安装

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

在阿里云上利用Let’s Encrypt和Nginx实现网站支持https协议

  • 停止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(不要在意这些细节)。

在阿里云上利用Let’s Encrypt和Nginx实现网站支持https协议

  • 在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协议是可以访问的。 

在阿里云上利用Let’s Encrypt和Nginx实现网站支持https协议一时间没有头绪,google了一圈,有说证书没有权限的,也有说需要在listen 443 后面加上default_server的,都尝试了并没有奏效。

在阿里云上利用Let’s Encrypt和Nginx实现网站支持https协议

后来看到一个帖子说到没有开放443端口,检查了一下发现nginx已经监听了443端口。不过帖子上的思路还是很有帮助的:

  • nginx没有收到https协议的请求日志,说明请求并没有到nginx。

  • 浏览器收到的错误是请求超时,并没有http状态码,说明可能是连接失败,很有可能是防火墙拦截。 由此,我想到并检查了iptables配置。 也没有任何问题。

在阿里云上利用Let’s Encrypt和Nginx实现网站支持https协议

不过我突然想起来了,阿里云ECS虚拟机想要开放一个端口,需要进行安全组配置。赶快尝试一下!

在阿里云上利用Let’s Encrypt和Nginx实现网站支持https协议

从80端口的配置clone了一份,修改协议类型,选择了HTTPS(443)。wow,问题解决了!浏览器可以访问了,telnet也通了!纠结了一下午的问题终于迎刃而解。

在阿里云上利用Let’s Encrypt和Nginx实现网站支持https协议

验证

https://www.ssllabs.com/ssltest/analyze.html?d=shuibit.com  通过此网站可以验证自己的服务有没有支持https协议,以及一些安全信息。

在阿里云上利用Let’s Encrypt和Nginx实现网站支持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

总结

  1. Let’s Encrypt很好用,而且以免费形式支持https推广,必将成为主流证书。

  2. 技术上经常遇到的一些诡异问题,往往都是不起眼的细节原因,所以细节很重要,做技术要细心。

  3. 分析问题要沿着问题寻找思路,从结果分析原因,不能一遇到问题就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

欢迎关注微信公众号『野狐』

相关文章:

  • 2021-06-21
  • 2022-12-23
  • 2021-06-13
  • 2022-12-23
  • 2022-12-23
  • 2023-01-19
  • 2021-08-31
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-06-14
  • 2021-05-22
  • 2021-04-19
  • 2022-01-06
  • 2022-12-23
相关资源
相似解决方案