创建永久免费的SSL证书

一次创建,自动更新

术语

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 Tokenb3bd84d91460*******664eb947c0e66

注意:需要把上面DNSPod Token缓存您自己的,上面的token的*号掩盖了部分字符作脱敏处理了。

创建和查看腾讯云DNSPod Token:

https://console.dnspod.cn/account/token/token

SSL证书发布目录:/opt/ssl/tookii.cn/

Nginx使用的SSL证书指向这里。

Nginxnginx/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:创建第一个 但域名

Step2: 查看生产的目录结构和文件

Step3:修改基础配置文件:~/.getssl/getssl.cfg

单域名配置

Step1:上面通过第一步操作后会生成tookii.cn域名对应的目录和配置文件。

注意:上面的命令不用重复执行。

Step2:修改~/.getssl/tookii.cn/getssl.cfg配置文件:

vi ~/.getssl/tookii.cn/getssl.cfg

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的目录

Step3:修改配置文件

Step4:创建SSL证书

执行以下命令生成证书文件:

执行以下命令强制重新生成证书文件

# ~/scripts/getssl -f "*.tookii.cn"

查看目录(/root/.getssl/*.tookii.cn)的文件:

自动更新

添加cron任务,执行命令(crontab -e)在打开的文件末尾,新增一行以下内容:

验证通配符/泛域名证书是否正常

通过配置主域名(tookii.cn)和二级域名(test.tookii.cn)使用通配符SSL证书,验证证书使用是否正常。

Nginx配置

# vi /etc/nginx/nginx.conf

主域名tookii.cn验证

Nginx配置

查看证书是否正常

二级域名test.tookii.cn验证

Nginx配置

查看证书是否正常

参考

https://letsencrypt.org

https://github.com/srvrco/getssl

https://gitee.com/mirrors_srvrco/getssl

https://github.com/srvrco/getssl/wiki/Guide-to-getting-a-certificate-for-example.com-and-www.example.com

常见问题

问题1:在创建证书的时候报错:Domain name xxx is redundant with a wildcard domain in the same request.

解决方法:

打开 ~/.getssl/*.tookii.cn/getssl.cfg

把 SANS=”tookii.cn,www.tookii.cn”

改成

SANS=”tookii.cn”

也就是,去掉错误信息中提示重复的www开头的域名即可。

修改后,再次执行以下命令生成通配符域名证书:

问题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 即可解决问题。