SSL(Secure Sockets Layer 安全套接字协议),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层与应用层之间对网络连接进行加密,确保数据发送到正确的客户机和服务器,防止数据中途被窃取,维护数据的完整性,确保数据在传输过程中不被改变… —摘自《百度百科》
Let’s Encrypt 是一个自动签发 HTTPS 证书的免费项目,Certbot 是 Let’s Encrypt 官方推荐的证书生成客户端工具。
基本操作
准备工作
将要签发证书的域名(如 you.domain.com) 解析到外网服务器,以 CentOS 8、Nginx 为例:
①、操作步骤概览
②、单个域名、泛域名证书
单个域名的证书生成还是比较简单的,参考官方文档即可,下面主要介绍泛域名证书的生成步骤。
因为泛域名证书需要 DNS 验证,而 Certbot 提供的 DNS 插件都是基于国外 DNS 厂商的,如 Cloudflare、Google 等,阿里云、腾讯云的 DNS 插件可以在 GitHub 上找到
在使用 certbot-dns-aliyun
遇到证书一直生成失败:
1 | Certbot failed to authenticate some domains (authenticator: certbot-dns-aliyun:dns-aliyun). The Certificate Authority reported these problems: |
解决方案:在阿里云域名管理 - DNSSEC 设置中,去掉列表下的 DS 记录。
域名系统安全扩展(DNSSEC)是添加到域名的DNS域名系统确定源域名的可靠性数字签名,并有助于防止恶意活动缓存中毒、域欺骗和拦截中的攻击。
因为这 DNS 插件需要 AliyunDNSFullAccess
权限,还需要获取 AccessKey、AccessKeySecret,因担心安全问题所以还是按照官方的来吧。
安装 Snapd
以具有 sudo
权限的用户身份 SSH 连接到运行 HTTP 网站的服务器,选择对应的操作系统,如 CenOS:
1 | $ sudo yum install snapd |
1 | $ sudo systemctl enable --now snapd.socket |
1 | $ sudo ln -s /var/lib/snapd/snap /snap |
确保 Snapd 是最新版本:
1 | $ sudo snap install core; sudo snap refresh core |
安装 Certbot
删除 Certbot Auto 和任何 Certbot OS 软件包
如果使用操作系统软件包管理器(如 apt、dnf 或 yum )安装了任何 Certbot 软件包,则应在安装 Certbot snap 之前将其删除,以确保在运行命令 Certbot 时使用的是 Certbot Snap,而不是操作系统软件包管理器自带的,命令如下:
1 | $ sudo apt-get remove certbot 或 sudo dnf remove certbot 或 sudo yum remove certbot |
安装 Certbot
1 | $ sudo snap install --classic certbot |
创建软连接
1 | $ sudo ln -s /snap/bin/certbot /usr/bin/certbot |
确认插件包含级别
1 | $ sudo snap set certbot trust-plugin-with-root=ok |
因为不使用 DNS 插件模式,所以安装 DNS 插件的步骤跳过
除了 Manual、DNS Plugins,其它模式还有 Webroot、Standalone 等,详情请参考官方文档
下面使用 Manual 模式,执行命令
1 | $ sudo certbot certonly --manual --preferred-challenges dns -d *.liaofuzhan.com |
或者
1 | $ sudo certbot certonly --manual --preferred-challenges dns -d *.liaofuzhan.com --server https://acme-v02.api.letsencrypt.org/directory |
根据提示,在域名解析设置里分别添加两条以 _acme-challenge
开头的 TXT
记录,期间可以间隔一段时间,以期 TXT 记录生效,可以使用如下命令进行验证:
1 | $ dig liaofuzhan.com TXT |
或者
1 | $ nslookup -type=TXT liaofuzhan.com |
证书自动续期
Let’s Encrypt 颁发的免费 SSL 证书有效期是 90 天,基于 Manual 模式的不支持自动续期:
1 | Certificates created using --manual do not support automatic renewal unless combined with an authentication hook script via --manual-auth-hook to automatically set up the required HTTP and/or TXT challenges. |
其它方式颁发的会自动续期:
1 | The Certbot packages on your system come with a cron job or systemd timer that will renew your certificates automatically before they expire. You will not need to run Certbot again, unless you change your configuration. |
续期方案:
1 | # 手动测试,查看证书过期时间 |
定时每天检查,如果要过期则自动延期,也可参考官方的续期方案
Renewing certificates
Automated Renewals
测试自动续期
1 | $ sudo certbot renew --dry-run |
如果该命令完成且没有错误,那么证书将在后台自动续订。
查看证书
1 | $ certbot certificates |
使用 HTTPS 证书
以 Nginx 为例:
1 | server { |
注意:一定要开放 443
端口,在阿里云服务器 - ECS 安全组,添加访问规则,如:
1 |
|