冲冲的日志 發表於 2021-1-1 22:34:00

基于Let's Encrypt生成免费证书-支持多域名泛域名证书

<p></p><div class="toc"><div class="toc-container-header">目录</div><ul><li>客户端<ul><li>certbot</li><li>acme.sh</li></ul></li><li>安装acme.sh<ul><li>1. 自动安装</li><li>2. 手动安装</li><li>3. 测试收否安装成功</li></ul></li><li>使用acme.sh生成证书<ul><li>1. HTTP 方式</li><li>2. DNS 方式<ul><li>1. 生成证书记录</li><li>2. 在域名解析中手动添加TXT记录</li><li>3. 重新生成证书</li><li>4. 使用DNS API的模式进行证书申请 (支持自动更新)<ul><li>阿里云DNS API</li><li>DnsPod API</li></ul></li></ul></li></ul></li><li>查看/删除证书</li><li>使用acme.sh安装证书<ul><li>Nginx 示例</li><li>Apache 示例</li></ul></li><li>更新证书</li><li>更新acme.sh</li><li>删除acme.sh</li></ul></div><p></p>
<p>Let’s Encrypt是一个由非营利性组织互联网安全研究小组(ISRG)提供的免费、自动化和开放的证书颁发机构(CA)。<br>
简单的说,借助Let’s Encrypt颁发的证书可以为我们的网站免费启用HTTPS(SSL/TLS)</p>
<ul>
<li>https://letsencrypt.org/zh-cn/docs/</li>
</ul>
<h2 id="客户端">客户端</h2>
<p>Let’s Encrypt 使用 ACME 协议来验证您对给定域名的控制权并向您颁发证书。要获得 Let’s Encrypt 证书,您需要选择一个要使用的 ACME 客户端软件。Let’s Encrypt 不控制或审查第三方客户端,也不能保证其安全性或可靠性。</p>
<p>官方提供了几种证书的申请方式方法</p>
<ul>
<li>https://letsencrypt.org/zh-cn/docs/client-options/</li>
</ul>
<h3 id="certbot">certbot</h3>
<p>它既可以仅为您获取证书,也可以帮助您安装证书(如果您需要的话)。它易于使用,适用于许多操作系统,并且具有出色的文档。</p>
<p>https://certbot.eff.org/</p>
<h3 id="acmesh">acme.sh</h3>
<p>目前 Let's Encrypt 免费证书客户端最简单、最智能的 shell 脚本,可以自动发布和续订 Let's Encrypt 中的免费证书</p>
<ul>
<li>https://github.com/acmesh-official/acme.sh</li>
</ul>
<h2 id="安装acmesh">安装acme.sh</h2>
<h3 id="1-自动安装">1. 自动安装</h3>
<p><code>curl https://get.acme.sh | sh</code> (网络问题可能失败)</p>
<h3 id="2-手动安装">2. 手动安装</h3>
<pre><code class="language-shell">git clone https://github.com/acmesh-official/acme.sh.git
cd ./acme.sh
./acme.sh --install
</code></pre>
<p>安装过程如下:</p>
<ol>
<li>
<p>默认安装到当前用户的主目录$HOME下的.acme.sh文件夹中,即<code>~/.acme.sh/</code>,之后所有生成的证书也会按照域名放在这个目录下;</p>
</li>
<li>
<p>创建指令别名: alias acme.sh=~/.acme.sh/acme.sh, 通过<code>acme.sh</code>命令方便快速地使用 acme.sh 脚本</p>
</li>
<li>
<p>自动创建cronjob定时任务,每天 0:00 点自动检测所有的证书,如果快过期了,则会自动更新证书</p>
<pre><code class="language-shell">#每天 0:00 点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书
0 0 * * * /root/.acme.sh/acme.sh --cron --home /root/.acme.sh &gt; /dev/null
</code></pre>
</li>
</ol>
<h3 id="3-测试收否安装成功">3. 测试收否安装成功</h3>
<pre><code class="language-shell">user@owen-ubuntu:~$ acme.sh --version
https://github.com/acmesh-official/acme.sh
v2.8.8
</code></pre>
<p>如有版本信息输出则表示环境正常;如果提示命令未找到,执行source ~/.bashrc命令重载一下环境配置文件。</p>
<p>整个安装过程不会污染已有的系统任何功能和文件,所有的修改都限制在安装目录~/.acme.sh/中。</p>
<h2 id="使用acmesh生成证书">使用acme.sh生成证书</h2>
<h3 id="1-http-方式">1. HTTP 方式</h3>
<p>http 方式需要在你的网站根目录下放置一个文件, 以此来验证你的域名所有权,完成验证,只需要指定域名, 并指定域名所在的网站根目录,acme.sh 会全自动的生成验证文件, 并放到网站的根目录, 然后自动完成验证,该方式较适合独立域名的站点使用,比如博客站点等</p>
<pre><code class="language-shell">./acme.sh--issue-d mydomain.com -d www.mydomain.com--webroot/home/wwwroot/mydomain.com/

