Linux 下使用acme.sh生成Let's Encrypt泛域名免费证书

摘要:
和通过openssl等工具生成的证书不同,Let'sEncrypt获得IdenTrust交叉签名,这就是说可以应用且支持包括FireFox、Chrome在内的主流浏览器的兼容和支持,可以说是真正意义上免费且有效的SSL证书。Let'sEncrypt的最大贡献是它的ACME协议,而acme.sh脚本可以通过ACME协议从Let'sEncrypt生成免费的SSL证书。

一、需求场景

自从数年前苹果开始强制要求所有IOS所有应用必须全部使用 https,以及google、baidu、bing 这三大搜索引擎开始大规模支持 https,https 已经成为现在保障网站完全的最基础需求,大量的供应商开始出现,并提供证书服务,但是对于一些非盈利性质的网站或博客站长,或公司测试环境也想使用https认证时,并不想在这上面投入太多的资金,于是乎理所当然会想要追求免费且有效的ssl证书了。


二、概念简介

Linux 下使用acme.sh生成Let's Encrypt泛域名免费证书第1张
Let’s Encrypt

官网:https://letsencrypt.org/

1、Let's Encrypt 是什么?

Let's Encrypt作为一个开源 SSL 的项目逐渐被广大用户传播和使用,是由 Mozilla、Cisco、Akamai、IdenTrust、EFF 等组织人员发起,主要的目的也是为了推进网站从 HTTP 向 HTTPS 过度的进程,目前已经有越来越多的商家加入和赞助支持。
和通过openssl等工具生成的证书不同,Let's Encrypt获得IdenTrust交叉签名,这就是说可以应用且支持包括 FireFox、Chrome 在内的主流浏览器的兼容和支持,可以说是真正意义上免费且有效的SSL证书。

2、acme.sh 是什么?

Let's Encrypt的最大贡献是它的ACME 协议,而acme.sh脚本可以通过ACME 协议Let's Encrypt生成免费的 SSL 证书。
一般生成的证书有效期只有60 ~ 90天,主要是为了避免认证私钥泄露,但是对于一些非盈利网站和个人网站来说基本是够用的,对于一些想长期使用的,现在已经有不少的 Let's Encrypt 自动续期脚本了,配好后就不用管了,非常方便。
acme.sh的使用非常“傻瓜式”,只要照着指令参数做就可以轻松搞定的,只需要指定自己的域名就可以用,根据-h的说明菜单指引,简单修改一下参数就可以拿来用的。


三、过程步骤

1、安装acme.sh

官方github:https://github.com/acmesh-official/acme.sh

1)自动安装

可能由于网络问题导致安装失败

curl  https://get.acme.sh | sh

2)手动安装(推荐)

git clone https://github.com/acmesh-official/acme.sh.git
cd ./acme.sh
./acme.sh --install
Linux 下使用acme.sh生成Let's Encrypt泛域名免费证书第2张
手动安装

3)创建cronjob,检测证书过期

#每天 0:00 点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书
0 0 * * * /root/.acme.sh/acme.sh --cron --home /root/.acme.sh > /dev/null

2、生成证书

acme.sh 实现了acme 协议支持的所有验证协议. 一般有两种方式验证:httpdns验证

1)http方式

http 方式需要在你的网站根目录下放置一个文件, 以此来验证你的域名所有权,完成验证,只需要指定域名, 并指定域名所在的网站根目录,acme.sh 会全自动的生成验证文件, 并放到网站的根目录, 然后自动完成验证,着方式较适合独立域名的站点使用,比如博客站点等。

./acme.sh  --issue  -d mydomain.com -d www.mydomain.com  --webroot  /home/wwwroot/mydomain.com/

如果你用的 apache服务器, acme.sh 还可以智能的从 apache的配置中自动完成验证, 你不需要指定网站根目录:

acme.sh --issue  -d mydomain.com   --apache

如果你用的 nginx服务器, 或者反代, acme.sh 还可以智能的从 nginx的配置中自动完成验证, 你不需要指定网站根目录:

acme.sh --issue  -d mydomain.com   --nginx

