acme 免費(fèi)證書申請(qǐng)

acme.sh 實(shí)現(xiàn)了 acme 協(xié)議, 可以從 letsencrypt 生成免費(fèi)的證書.

主要步驟:

  1. 安裝 acme.sh
  2. 生成證書
  3. copy 證書到 nginx/apache 或者其他服務(wù)
  4. 更新證書
  5. 更新 acme.sh
  6. 出錯(cuò)怎么辦, 如何調(diào)試

下面詳細(xì)介紹.

1. 安裝 acme.sh

現(xiàn)在申請(qǐng) letsencrypt 需要填寫一個(gè)郵箱用來注冊(cè),但不需要驗(yàn)證,填一個(gè)你常用的郵箱即可,比如example@xxx.com

安裝很簡單,一行命令:

curl https://get.acme.sh | sh -s email=example@xxx.com

普通用戶和 root 用戶都可以安裝使用。

安裝過程進(jìn)行了以下幾步:

  • 將 acme.sh 安裝到 ~/.acme.sh/中。
  • 自動(dòng)為你創(chuàng)建 cronjob,每天 0:00 點(diǎn)自動(dòng)檢測所有的證書,如果快過期了,需要更新,則會(huì)自動(dòng)更新證書。

雖然腳本說明里有寫會(huì)自動(dòng)創(chuàng)建一個(gè) alias,但實(shí)操下來沒有創(chuàng)建,所以需要手動(dòng)創(chuàng)建一個(gè) alias 到當(dāng)前 shell 中:

  • bash: echo 'alias acme.sh=~/.acme.sh/acme.sh' >> ~/.bashrc
  • zsh: echo 'alias acme.sh=~/.acme.sh/acme.sh' >> ~/.zshrc
  • fish: echo 'alias acme.sh '~/.acme.sh/acme.sh'' >> ~/.config/fish/config.fish

安裝過程不會(huì)污染已有的系統(tǒng)任何功能和文件,所有的修改都限制在安裝目錄中:~/.acme.sh/

2. 生成證書

acme.sh 實(shí)現(xiàn)了 acme 協(xié)議支持的所有驗(yàn)證協(xié)議。一般有兩種方式驗(yàn)證:http 和 dns 驗(yàn)證。

2.1 http 方式(不推薦,但是簡單)

此方式需要在你的網(wǎng)站根目錄下放置一個(gè)文件,來驗(yàn)證你的域名所有權(quán),完成驗(yàn)證,然后就可以生成證書了。

以下代碼假設(shè)域名為mydomain.com

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

只需要指定域名,并指定域名所在的網(wǎng)站根目錄。acme.sh 會(huì)全自動(dòng)的生成驗(yàn)證文件,并放到網(wǎng)站的根目錄,然后自動(dòng)完成驗(yàn)證,最后會(huì)聰明的刪除驗(yàn)證文件,整個(gè)過程沒有任何副作用。

如果你用的 apache 服務(wù)器,acme.sh 還可以智能的從 apache 的配置中自動(dòng)完成驗(yàn)證,你不需要指定網(wǎng)站根目錄:

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

如果你用的 nginx 服務(wù)器,或者反代,acme.sh 還可以智能的從 nginx 的配置中自動(dòng)完成驗(yàn)證,你不需要指定網(wǎng)站根目錄:

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

:warning:無論是 apache 還是 nginx 模式,acme.sh在完成驗(yàn)證之后,會(huì)恢復(fù)到之前的狀態(tài),都不會(huì)私自更改你本身的配置。好處是你不用擔(dān)心配置被搞壞,也有一個(gè)缺點(diǎn),你需要自己配置 ssl 的配置,否則只能成功生成證書,你的網(wǎng)站還是無法訪問https。但是為了安全,你還是自己手動(dòng)改配置吧。

如果你還沒有運(yùn)行任何 web 服務(wù),80 端口是空閑的,那么 acme.sh 還能假裝自己是一個(gè)webserver,臨時(shí)聽在80 端口,完成驗(yàn)證:

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

2.2 DNS 方式

這種方式的好處是,你不需要任何服務(wù)器,不需要任何公網(wǎng) ip,只需要 dns 的解析記錄即可完成驗(yàn)證。壞處是,如果不同時(shí)配置 Automatic DNS API,使用這種方式 acme.sh 將無法自動(dòng)更新證書,每次都需要手動(dòng)再次重新解析驗(yàn)證域名所有權(quán)。

此處采用的是阿里云 DNS 解析服務(wù),其他服務(wù)商可以參考。

首先,創(chuàng)建一個(gè)阿里云 RAM 用戶:RAM 訪問控制 (aliyun.com)

capture_20230222135420606

起一個(gè)名字,選中OpenAPI 調(diào)用訪問

image-20230222135835565

創(chuàng)建成功后跳轉(zhuǎn)的頁面里有兩個(gè)字段AccessKey IDAccessKey Secret需要保存下來:

