更新: 如果运行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””的错误,请参考 这篇文章
https已经走向主流(那些烦人的运营商弹窗广告终于消停的差不多了),目前已经可以做到0成本获取SSL证书。国内的阿里云、腾讯云等云计算厂商提供了申请免费证书的服务,按照官方给出的步骤即可在一天之内拿到免费的证书。如果你需要便宜一点的泛域名证书,可以参考 这篇文章。
本文介绍如何从Let’s Encrypt获取免费证书。前提是有一个域名(例如tlanyan.me)和一台vps,域名没备案且vps在国内,可能无法申请成功,解决办法请参考 这篇文章。本文教程基于CentOS 7操作系统,如果你的环境与本博客的有差异,请参考官方指引。
Let’s Encrypt由互联网安全研究小组(ISRG)支持,是一个免费、非营利性的开放证书权威中心。任何域名持有人均可使用Let’s Encrypt申请到免费的证书来加密网站流量,公司则建议用EV类的证书获取更权威的认证。
安装certbot
首先安装certbot
:yum install -y python3 && pip3 install certbot
(注意:该安装方式不是官方推荐的,但一直都很好使)
安装完毕后,运行certbot --help
可以查看该工具的命令详情。
解析域名
进入dns解析服务提供商的网站,将需要申请证书域名的A记录指向服务器IP。本人使用 DNSLA, 为www.tlanyan.me网站申请证书,在记录值出填写服务器ip,截图如下:
请在涂改部分填上你vps的IP。
获取证书
运行命令 certbot certonly --standalone -d tlanyan.me -d www.tlanyan.me
为域名tlanyan.me和www.tlanyan.me获取证书。如果你要获取多个站点,继续添加-d参数即可。certbot会检测80和443端口是否已经占用,如果已被占用需要先停止web服务器(例如停止Nginx:systemctl stop nginx
)再运行命令。如果域名的A记录未指向该服务器,会报错提示域名解析问题。
大概半分钟就拿到了免费的证书,很爽有没有?运行 certbot certificates
命令可查看获取到所有申请的证书及所在目录。
配置web服务器使用证书
各个web服务器的配置不一样,本文提供Nginx和Apache httpd的配置例子。
Nginx配置
本站的配置文件 /etc/nginx/conf.d/tlanyan.conf
文件,编辑其内容为:
server { listen 80; server_name www.tlanyan.me tlanyan.me; rewrite ^(.*) https://$server_name$1 permanent; } server { listen 443 ssl; server_name www.tlanyan.me tlanyan.me; charset utf-8; ssl_certificate /etc/letsencrypt/live/tlanyan.me/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/tlanyan.me/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_perfer_server_ciphers的配置建议采用以上配置。
配置好以后,运行nginx -t
命令查看有无错误。如果没有可运行systemctl restart nginx
重新开启web服务。
Apache httpd配置
编辑网站配置文件,例如 /etc/apache2/sites-enabled/tlanyan.conf
,添加443端口和相关配置:
<VirtualHost *:443> ServerName tlanyan.me // 日志等其他配置 // ssl配置 SSLEngine on SSLCertificateFile /etc/letsencrypt/live/tlanyan.me/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/tlanyan.me/privkey.pem </VirtualHost>
保存配置文件后,用 apachectl -t
查看有无语法错误,正确无误的话重启apache:apachectl restart
。
证书自动更新
通过certbot certificates
命令可以看到证书的有效期是三个月,超过期限则需要续签。证书续期可以手动完成,例如:
systemctl stop nginx
certbot renew
systemctl restart nginx
也可以配置crontab任务自动续签,在/etc/crontab文件末添加一行:
0 0 0 */2 0 root systemctl stop nginx; /usr/bin/certbot renew; systemctl restart nginx
证书将每两个月自动续签一次。如果你的证书快到期了还没有续签,贴心的EFF(电子前哨基金会)会发邮件提醒,记得到期前续签就行。
4 thoughts on “使用Let’s Encrypt获取免费证书”
Pingback: certbot: ImportError: ‘pyOpenSSL’ module missing required functionality – 月下博客 Pingback: 配置更安全的https连接 – 月下博客 Pingback: 从阿里云获取免费SSL证书 – 月下博客 Pingback: 网站开启OCSP Stapling – 月下博客
留言评论