一次创建,自动更新
术语
HTTPS
HTTPS(Hypertext Transfer Protocol Secure)是一种安全的通信协议,它建立在 HTTP(超文本传输协议)之上,通过添加加密和认证机制来保护数据的传输。HTTPS 协议的主要目的是确保数据在客户端和服务器之间传输时不被窃取、篡改或伪造。
HTTPS 的一些关键特点:
加密:HTTPS 使用 SSL/TLS(安全套接层/传输层安全)协议来加密数据传输。这使得即使数据在传输过程中被截获,攻击者也无法读取或理解数据。
认证:HTTPS 能够验证服务器的身份,确保客户端正在与预期的服务器通信,而不是一个冒充的服务器。这有助于防止中间人攻击。
SSL
SSL(Secure Sockets Layer)是一种加密协议,用于在客户端和服务器之间建立安全、加密的通信连接。它是互联网上用于保护数据传输安全的一种技术,特别是在传输敏感信息时,如信用卡号码、登录凭据等。
Let’s Encrypt
Let’s Encrypt 是一家免费、开放、自动化的公益性证书颁发机构(CA), 由互联网安全研究组(ISRG)运作。
Let’s Encrypt 的宗旨是:
免费:任何人只要持有域名就可以通过 Let’s Encrypt 免费获得可信的数字证书。
自动:使用服务器上运行的软件即可与 Let’s Encrypt 交互,轻松实现证书的获取、安全配置以及自动续期。
安全:Let’s Encrypt 不仅颁发证书,还在积极协助广大网站运作者正确维护服务器安全,从而成为一个推动 TLS 安全最佳实践的平台。
透明:我们颁发及吊销的所有证书都有公开记录,任何人都可以查阅。
开放:我们的证书自动签发及续期协议已作为开放标准发布,各方均可采用。
合作:正如我们所依赖的互联网基础协议一样,Let’s Encrypt 是一支多方合作形成的公益力量,绝不受个别组织团体掌控。
官网地址:https://letsencrypt.org/zh-cn/
ACME
ACME(Automated Certificate Management Environment)是一个开放标准,由互联网工程任务组(IETF)开发,用于自动化证书管理过程。ACME 的主要目的是简化证书颁发机构(CA)证书的获取和更新,特别是用于 TLS/SSL 证书。
ACME 协议允许客户端(通常是网站服务器)与 CA 进行交互,以自动获取、安装和更新证书。这使得网站管理员能够更容易地管理他们的证书,尤其是在需要频繁更新证书时(例如,使用 Let’s Encrypt 这样的服务)。
前言
在正式发布web应用和服务的时候,通常都要用到HTTPS来确保客户端与服务器之间数据的安全传输,因此需要使用SSL证书。
从2024年中(5月份左右)开始,主要的云服务提供商(阿里云、腾讯云,华为云)提供的免费SSL证书SSL证书有效期从原来12个月都不约而同的都改成了90天有效期。因此每隔3个月就要手动去更新一下域名的SSL证书,然而手动操作操作极为繁琐且容易因忘记更新SSL证书而导致服务不能使用。
与云服务提供商提供免费证书一样的是,通过Let’s Encrypt申请的免费SSL证书的有效期也由之前的12个月变成了90天。
本文主要介绍,基于Let’s Encrypt提供的免费证书服务和客户端GetSSL来创建免费永久的域名SSL证书(一次创建,后续无需手动更新)
GetSSL本质上就是通过自动定期执行bash脚本方式来替代手动去申请SSL证书,自动更新和启用SSL新证书。
更多ACME客户端:https://letsencrypt.org/zh-cn/docs/client-options/
环境准备
以下操作基于腾讯云的服务器和域名。
域名:tookii.cn
Linux服务器:
101.33.231.48 (公网IP)
10.0.24.12 (内网IP)
操作用户:root
DNSPod Token:b3bd84d91460*******664eb947c0e66
注意:需要把上面DNSPod Token缓存您自己的,上面的token的*号掩盖了部分字符作脱敏处理了。
创建和查看腾讯云DNSPod Token:
https://console.dnspod.cn/account/token/token
SSL证书发布目录:/opt/ssl/tookii.cn/
Nginx使用的SSL证书指向这里。
Nginx:nginx/1.14.1
用于发布web网页或反向代理API服务
安装客户端
客户端下载
在/root目录下执行:
# git clone https://github.com/srvrco/getssl scripts
或(gitee的镜像,如果github不能访问,可以通过镜像网址下载)
# git clone https://gitee.com/mirrors_srvrco/getssl scripts
以上名利执行完成后,getssl下载到 /root/scripts/目录,通过 /root/scripts/getssl [命令参数] 即可使用。
基本配置
Step1:创建第一个 但域名
/root/scripts/getssl -c tookii.cn
Step2: 查看生产的目录结构和文件
~/.getssl
~/.getssl/getssl.cfg
~/.getssl/tookii.cn
~/.getssl/tookii.cn/getssl.cfg
Step3:修改基础配置文件:~/.getssl/getssl.cfg
vi ~/.getssl/getssl.cfg
# 默认情况下会使用staging的acme测试服务器(测试SSL证书生成和自动流程,测试服务器派发的SSL证书不能作为域名发布使用,否则会提示证书不可用)
#CA="https://acme-staging-v02.api.letsencrypt.org"
# 正式acme服务器(创建需要发布到真实域名的SSL证书时候)
CA="https://acme-v02.api.letsencrypt.org"
# 设置邮件地址,把me@example.com替换为您的真实邮件地址
ACCOUNT_EMAIL="me@example.com"
# 通过DNS来验证SSL证书,通配符/泛域名必须
VALIDATE_VIA_DNS="true"
# "ID,Token"
export DNSPOD_API_KEY="536438,b3bd84d91460*******664eb947c0e66"
DNS_ADD_COMMAND="/root/scripts/dns_scripts/dns_add_dnspod"
DNS_DEL_COMMAND="/root/scripts/dns_scripts/dns_del_dnspod"
单域名配置
Step1:上面通过第一步操作后会生成tookii.cn域名对应的目录和配置文件。
/root/scripts/getssl -c tookii.cn
注意:上面的命令不用重复执行。
Step2:修改~/.getssl/tookii.cn/getssl.cfg配置文件:
vi ~/.getssl/tookii.cn/getssl.cfg
SANS="www.tookii.cn"
# 将后续生成的证书文件crt和key复制到指定目录
DOMAIN_CERT_LOCATION="/opt/ssl/tookii.cn/tookii.cn.crt"
DOMAIN_KEY_LOCATION="/opt/ssl/tookii.cn/tookii.cn.key"
Step3:生成SSL证书
执行以下命令生成证书文件:
# ~/scripts/getssl tookii.cn
执行以下命令强制重新生成证书文件
# ~/scripts/getssl -f tookii.cn
查看目录(/root/.getssl/*.tookii.cn)的文件:
通配符/泛域名配置
Step1:创建通配符/泛域名 目录
# /root/scripts/getssl -c *.tookii.cn
Step2:查看通配符域名*.tookii.cn的目录
-rw------- 1 root root 3243 Nov 17 10:47 account.key
-rw-r--r-- 1 root root 3306 Nov 17 14:41 getssl.cfg
drwxr-xr-x 3 root root 4096 Nov 17 14:43 '*.tookii.cn'
drwxr-xr-x 3 root root 4096 Nov 18 00:27 tookii.cn
Step3:修改配置文件
# vi ~/.getssl/*.tookii.cn/getssl.cfg
SANS="tookii.cn"
# 将后续生成的证书文件crt和key复制到指定目录
DOMAIN_CERT_LOCATION="/opt/ssl/tookii.cn/*.tookii.cn.crt"
DOMAIN_KEY_LOCATION="/opt/ssl/tookii.cn/*.tookii.cn.key"
RELOAD_CMD="systemctl reload nginx"
Step4:创建SSL证书
执行以下命令生成证书文件:
# ~/scripts/getssl "*.tookii.cn"
执行以下命令强制重新生成证书文件
# ~/scripts/getssl -f "*.tookii.cn"
查看目录(/root/.getssl/*.tookii.cn)的文件:
自动更新
添加cron任务,执行命令(crontab -e)在打开的文件末尾,新增一行以下内容:
23 5 * * * /root/scripts/getssl -u -a -q
验证通配符/泛域名证书是否正常
通过配置主域名(tookii.cn)和二级域名(test.tookii.cn)使用通配符SSL证书,验证证书使用是否正常。
Nginx配置
# vi /etc/nginx/nginx.conf
主域名tookii.cn验证
Nginx配置
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
server_name www.tookii.cn tookii.cn;
ssl_certificate "/opt/ssl/tookii.cn/*.tookii.cn.crt";
ssl_certificate_key "/opt/ssl/tookii.cn/*.tookii.cn.key";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
root /usr/share/nginx/tookii.cn/www;
try_files $uri $uri/ /index.html;
}
}
查看证书是否正常
二级域名test.tookii.cn验证
Nginx配置
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name test.tookii.cn;
ssl_certificate "/opt/ssl/tookii.cn/*.tookii.cn.crt";
ssl_certificate_key "/opt/ssl/tookii.cn/*.tookii.cn.key";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://10.0.8.7:9002/;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
查看证书是否正常
参考
https://github.com/srvrco/getssl
https://gitee.com/mirrors_srvrco/getssl
常见问题
问题1:在创建证书的时候报错:Domain name xxx is redundant with a wildcard domain in the same request.
ACME server returned error: 400:
"detail": "Error creating new order :: Domain name \"www.tookii.cn\" is redundant with a wildcard domain in the same request. Remove one or the other from the certificate request."
解决方法:
打开 ~/.getssl/*.tookii.cn/getssl.cfg
把 SANS=”tookii.cn,www.tookii.cn”
改成
SANS=”tookii.cn”
也就是,去掉错误信息中提示重复的www开头的域名即可。
修改后,再次执行以下命令生成通配符域名证书:
~/scripts/getssl "*.tookii.cn"
问题2:微信小程序报错 errno: 600001 request:fail net::ERR_CERT_AUTHORITY_INVALID
问题描述:配置了通用符域名SSL证书,在浏览器打开正常,但是在小程序访问API(https)时候,调试接口发现报以上错误。
错误原因,其中由一条是要求,证书信任链必须完整。
解决方法:
在目录 ~/.getssl/*.tookii.cn/目录下,找到fullchain.crt文件。
`fullchain.crt`:是 `*.tookii.cn.crt` 和 `chain.crt` 的组合,包含了服务器证书和证书链。
因此在Nginx配置SSL证书的时候,使用 fullchain.crt 替换 *.tookii.cn.crt 即可解决问题。
ssl_certificate "/opt/ssl/tookii.cn/fullchain.crt";
ssl_certificate_key "/opt/ssl/tookii.cn/*.tookii.cn.key";