屏幕截圖_20230222_140757

將這兩個(gè)字段添加到環(huán)境變量:

# bash/zsh
export Ali_Key <AccessKey ID>
export Ali_Secret <AccessKey Secret>
# fish
set -x Ali_Key <AccessKey ID>
set -x Ali_Secret <AccessKey Secret>

上面的環(huán)境變量在接下來的申請(qǐng)命令中會(huì)保存到~/.acme.sh/account.conf中。

點(diǎn)擊上圖中的添加權(quán)限按鈕,給用戶授權(quán):

屏幕截圖_20230222_135948

搜索 dns 權(quán)限,添加云解析 DNS 權(quán)限,點(diǎn)確定即可:

屏幕截圖_20230222_140300

至此阿里云的 DNS API 管理就配置完成。

接下來只需要一行命令就可以把證書申請(qǐng)下來了:

acme.sh --issue --dns dns_ali -d mydomain.com

申請(qǐng)日志:

[Wednesday, February 22, 2023 PM01:31:25 HKT] Using CA: https://acme.zerossl.com/v2/DV90
[Wednesday, February 22, 2023 PM01:31:25 HKT] Single domain='mydomain.com'
[Wednesday, February 22, 2023 PM01:31:25 HKT] Getting domain auth token for each domain
[Wednesday, February 22, 2023 PM01:31:33 HKT] Getting webroot for domain='mydomain.com'
[Wednesday, February 22, 2023 PM01:31:33 HKT] Adding txt value: PGxt8rb5DGqnU3kq8B4j_0-L-7mftfcQqKrMb-IDIBU for domain:  _acme-challenge.mydomain.com
[Wednesday, February 22, 2023 PM01:31:40 HKT] The txt record is added: Success.
[Wednesday, February 22, 2023 PM01:31:40 HKT] Let's check each DNS record now. Sleep 20 seconds first.
[Wednesday, February 22, 2023 PM01:32:01 HKT] You can use '--dnssleep' to disable public dns checks.
[Wednesday, February 22, 2023 PM01:32:01 HKT] See: https://github.com/acmesh-official/acme.sh/wiki/dnscheck
[Wednesday, February 22, 2023 PM01:32:01 HKT] Checking mydomain.com for _acme-challenge.mydomain.com
[Wednesday, February 22, 2023 PM01:32:02 HKT] Domain mydomain.com '_acme-challenge.mydomain.com' success.
[Wednesday, February 22, 2023 PM01:32:02 HKT] All success, let's return
[Wednesday, February 22, 2023 PM01:32:02 HKT] Verifying: mydomain.com
[Wednesday, February 22, 2023 PM01:32:05 HKT] Processing, The CA is processing your order, please just wait. (1/30)
[Wednesday, February 22, 2023 PM01:32:11 HKT] Success
[Wednesday, February 22, 2023 PM01:32:11 HKT] Removing DNS records.
[Wednesday, February 22, 2023 PM01:32:11 HKT] Removing txt: PGxt8rb5DGqnU3kq8B4j_0-L-7mftfcQqKrMb-IDIBU for domain: _acme-challenge.mydomain.com
[Wednesday, February 22, 2023 PM01:32:19 HKT] Removed: Success
[Wednesday, February 22, 2023 PM01:32:19 HKT] Verify finished, start to sign.
[Wednesday, February 22, 2023 PM01:32:19 HKT] Lets finalize the order.
[Wednesday, February 22, 2023 PM01:32:19 HKT] Le_OrderFinalize='https://acme.zerossl.com/v2/DV90/order/juR2CPn0l-4Ye89H4bk5nA/finalize'
[Wednesday, February 22, 2023 PM01:32:22 HKT] Order status is processing, lets sleep and retry.
[Wednesday, February 22, 2023 PM01:32:22 HKT] Retry after: 15
[Wednesday, February 22, 2023 PM01:32:38 HKT] Polling order status: https://acme.zerossl.com/v2/DV90/order/juR2CPn0l-4Ye89H4bk5nA
[Wednesday, February 22, 2023 PM01:32:41 HKT] Downloading cert.
[Wednesday, February 22, 2023 PM01:32:41 HKT] Le_LinkCert='https://acme.zerossl.com/v2/DV90/cert/HhyIPG8YquZXqrqVSiWGlg'[Wednesday, February 22, 2023 PM01:32:43 HKT] Cert success.
-----BEGIN CERTIFICATE-----
MIID/DCCA4OgAwIBAgIRAJa3bPLyv3v1hOT0Ac7EPVYwCgYIKoZIzj0EAwMwSzEL
...
e6Q864KuMKPlWN9tocECMHdGhAlvwS5JUKsM36qFtNKG6u0hmivMi3ag4k4AWbmc
2k+mxNL86dlph8ENgqJrng==
-----END CERTIFICATE-----
[Wednesday, February 22, 2023 PM01:32:43 HKT] Your cert is in: /home/xxx/.acme.sh/mydomain.com_ecc/mydomain.com.cer[Wednesday, February 22, 2023 PM01:32:43 HKT] Your cert key is in: /home/xxx/.acme.sh/mydomain.com_ecc/mydomain.com.key
[Wednesday, February 22, 2023 PM01:32:43 HKT] The intermediate CA cert is in: /home/xxx/.acme.sh/mydomain.com_ecc/ca.cer
[Wednesday, February 22, 2023 PM01:32:43 HKT] And the full chain certs is there: /home/xxx/.acme.sh/mydomain.com_ecc/fullchain.cer