注意:无论是 apache 还是 nginx 模式, acme.sh在完成验证之后, 会恢复到之前的状态, 都不会私自更改你本身的配置,好处是你不用担心配置被搞坏, 也有一个缺点, 你需要自己配置 ssl 的配置, 否则只能成功生成证书, 你的网站还是无法访问https,为了安全, 建议手动更改配置

如果你还没有运行任何 web 服务, 80 端口是空闲的, 那么 acme.sh 还能假装自己是一个webserver, 临时听在80 端口, 完成验证

acme.sh  --issue -d mydomain.com   --standalone

2)dns方式

除了上述http方式外,另一种方式即手动配置DNS的方式,十分适合用于生成范解析证书。
优势:不需要任何服务器, 不需要任何公网 ip, 只需要 dns 的解析记录即可完成验证
劣势:如果不同时配置 Automatic DNS API,使用这种方式 acme.sh 将无法自动更新证书,每次都需要手动再次重新解析验证域名所有权

1. 生成证书记录

注意,第一次执行时使用--issue-d指定需要生成证书的域名

./acme.sh --issue -d *.example.com  --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please
Linux 下使用acme.sh生成Let's Encrypt泛域名免费证书第3张
申请域名证书
2. 在域名解析中添加TXT记录
Linux 下使用acme.sh生成Let's Encrypt泛域名免费证书第4张
解析TXT记录
验证解析生效

1⃣️ 安装nslookup

yum install -y bind-utils

2⃣️ 查看相应信息

nslookup -q=TXT *.example.com
3. 重新生成证书

注意,这里第二次执行是用的是--renew

./acme.sh --renew -d *.example.com  --yes-I-know-dns-manual-mode-enough-go-ahead-please
Linux 下使用acme.sh生成Let's Encrypt泛域名免费证书第5张
重新生成证书
4. 配置 Automatic DNS API

dns 方式的真正强大之处在于可以使用域名解析商提供的 api 自动添加 txt 记录完成验证,acme.sh目前支持cloudflare,dnspod,cloudxns,godaddy以及ovh等数十种解析商的自动集成。

以 dnspod 为例

先登录到dnspod账号, 生成你的api idapi key, 都是免费的,然后指定自己的需要的参数,如下

export DP_Id="1234"
export DP_Key="sADDsdasdgdsf"
acme.sh   --issue   --dns dns_dp   -d aa.com  -d www.aa.com

证书就会自动生成了. 这里给出的 api id 和 api key 会被自动记录下来, 将来你在使用 dnspod api 的时候, 就不需要再次指定了,直接生成就好了

acme.sh  --issue   -d  mydomain2.com   --dns  dns_dp
更详细的 api 用法:

https://github.com/Neilpang/acme.sh/blob/master/dnsapi/README.md


3、安装证书

上述操作后,我们已生成好了正式可用的ssl证书,之后需要加载正式文件才可以真正生效。正确的使用方法是使用--install-cert,并指定copy到目标目录相应位置

1)Apache 示例

./acme.sh --install-cert -d *.example.com \
--cert-file      /path/to/certfile/in/apache/cert.pem  \
--key-file       /path/to/keyfile/in/apache/key.pem  \
--fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \
--reloadcmd     "service apache2 force-reload"

2)Nginx 示例

./acme.sh --install-cert -d *.example.com \
--key-file /data/conf/nginx/ssl/example.com/key.pem \ 
--fullchain-file /data/conf/nginx/ssl/example.com/cert.pem

如果要直接加载配置,可以使用--reloadcmd "service nginx force-reload",但是由于nginx 的配置可能不尽相同,所以一般选择手动 reload nginx
注意:Nginx 的配置ssl_certificate使用/etc/nginx/ssl/fullchain.cer,而非/etc/nginx/ssl/<domain>.cer,否则 nginx -t 会报Chain issues Incomplete错误。

3)Tomcat 示例

