更新: 如果运行certbot过程中出现 “ ImportError: ‘pyOpenSSL’ module missing required functionality. Try upgrading to v0.14 or newer.”的错误,请参考 这篇文章
certbot renew出现“Let’s Encrypt renew出现“Challenge failed for domain xxxx””的错误,请参考 这篇文章
更新:推荐使用acme.sh获取证书,操作请参考:使用acme.sh签发证书
https已经走向主流(那些烦人的运营商弹窗广告终于消停的差不多了),目前已经可以做到0成本获取SSL证书。国内的阿里云、腾讯云等云计算厂商提供了申请免费证书的服务,按照官方给出的步骤即可在一天之内拿到免费的证书。
本文介绍如何从Let’s Encrypt获取免费证书。Let’s Encrypt是一个免费、非营利性的开放证书权威中心,由互联网安全研究小组(ISRG)支持,签发的免费证书被各个主流浏览器认可。任何域名持有人均可使用Let’s Encrypt申请免费证书来加密网站流量,公司、机构则建议付费获取OV、EV证书。
本教程前提是有一个域名(例如tlanyan.pp.ua)和一台vps,基于CentOS 7/8操作系统。如果操作系统与本博客的有差异,请参考 官方指引 获取证书。
域名没备案且vps在国内,可能无法申请成功,解决办法请参考 这篇文章。
首先安装certbot:yum install -y python3 && pip3 install certbot(注意:该安装方式不是官方推荐的,但一直都很好使)
安装完毕后,运行certbot --help可以查看该工具的用法。
接下来介绍 certbot 获取域名证书的步骤。
进入域名的dns解析后台,将申请证书的域名记录指向服务器IP。
certbot 默认使用http方式对域名所有权进行验证,该操作需要绑定vps的80端口。如果80端口已被占用,请先停止占用的进程,例如停止Nginx:systemctl stop nginx。
阿里云、腾讯云等购买的服务器,还需要在vps网页后台的安全组中放行80端口。
接着运行命令为域名tlanyan.pp.ua和tlanyan.pp.ua获取证书: certbot certonly --standalone -d tlanyan.pp.ua -d tlanyan.pp.ua。如果有其他二级域名,继续添加-d参数即可。
如果域名记录未指向服务器的IP,会报错并提示域名解析问题。
大概半分钟就拿到了免费的证书,运行 certbot certificates命令可查看域名证书的路径和国旗时间。
各个web服务器的配置不一样,本文提供Nginx和Apache httpd的配置例子。
本站的配置文件 /etc/nginx/conf.d/tlanyan.conf 文件,编辑其内容为:
server {
listen 80;
server_name tlanyan.pp.ua tlanyan.pp.ua;
rewrite ^(.*) https://$server_name$1 permanent;
}
server {
listen 443 ssl;
server_name tlanyan.pp.ua tlanyan.pp.ua;
charset utf-8;
ssl_certificate /etc/letsencrypt/live/tlanyan.pp.ua/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/tlanyan.pp.ua/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3; # TLSv1.3需要nginx 1.13.0以上版本
# 如果nginx版本低,建议使用这种加密算法配置
# ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
ssl_ecdh_curve secp384r1;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;
keepalive_timeout 70;
# 这里填写其他配置
}
配置分为两个server段,第一段是所有http请求都导向https;第二段以ssl开头的配置都和证书相关:设置证书和私钥的位置、证书采用的协议、证书的加密算法等信息。
为了增强安全性,ssl_protocols、ssl_ciphers和ssl_prefer_server_ciphers的配置建议采用以上配置。
配置好以后,运行nginx -t命令查看有无错误。配置正确的话用systemctl restart nginx 重新启动nginx。
https使用443端口,如果开启了防火墙,记得放行https服务:
firewall-cmd --permanent --add-service=https
# 如果监听了其他端口,使用下面的命令
# firewall-cmd --permanent --add-port=端口号/tcp
firewall-cmd --reload
编辑网站配置文件,例如 /etc/apache2/sites-enabled/tlanyan.conf ,添加443端口和相关配置:
<VirtualHost *:443>
ServerName tlanyan.pp.ua
// 日志等其他配置
// ssl配置
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/tlanyan.pp.ua/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/tlanyan.pp.ua/privkey.pem
</VirtualHost>
保存配置文件后, apachectl -t 检查有无语法问题,然后重启apache:apachectl restart。
为了https能正常访问,开启了防火墙的情况下请参考上文Nginx中的方式放行端口。
Let’s Encrypt证书的有效期是三个月,超过期限则需要续签。证书续期可以手动完成,例如:
systemctl stop nginx
certbot renew
systemctl restart nginx
也可以配置crontab任务自动续签,在/etc/crontab文件末添加一行:
0 0 1 */2 0 root systemctl stop nginx; /usr/local/bin/certbot renew; systemctl restart nginx
pip3默认安装的certbot路径是/usr/local/bin/certbot,可使用 which certbot 查看,如果输出不同,请记得替换。该配置将每两个月自动运行certbot并续签证书。如果你的证书快到期了还没有续签,贴心的EFF(电子前哨基金会)会发邮件提醒,记得到期前续签就行。