證書會(huì)保存到~/.acme.sh/<域名>目錄中。

3. copy/安裝 證書

前面證書生成以后,接下來需要把證書 copy 到真正需要用它的地方。

:warning: 默認(rèn)生成的證書都放在安裝目錄下:~/.acme.sh/,請(qǐng)不要直接使用此目錄下的文件,例如:不要直接讓 nginx/apache 的配置文件使用這下面的文件。這里面的文件都是內(nèi)部使用,而且目錄結(jié)構(gòu)可能會(huì)變化。

正確的使用方法是使用 --install-cert 命令,并指定目標(biāo)位置,然后證書文件會(huì)被copy到相應(yīng)的位置,例如:

Apache example:

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 example:

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"

(一個(gè)小提醒,這里用的是 service nginx force-reload,不是 service nginx reload,據(jù)測試,reload 并不會(huì)重新加載證書,所以用的 force-reload)

Nginx 的配置 ssl_certificate 使用 /etc/nginx/ssl/fullchain.cer ,而非 /etc/nginx/ssl/<domain>.cer ,否則 SSL Labs 的測試會(huì)報(bào) Chain issues Incomplete 錯(cuò)誤。

--install-cert命令可以攜帶很多參數(shù),來指定目標(biāo)文件,并且可以指定 reloadcmd,當(dāng)證書更新以后,reloadcmd 會(huì)被自動(dòng)調(diào)用,讓服務(wù)器生效。

值得注意的是,這里指定的所有參數(shù)都會(huì)被自動(dòng)記錄下來,并在將來證書自動(dòng)更新以后,被再次自動(dòng)調(diào)用。

4. 查看已安裝證書信息

$ acme.sh --info -d example.com
DOMAIN_CONF=/root/.acme.sh/example.com/example.com.conf
Le_Domain=example.com
Le_Alt=no
Le_Webroot=dns_ali
Le_PreHook=
Le_PostHook=
Le_RenewHook=
Le_API=https://acme-v02.api.letsencrypt.org/directory
Le_Keylength=
Le_OrderFinalize=https://acme-v02.api.letsencrypt.org/acme/finalize/23xxxx150/781xxxx4310
Le_LinkOrder=https://acme-v02.api.letsencrypt.org/acme/order/233xxx150/781xxxx4310
Le_LinkCert=https://acme-v02.api.letsencrypt.org/acme/cert/04cbd28xxxxxx349ecaea8d07
Le_CertCreateTime=1649358725
Le_CertCreateTimeStr=Thu Apr  7 19:12:05 UTC 2022
Le_NextRenewTimeStr=Mon Jun  6 19:12:05 UTC 2022
Le_NextRenewTime=1654456325
Le_RealCertPath=
Le_RealCACertPath=
Le_RealKeyPath=/etc/acme/example.com/privkey.pem
Le_ReloadCmd=service nginx force-reload
Le_RealFullChainPath=/etc/acme/example.com/chain.pem

5. 更新證書

目前證書在 60 天以后會(huì)自動(dòng)更新,你無需任何操作。今后有可能會(huì)縮短這個(gè)時(shí)間,不過都是自動(dòng)的,你不用關(guān)心。

請(qǐng)確保 cronjob 正確安裝,看起來是類似這樣的:

$ crontab  -l
56 * * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

6. 更新 acme.sh

目前由于 acme 協(xié)議和 letsencrypt CA 都在頻繁的更新,因此 acme.sh 也經(jīng)常更新以保持同步。

升級(jí) acme.sh 到最新版:

acme.sh --upgrade

如果你不想手動(dòng)升級(jí),可以開啟自動(dòng)升級(jí):

acme.sh --upgrade --auto-upgrade

之后,acme.sh 就會(huì)自動(dòng)保持更新了。

你也可以隨時(shí)關(guān)閉自動(dòng)更新:

acme.sh --upgrade --auto-upgrade  0
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,663評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,125評(píng)論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,506評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,614評(píng)論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,402評(píng)論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,934評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,021評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,168評(píng)論 0 287
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,690評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,596評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,784評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,288評(píng)論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,027評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,404評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,662評(píng)論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,398評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,743評(píng)論 2 370

推薦閱讀更多精彩內(nèi)容