使用 acme.sh 為網站生成永久免費證書

ztlcoder發表於2021-12-30

HTTP 2.0 時代幾乎所有的網站都是 https 訪問方式了,想要實現 https 訪問,安全證照就是繞不過去的坎,域名服務商一般都會提供了免費證照註冊,網上也可以搜尋很多,常見的免費證照的頒發機構有 亞洲誠信Let’s EncryptZoreSSL 等。關於免費證照的優缺點,我給分析了一下:

優點:

  • 免費

缺點:

  • 個數限制
  • 時間限制
  • 無法申請通配證照

只要有一個 免費 的優點就夠了,缺點都是可以克服克服的?。而克服這些缺點的英雄就是 acme.shacme.sh 實現了 acme 協議, 可以從 Let’s EncryptZoreSSLbuypasssslcom 生成免費的證照。

1.安裝 acme.sh

以下三種任選一種即可,把 my@example.com 修改成自己的郵箱。

安裝過程不會汙染任何功能和檔案,所有的修改都限制在安裝目錄中:~/.acme.sh/

(1)通過 https://get.acme.sh 安裝
curl https://get.acme.sh | sh -s email=my@example.com

或者

wget -O - https://get.acme.sh | sh -s email=my@example.com
(1)通過 GitHub 安裝
curl https://raw.githubusercontent.com/acmesh-official/acme.sh/master/acme.sh | sh -s -- --install-online -m my@example.com

或者

wget -O - https://raw.githubusercontent.com/acmesh-official/acme.sh/master/acme.sh | sh -s -- --install-online -m my@example.com
(3)通過 git clone 安裝
# 使用加速通道
git clone https://github.com.cnpmjs.org/acmesh-official/acme.sh.git
cd acme.sh
./acme.sh --install -m my@example.com
安裝過程進行了以下幾步:

(1)acme.sh 安裝到 home 目錄下

~/.acme.sh/

(2)建立一個 bashalias

alias acme.sh=~/.acme.sh/acme.sh

(3)建立 cronjob,每天 0:00 自動檢測所有證照,如果快過期了,會自動更新證照。

2.生成證照

以下兩種任選一種即可,把 mydomain.com 更換成自己的域名。

如何生成泛域名證照,請參閱 使用 acme.sh 生成免費的泛域名證照

(1)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 不會自動修改配置檔案,需要手動修改配置檔案,否則無法訪問 https

如果還沒有執行任何 web 服務,80 埠是空閒的,那麼 acme.sh 還能假裝自己是一個 webserver,臨時監聽 80 埠,完成驗證:

acme.sh --issue -d mydomain.com --standalone
(2)DNS 方式

好處:不需要任何伺服器, 不需要任何公網 IP, 只需要 DNS 的解析記錄即可完成驗證。

壞處:如果不同時配置 Automatic DNS API 則 acme.sh 將無法自動更新證照。

acme.sh --issue --dns -d mydomain.com \
 --yes-I-know-dns-manual-mode-enough-go-ahead-please

acme.sh 會生成相應的解析記錄,到域名解析中新增 TXT 記錄,解析成功後,重新生成證照。

acme.sh --renew -d mydomain.com \
  --yes-I-know-dns-manual-mode-enough-go-ahead-please

DNS 方式的真正強大之處在於可以使用域名解析商提供的 api 自動新增 TXT 記錄完成驗證。

acme.sh 目前支援幾十種域名服務商:dnsapi

以 dnspod 為例, 需要先登入到 dnspod 賬號, 生成 api idapi key

export DP_Id="1234"

export DP_Key="qwertyuiopasdfghjkl"

acme.sh --issue --dns dns_dp -d mydomain.com -d www.mydomain.com

acme.sh 會自動生成證照,並且會記錄 api idapi key 以後再使用 dnspod api 時就不需要再指定了。

3.複製/安裝 證照

注意!預設生成的證照都放在安裝目錄下:~/.acme.sh/,不要直接使用此目錄下的檔案,這裡面的檔案都是內部使用, 而且目錄結構可能會變化。

正確的使用方法是使用 --install-cert 命令,指定目標位置,證照檔案會被複制到相應的位置。

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"
Nginx
acme.sh --install-cert -d example.com \
--key-file       /path/to/keyfile/in/nginx/key.pem  \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd     "service nginx force-reload"

4.更新證照

證照在 60 天以後會自動更新,無需任何操作。

5.更新 acme.sh

升級 acme.sh 到最新版

acme.sh --upgrade

如果不想手動升級,也可以開啟自動升級

acme.sh  --upgrade  --auto-upgrade

關閉自動更新

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

6.出錯怎麼辦

在命令後新增 --debug--debug 2 比如:

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

# 或

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

或者查閱日誌

~/.acme.sh/acme.sh.log

該文章也發表在我的個人部落格 不二部落格 上了,歡迎來訪!

本作品採用《CC 協議》,轉載必須註明作者和本文連結
不二

相關文章