echo $PWD
/root/.acme.sh/*.example.com
1. 导出.p12格式的证书
openssl pkcs12 -export -in fullchain.cer -inkey *.example.com.key -out *.example.com.p12 -name tomcat_letsencrypt
2. 将证书由.p12格式转换成.jks格式
keytool -importkeystore -deststorepass '123456' -destkeypass '123456' -destkeystore *.example.com.jks -srckeystore *.example.com.p12 -srcstoretype PKCS12 -srcstorepass '123456' -alias tomcat_letsencrypt
3. 修改Tomcat配置

修改 %tomcat%/conf/server.xml 文件,添加 keystoreFile 和 keystorePass 两行配置。其中,keystoreFile 指向 jks 证书文件,而 keystorePass 则为证书的密,修改后的关键配置如下:

<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" SSLEnabled="true"

maxThreads="150" scheme="https" secure="true"

clientAuth="false" sslProtocol="TLS"

keystoreFile="/home/test/*.example.com.jks"

keystorePass="123456"

/>

4、更新证书

目前证书在 60 天以后会自动更新, 你无需任何操作. 今后有可能会缩短这个时间, 不过都是自动的, 你不用关心


5、更新脚本

目前由于 acme 协议和 letsencrypt CA 都在频繁的更新, 因此 acme.sh 也经常更新以保持同步

1) 手动升级 acme.sh 到最新版

acme.sh --upgrade

2)自动升级

如果你不想手动升级, 可以开启自动升级,之后, acme.sh 就会自动保持更新了

acme.sh  --upgrade  --auto-upgrade

3)关闭自动更新

acme.sh --upgrade  --auto-upgrade  0

6、出错排查

如果出错, 请添加 debug log:

acme.sh  --issue  .....  --debug 

或者:

acme.sh  --issue  .....  --debug  2

参考文档:

1、acme.sh官方github
2、Let's Encrypt 官网
3、Linux 下使用 acme.sh 申请和管理 Let’s Encrypt 证书
4、申请Let's Encrypt泛域名免费证书(无需域名80端口)

免责声明:文章转载自《Linux 下使用acme.sh生成Let's Encrypt泛域名免费证书》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Web自动化测试之playwright:概述实现主机和虚拟机之间的虚拟串口通讯下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux中rz和sz命令用法详解

https://blog.csdn.net/magaiou/article/details/80322060 rz,sz是Linux/Unix同Windows进行ZModem文件传输的命令行工具。优点就是不用再开一个sftp工具登录上去上传下载文件。sz:将选定的文件发送(send)到本地机器rz:运行该命令会弹出一个文件选择窗口,从本地选择文件上传到Li...

maven 如何引入本地jar包

比如我下载了 一、怎么添加jar到本地仓库呢?步骤:1.cmd命令进入该jar包所在路径2.执行命令:mvn install:install-file -Dfile=lucene-queryparser-4.6.1.jar -DgroupId=org.apache.lucene -DartifactId=lucene-queryparser -Dversi...

Linux Python3 的一些坑

在使用 python3 过度的过程中总是会出现很多问题,这里慢慢收集记录,如有错误欢迎指正。 安装问题 Lunix 系统一般默认都是 python2.7.5 升级到 Python3.x 版本一般都需要通过编译安装。这里主要记录下编译安装需要依赖的包,我们需要先安装。 yum groupinstall 'Development Tools' yum i...

visual studio 容器工具首次加载太慢 vsdbgvs2017u5 exists, deleting 的解决方案

========== 正在准备容器 ==========正在准备 Docker 容器... C:WindowsSystem32WindowsPowerShellv1.0powershell.exe -NonInteractive -NoProfile -WindowStyle Hidden -ExecutionPolicy RemoteSigned -Fi...

linux安装samba

yum install samba system-config-samba samba-client samba-common 2、创建www账号 代码如下: mkdir -p /data/www chmod 777 /data/www chown -R www:www /data/www cat /etc/passwd | mksmbpasswd.sh&...

linux系统上nginx配置按天生成日志文件

nginx日志默认把日志都写到一个文件中,这样不方便管理,而且文件容量会越来越大,所以为了方便管理分析日志把日志按天切割,即每天生成一个新的日志文件。 实现步骤 1. 找到nginx日志文件 我的文件在/usr/local/nginx/logs这个路径下,有个access.log文件就是nginx的日志文件 2. 进入该路径创建个sh文件(称为批处理日志...