使用Let’s Encrypt获取免费证书

| 2017年3月15日

更新: 如果运行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证书。国内的阿里云、腾讯云等云计算厂商提供了申请免费证书的服务,按照官方给出的步骤即可在一天之内拿到免费的证书。如果你需要便宜一点的泛域名证书,可以参考 这篇文章

国内的企业都是忠诚于党的,申请证书就需要向这些企业提供私钥。所以有一天政府想要解密你的网站流量,那是so easy啊~鉴于这个考虑,本站从Let’s Encrypt获取的免费证书。Let’s Encrypt由互联网安全研究小组(ISRG)支持,是一个免费、非营利性的开放证书权威中心。任何域名持有人均可使用Let’s Encrypt申请到免费的证书来加密网站流量,公司则建议用EV类的证书获取更权威的认证。

本文介绍如何从Let’s Encrypt获取免费证书。前提是有一个域名(例如tlanyan.me)和一台vps,如果你的域名没备案且vps在国内,可能无法申请成功,解决办法请参考 这篇文章。本文教程机遇CentOS 7操作系统,如果你的环境与本博客的有差异,请参考官方指引

安装certbot

首先安装certbotyum install -y python36 && 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的配置范例。例如本站的配置文件 /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服务。

证书自动更新

通过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(电子前哨基金会)会发邮件提醒,记得到期前续签就行。

参考

  1. https://letsencrypt.org

本文最后修改日期:2020年4月1日

使用Let’s Encrypt获取免费证书” 有 22 条评论

  1. 头像LIANG

    老哥,证书的加密算法在哪找啊
    nginx: [emerg] invalid value “ssl_ciphers” in /www/server/panel/vhost/nginx/blog.specialiang.tk.conf:17
    nginx: configuration file /www/server/nginx/conf/nginx.conf test failed

    回复
    1. tlanyantlanyan Post author

      在宝塔里修改,把第17行改成:ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;

      回复
      1. 头像LIANG

        谢谢老哥,我把另一个域名的证书整个这一段都复制过来改了域名就搞定了,不知道为啥单独复制这一行就不行,内容都是一样的。感谢老哥

  2. 头像Alatta

    按您的教程安装好Encrypt后,打开 /etc/crontab后文件如下
    ————————————————————-
    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=root

    # For details see man 4 crontabs

    # Example of job definition:
    # .—————- minute (0 – 59)
    # | .————- hour (0 – 23)
    # | | .———- day of month (1 – 31)
    # | | | .——- month (1 – 12) OR jan,feb,mar,apr …
    # | | | | .—- day of week (0 – 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
    # | | | | |
    # * * * * * user-name command to be executed

    0 3 1 */2 0 root systemctl stop nginx ; certbot renew ; systemctl restart nginx
    ——————————————————
    请教下最后一句话是自动更新的命令吗?这种情况我还需要再配置证书自动更新吗?

    回复
  3. 头像证书的获取

    在Namesilo上买的域名已经解析到vps上了可以用这个教程获取证书吗?Namesilo上买的可以备案吗?已经用伪装一键脚本配置过了如何再获取证书配置?

    回复
    1. tlanyantlanyan Post author

      1.可以;2.备案需要转移到国内注册商,并且复工后缀名有要求;3.按照这个教程可以再获取📄个查看证书

      回复
  4. 头像feng

    0 0 0 */2 0 root systemctl stop nginx; /usr/bin/certbot renew; systemctl restart nginx
    请问,每隔两月不应该是 0 0 0 0 */2 ?么
    如果按照脚本中的计算,是不是每2天就申请续签?

    回复
      1. 头像Feng

        老师,0 0 0 */2 0,如果按照“ 分 时 日 月 周 ”理解,“周”定值“0”,是否限定了每隔两月的周日执行任务?这个周日与日期的“0”是否会冲突?

  5. 头像ererg

    先申请证书还是要把nginx配置好再申请,为啥总是说我申请失败

    回复
  6. 头像人心与人生

    请问按上面的Nginx配置好证书后重启就是显示https了吗?
    我的怎么没出现呢?还是http

    回复
      1. 头像人心与人生

        版主提示的很对。
        设置全站导向https,外加打开防火墙的https支持。
        ok!

  7. 头像Gary

    不好意思我刚开始接触这个. 想请教下 证书自动更新 那里:
    “可以配置crontab任务自动续签,在/etc/crontab文件末添加一行”
    请问这个可以使用Xshell之类的命令行软件操作吗? 如果可以具体又该如何操作? 或我应该通过别的什么方式?

    回复
  8. 头像Linda

    运行certbot certonly命令报如下错误?请问如何处理,我的域名在 Namesilo中注册、且已添加A记录指向我虚机的public IP,ping域名可以显示IP地址,虚机的TCP 443/80端口均已开放入站。谢谢
    IMPORTANT NOTES:
    – The following errors were reported by the server:
    Domain: xxxxxxx
    Type: dns
    Detail: No valid IP addresses found for xxxxxxx

    回复
    1. tlanyantlanyan Post author

      ping 域名看看是不是指向了你的服务器地址,如果是可能有延迟,如果不是请修改后再尝试

      回复
  9. 头像新手

    您好,我在certbot certonly –standalone -d 这一步时一直报错,说connection有问题,请问该怎么解决…
    这个域名是能ping通的
    Challenge failed for domain xxxx.com
    Challenge failed for domain http://www.xxxx.com
    IMPORTANT NOTES:
    – The following errors were reported by the server:

    Domain: xxxx.com
    Type: connection
    Detail: Fetching
    http://xxxx.com/.well-known/acme-challenge/27FKdk4LSJsPfd64ybIr_Sdnu-9svr3w2J1exuDslU0:
    Error getting validation data

    Domain: http://www.xxxx.com
    Type: connection
    Detail: Fetching
    http://www.xxxx.com/.well-known/acme-challenge/QIUn-05oov5fKfnul1d8136T-r5duYGY-Usa3rF8Wuc:
    Error getting validation data

    回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注