- issue 是acme.sh脚本用来颁发证书的指令;
- d是 --domain的简称,其后面须填写已备案的域名;
- w是 --webroot的简称,其后面须填写网站的根目录。
</code></pre>
<p><strong>示例:</strong></p>
<p><code>./acme.sh--issue-d devopsing.site -d www.devopsing.site--webroot/var/www/html/blog/</code></p>
<p>证书签发成功会有如下输出:</p>
<p><img src="https://img2022.cnblogs.com/blog/108082/202207/108082-20220726233802474-877218495.png" alt="acme-http" loading="lazy"></p>
<p>执行成功,默认为生成如下证书:</p>
<pre><code class="language-shell">root@ecs-ubuntu18:/etc/nginx/sites-available# ls ~/.acme.sh/devopsing.site/ -l
total 28
-rw-r--r-- 1 root root 1587 Dec 16 12:34 ca.cer
-rw-r--r-- 1 root root 1866 Dec 16 12:34 devopsing.site.cer
-rw-r--r-- 1 root root642 Dec 16 12:34 devopsing.site.conf
-rw-r--r-- 1 root root 1001 Dec 16 12:33 devopsing.site.csr
-rw-r--r-- 1 root root232 Dec 16 12:33 devopsing.site.csr.conf
-rw-r--r-- 1 root root 1679 Dec 16 12:33 devopsing.site.key
-rw-r--r-- 1 root root 3453 Dec 16 12:34 fullchain.cer
</code></pre>
<p>如果用的apache/nginx服务器, acme.sh 还可以智能的从 nginx的配置中自动完成验证, 不需要指定网站根目录:</p>
<p><code>acme.sh --issue-d mydomain.com   --apache</code></p>
<p><code>acme.sh --issue-d mydomain.com   --nginx</code></p>
<h3 id="2-dns-方式">2. DNS 方式</h3>
<p>适合用于生成范解析证书</p>
<p>优势:不需要任何服务器, 不需要任何公网 ip, 只需要 dns 的解析记录即可完成验证<br>
劣势:<code>如果不同时配置 Automatic DNS API,使用这种方式 acme.sh 将无法自动更新证书</code>,每次都需要手动再次重新解析验证域名所有权`</p>
<h4 id="1-生成证书记录">1. 生成证书记录</h4>
<ul>
<li>https://github.com/acmesh-official/acme.sh/wiki/DNS-manual-mode</li>
</ul>
<p>注意,第一次执行时使用 --issue,-d 指定需要生成证书的域名</p>
<p><code>./acme.sh --issue -d *.example.com--dns --yes-I-know-dns-manual-mode-enough-go-ahead-please</code></p>
<p><strong>参数解释:</strong></p>
<pre><code class="language-shell">--dns     Use dns manual mode or dns api. Defaults to manual mode when argument is omitted.

--yes-I-know-dns-manual-mode-enough-go-ahead-pleaseForce use of dns manual mode.
See:https://github.com/acmesh-official/acme.sh/wiki/dns-manual-mode
</code></pre>
<h4 id="2-在域名解析中手动添加txt记录">2. 在域名解析中手动添加TXT记录</h4>
<p>如果第一次添加该域名,会提示如下信息,需要在DNS解析中添加<code>TXT</code>记录,用作判断你是否拥有域名使用权</p>
<pre><code class="language-shell"> Add the following TXT record:
Domain: '_acme-challenge.devopsing.site'
TXT value: '-jEWdpI**************EVh01_a3ywrW426wmppjuDqXOs'
Please be aware that you prepend _acme-challenge. before your domain
so the resulting subdomain will be: _acme-challenge.devopsing.site
Please add the TXT records to the domains, and re-run with --renew.
Please add '--debug' or '--log' to check more details.
See: https://github.com/acmesh-official/acme.sh/wiki/How-to-debug-acme.sh
</code></pre>
<p><img src="https://img2022.cnblogs.com/blog/108082/202207/108082-20220726233802381-1514260996.png" alt="aliyun-dns" loading="lazy"></p>
<p>验证解析生效</p>
<pre><code class="language-shell">user@owen-ubuntu:~$ nslookup -q=TXT _acme-challenge.devopsing.site
Server:                127.0.0.53
Address:        127.0.0.53#53

Non-authoritative answer:
_acme-challenge.devopsing.site        text = "-jEWdpI****************1_a3ywrW426wmppjuDqXOs"

Authoritative answers can be found from:
</code></pre>
<h4 id="3-重新生成证书">3. 重新生成证书</h4>
<p>注意,这里第二次执行是用的是 --renew</p>
<p><code>./acme.sh --renew -d *.example.com--yes-I-know-dns-manual-mode-enough-go-ahead-please</code></p>
<p><strong>示例:</strong></p>
<p><code>./acme.sh --issue -d *.devopsing.site--dns --yes-I-know-dns-manual-mode-enough-go-ahead-please</code></p>
<p><img src="https://img2022.cnblogs.com/blog/108082/202207/108082-20220726233803069-83796113.png" alt="" loading="lazy"></p>
<pre><code class="language-shell">root@ecs-ubuntu18:/var/log/nginx# ls ~/.acme.sh/\*.devopsing.site/ -l
total 28
-rw-r--r-- 1 root root 1587 Dec 16 16:09ca.cer
-rw-r--r-- 1 root root 1846 Dec 16 16:09 '*.devopsing.site.cer'
-rw-r--r-- 1 root root613 Dec 16 16:09 '*.devopsing.site.conf'
-rw-r--r-- 1 root root980 Dec 16 16:09 '*.devopsing.site.csr'
-rw-r--r-- 1 root root211 Dec 16 16:09 '*.devopsing.site.csr.conf'
-rw-r--r-- 1 root root 1679 Dec 16 16:04 '*.devopsing.site.key'
-rw-r--r-- 1 root root 3433 Dec 16 16:09fullchain.cer
</code></pre>
<h4 id="4-使用dns-api的模式进行证书申请-支持自动更新">4. 使用DNS API的模式进行证书申请 (支持自动更新)</h4>
<p>dns 方式的真正强大之处在于可以使用域名解析商提供的 api 自动添加 txt 记录完成验证,acme.sh 目前支持 cloudflare, dnspod, cloudxns, godaddy 以及 ovh 等数十种解析商的自动集成。</p>
<ul>
<li>https://github.com/acmesh-official/acme.sh/wiki/dnsapi</li>
</ul>
<h5 id="阿里云dns-api">阿里云DNS API</h5>
<p>首先获取阿里云的操作API 的 AccessKey ID和AccessKey Secret</p>
<pre><code class="language-shell">export Ali_Key="key值"
export Ali_Secret="key Secret"
# 给出的 api id 和 api key 会被自动记录下,下次就不用再次执行上述命令

acme.sh --issue --dns dns_ali -d *.example.com --force
</code></pre>
<p><strong>示例:</strong></p>
<pre><code class="language-shell">export Ali_Key="LTAI4F****i8qEeKeRios2r"
export Ali_Secret="nIpymix0s****a0bJNgERE0QzjSrkF"
acme.sh --issue --dns dns_ali -d *.devopsing.site --force
</code></pre>
<h5 id="dnspod-api">DnsPod API</h5>
<pre><code class="language-shell">export DP_Id="1234"
export DP_Key="sADDsdasdgdsf"
acme.sh --issue--dns dns_dp   -d *.example.com
</code></pre>
<h2 id="查看删除证书">查看/删除证书</h2>
<p>查看安装证书 <code>acme.sh --list</code></p>
<p><img src="https://img2022.cnblogs.com/blog/108082/202207/108082-20220726233802603-1646897951.png" alt="acme-list" loading="lazy"></p>
<p>删除证书 <code>acme.sh remove &lt;SAN_Domains&gt;</code></p>
<pre><code class="language-shell">user@ecs-ubuntu18:~$ acme.sh remove devopsing.site
devopsing.site is removed, the key and cert files are in /home/user/.acme.sh/devopsing.site
You can remove them by yourself.
</code></pre>
<h2 id="使用acmesh安装证书">使用acme.sh安装证书</h2>
<p>上面生成的证书放在了<code>~/.acem.sh/&lt;domain&gt;</code>目录,使用<code>--installcert</code>命令,指定目标位置,可将证书copy 到相应的位置</p>
<h3 id="nginx-示例">Nginx 示例</h3>
<pre><code class="language-shell">acme.sh --installcert -d &lt;domain&gt;.com \
--key-file /etc/nginx/ssl/&lt;domain&gt;.key \
--fullchain-file /etc/nginx/ssl/fullchain.cer \
--reloadcmd "service nginx force-reload"
</code></pre>
<p>如果要直接加载配置,可以使用 --reloadcmd "service nginx force-reload",但是由于nginx 的配置可能不尽相同,所以一般选择手动 reload nginx</p>
<p>注意:Nginx 的配置 ssl_certificate 使用 /etc/nginx/ssl/fullchain.cer ,而非 /etc/nginx/ssl/<domain>.cer ,否则 SSL Labs 的测试会报 Chain issues Incomplete 错误</domain></p>
<pre><code class="language-conf">server {
      listen 443 ssl;
      server_name demo.com;
      
      ssl on;
      ssl_certificate      /etc/nginx/ssl/fullchain.cer;
      ssl_certificate_key/etc/nginx/ssl/&lt;domain&gt;.key;
</code></pre>
<h3 id="apache-示例">Apache 示例</h3>
<p>./acme.sh --install-cert -d *.example.com <br>
--cert-file      /path/to/certfile/in/apache/cert.pem<br>
--key-file       /path/to/keyfile/in/apache/key.pem<br>
--fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem <br>
--reloadcmd   "service apache2 force-reload"</p>
<h2 id="更新证书">更新证书</h2>
<p>目前 Let's Encrypt 的证书有效期是90天,时间到了会自动更新,无需任何操作。但是,也可以强制续签证书:</p>
<p><code>acme.sh --renew -d example.com --force</code></p>
<p>注:手动添加DNS获取证书的方式无法自动更新,但是使用DNS API的方式进行获取证书可以在证书有效期后自动更新, 你无需任何操作</p>
<p>强制执行更新任务 <code>acme.sh --cron -f</code></p>
<p><img src="https://img2022.cnblogs.com/blog/108082/202207/108082-20220726233802704-1101607499.png" alt="acme-cron" loading="lazy"></p>
<h2 id="更新acmesh">更新acme.sh</h2>
<p>acme 协议和 letsencrypt CA 都在频繁的更新, 因此 acme.sh 也经常更新以保持同步。</p>
<p>手动更新: <code>acme.sh --upgrade</code></p>
<p>开启自动更新:<code>acme.sh --upgrade --auto-upgrade</code></p>
<p>取消自动更新: <code>acme.sh --upgrade --auto-upgrade 0</code></p>
<h2 id="删除acmesh">删除acme.sh</h2>
<pre><code class="language-shell">user@owen-ubuntu:~$ acme.sh --uninstall
Removing cron job
LE_WORKING_DIR='/home/user/.acme.sh'
Uninstalling alias from: '/home/user/.bashrc'
The keys and certs are in "/home/user/.acme.sh", you can remove them by yourself.
</code></pre>
<hr>
<img src="https://images.cnblogs.com/cnblogs_com/FLY_DREAM/1840268/o_230612134535_wechat.png"><br><br>
来源:https://www.cnblogs.com/FLY_DREAM/p/14221136.html
頁: [1]
查看完整版本: 基于Let's Encrypt生成免费证书-支持多域名泛域名证书