之前看過一篇教你快速擼一個免費HTTPS證書的文章,通過Certbot來管理Let's Encrypt的證書,使用前需要安裝" />

国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

18143453325 在線咨詢 在線咨詢
18143453325 在線咨詢
所在位置: 首頁 > 營銷資訊 > 建站知識 > 用acme.sh幫你免費且自動更新的HTTPS證書,省時又省力

用acme.sh幫你免費且自動更新的HTTPS證書,省時又省力

時間:2023-02-23 07:03:01 | 來源:建站知識

時間:2023-02-23 07:03:01 來源:建站知識

用acme.sh幫你免費且自動更新的HTTPS證書,省時又省力:

前言

一直想更新一下https,最近剛好有點空,就實現(xiàn)了一下。

之前看過一篇教你快速擼一個免費HTTPS證書的文章,通過Certbot來管理Let's Encrypt的證書,使用前需要安裝一堆庫,覺得不太友好。所謂條條大路通羅馬,肯定還有其他方法可以做這個事情。

經(jīng)過一番研究oneinstack的內(nèi)部,也發(fā)現(xiàn)了oneinstack使用 acme.sh 這個庫,這個是用Shell腳本編寫的,不需要安裝其他東西,比較純凈,覺得比較適合自己,記錄一下過程。

準(zhǔn)備工作

  1. 一個已解析好的域名(可以用http來訪問)。
  2. 開啟服務(wù)器的443端口防火墻。

步驟

一、安裝acme.sh

curl https://get.acme.sh | sh
具體參考這幾篇:
https://www.v2ex.com/t/656367
https://www.v2ex.com/t/656394
https://m.cnbeta.com/view/960295.htm一些網(wǎng)站https證書出現(xiàn)問題的情況分析
(最后這篇說很多大站都受影響了)
HTTPS 加密通信挺重要的,之前也聽說過 MITM(中間人攻擊),不過這還是第一次聽說證書被劫持的……

怎么說好呢,應(yīng)該可以說網(wǎng)絡(luò)上不能保證絕對安全吧,或者說絕對安全是不存在的。

想起來之前搭建的一個服務(wù)還沒上 HTTPS,然而想不起來之前是怎么配置 SSL 證書的了,然后又得去找資料煩死了,于是這回順便來記錄一下好了啦。(攤手

通過 Let’s encrypt 可以獲得 90 天免費且可續(xù)期的 SSL 證書,而利用 acme.sh 可以自動生成和更新,就來介紹一下配置的過程吧。

當(dāng)然,你還可以嘗試用 Let’s Encrypt 的 certbot 工具來簽發(fā)證書,不過要裝一堆庫吧,我也不記得了……
下面的內(nèi)容涉及 acme.sh 的安裝,證書的簽發(fā)及認(rèn)證,如何安裝到 nginx,以及自動更新證書、更新 acme.sh 等。

0x01 安裝 acme.sh

bash

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

bash

wget -O - https://get.acme.sh | sh執(zhí)行上面的命令,它會:

安裝完成后要自行重啟命令行,或者重新加載一下.bashrc文件source ~/.bashrc)。

然后看一下有沒有生效。

bash

$ acme.sh -hhttps://github.com/acmesh-official/acme.shv2.8.6Usage: acme.sh command ...[parameters]....Commands:--help, -h Show this help message.--version, -v Show version info.--install Install acme.sh to your system.--uninstall Uninstall acme.sh, and uninstall the cron job.--upgrade Upgrade acme.sh to the latest code from https://github.com/acmesh-official/acme.sh.--issue Issue a cert.--signcsr Issue a cert from an existing csr.--deploy Deploy the cert to your server.--install-cert Install the issued cert to apache/nginx or any other server.# ......

2 簽發(fā) SSL 證書

簽發(fā) SSL 證書需要證明這個域名是屬于你的,即域名所有權(quán),一般有兩種方式驗證:http 和 dns 驗證。

通過 acme.sh 可以簽發(fā)單域名、多域名、泛域名證書,還可以簽發(fā) ECC 證書。為了簡單起見,這里以單域名證書為例,后面再拓展一下好了。

下面任意一種方式只要安裝成功了就行!

注意:這一步只是生成了證書,并沒有進(jìn)行配置,因此訪問網(wǎng)站當(dāng)然上不了 https。

2.1 HTTP 驗證

這種方式 acme.sh 會自動在你的網(wǎng)站根目錄下放置一個文件,來驗證你的域名所有權(quán),驗證之后就簽發(fā)證書,最后會自動刪除驗證文件。

前提是要綁定的域名已經(jīng)綁定到了所在服務(wù)器上,且可以通過公網(wǎng)進(jìn)行訪問!

2.1.1 Webroot mode

假設(shè)服務(wù)器在運(yùn)行著的,網(wǎng)站域名為 example.com,根目錄為 /home/wwwroot/example.com。那么只需要執(zhí)行下面這條語句就行。

bash

acme.sh --issue -d example.com -w /home/wwwroot/example.com2.1.2 Apache / Nginx mode

如果用的是 Apache 或者 Nginx 服務(wù)器,可以自動尋找配置文件來進(jìn)行簽發(fā)。

bash

acme.sh --issue -d example.com --apache # Apacheacme.sh --issue -d example.com --nginx # Nginx如果找不到配置文件的話可以自行配置。

bash

acme.sh --issue -d example.com --nginx /etc/nginx/nginx.conf # 指定nginx的confacme.sh --issue -d example.com --nginx /etc/nginx/conf.d/example.com.conf # 指定網(wǎng)站的conf2.1.3 Standalone mode

這種方式下,acme.sh 會自己建立一個服務(wù)器來完成簽發(fā)。主要適合的是沒有建立服務(wù)器的情況,不過其實有服務(wù)器的話只要暫時關(guān)閉,不造成端口沖突就能使用。

http 模式,80端口:

bash

acme.sh --issue -d example.com --standalone如果用了反代之類的不是 80 端口,則可以手動指定。

bash

acme.sh --issue -d example.com --standalone --httpport 88當(dāng)然它還支持 tls 模式,不是 443 端口的話也可以自行指定。

bash

acme.sh --issue -d example.com --alpnacme.sh --issue -d example.com --alpn --tlsport 8443 # 自行指定tls端口

2.2 DNS 驗證

這種方式下,不需要任何服務(wù)器,不需要任何公網(wǎng) ip,只需要 dns 的解析記錄即可完成驗證。

比如說服務(wù)器不能直接公網(wǎng)訪問,以及某些 VPS 直接綁定域名沒備案的話是上不去的,就需要采用這種方案了。(我的就是了

當(dāng)然,手里有域名只是想生成一個證書而已也可以這么用。

2.2.1 DNS API mode

這種方式賊強(qiáng)大,直接可以利用域名服務(wù)商提供的 API 就可以自動幫你添加 TXT 記錄完成驗證和證書簽發(fā)。而且60天后還可以自動完成續(xù)期。(我就是用這種方式實現(xiàn)噠~

比如說 CloudFlare 的,在這里獲取你的API Key??梢杂萌?API Key,將參數(shù)導(dǎo)入到命令行。

bash

export CF_Token="sdfsdfsdfljlbjkljlkjsdfoiwje"export CF_Account_ID="xxxxxxxxxxxxx"為了限制權(quán)限,可以新建一個區(qū)域的 API Key. 這里只需要 Zone.DNS 的編輯權(quán)限(restrict the API Token only for write access to Zone.DNS for a single domain)就行。

bash

export CF_Token="sdfsdfsdfljlbjkljlkjsdfoiwje"export CF_Account_ID="xxxxxxxxxxxxx"export CF_Zone_ID="xxxxxxxxxxxxx"Account_IDZone_ID 在域名的管理頁面右下方可以得到。

而后再簽發(fā)證書。

bash

acme.sh --issue --dns dns_cf -d example.com之后這些配置信息會保存到 ~/.acme.sh/account.conf 這個文件里,在證書續(xù)期或者其他利用 CF 進(jìn)行驗證的時候會自動調(diào)用。

當(dāng)然,國內(nèi)一般用的是 DNSPod,也提供了 API,類似配置就好了。

bash

export DP_Id="1234"export DP_Key="sADDsdasdgdsf"acme.sh --issue --dns dns_dp -d example.com -d www.example.com(這個其實就是多域名簽發(fā)了)

更多例子參考官方 Wiki 好了→ How to use DNS API

2.2.2 DNS manual mode

適合域名服務(wù)商沒有提供 API 的情況,需要自己在域名配置一個 TXT 記錄,且不能自動續(xù)期,每次都需要重新配置。

bash

acme.sh --issue -d example.com --dns -d www.example.com更多請參考官方教程 DNS manual mode。

2.2.3 DNS alias mode

如果域名服務(wù)商沒有提供 API,或者是一個挺重要的域名,為了安全不希望或者不方便直接配置這個域名的解析記錄,可以通過另一個沒那么重要的域名(可能是專門用來簽發(fā)證書的)間接進(jìn)行配置。

實際上還是需要有一個域名來驗證所有權(quán)啦!

更多參考官方教程 DNS alias mode 好了。

2.3 多域名配置

多個域名簽發(fā)同一張證書。只需要在驗證方式之后添加多個 -d <YourDomainHere> 參數(shù)就行。

bash

acme.sh --issue -d example.com -w /home/wwwroot/example.com -d www.example.comacme.sh --issue -d example.com --standalone -d www.example.comacme.sh --issue -d example.com --dns -d www.example.com也可以多個域名指定不同的驗證方式,例如

bash

acme.sh --issue /-d aa.com -w /home/wwwroot/aa.com /-d bb.com --dns dns_cf /-d cc.com --apache /-d dd.com -w /home/wwwroot/dd.com

2.4 泛域名配置

Wildcard certificates

同理,只需要加個*就好。不過好像只適用于 DNS 驗證的方式。

bash

acme.sh --issue -d example.com -d '*.example.com' --dns dns_cf

2.5 簽發(fā) ECC 證書

默認(rèn)簽發(fā)的都是基于 RSA 密鑰加密的證書,而 ECC (Elliptic Curve Cryptography, 橢圓曲線密碼) 密鑰的保密性比 RSA 更好,密鑰長度更短,更能對抗量子解密等,目前現(xiàn)代的操作系統(tǒng)和瀏覽器都支持 ECC 證書了(Windows XP 及其之前的就算了)。

Let's Encrypt 提供了 ECDSA 證書的簽發(fā),且 acme.sh 也支持。

我看網(wǎng)上的教程基本沒講 ECC 證書的簽發(fā),這里就來整一下唄!

其實只需要加上一個以 ec- 為前綴的 --keylength 參數(shù)(或 -k)就可以了。理論上上面的各種驗證方式都適用。

比如

bash

acme.sh --issue -w /home/wwwroot/example.com -d example.com --keylength ec-256 # 單域名acme.sh --issue -w /home/wwwroot/example.com -d example.com -d www.example.com --keylength ec-256 # 多域名支持以下長度的證書,一般就用 ec-256 就行了。

  1. ec-256 (prime256v1, “ECDSA P-256”)
  2. ec-384 (secp384r1, “ECDSA P-384”)
  3. ec-521 (secp521r1, “ECDSA P-521”, which is not supported by Let’s Encrypt yet.)


0x03 安裝(copy)證書

簽發(fā)證書成功后,需要把證書安裝或者復(fù)制到真正需要的地方,如 nginx / apache 的目錄下。

官方說必須用下面的命令來安裝證書,不能直接用 ~/.acme.sh/目錄下的證書文件,因為那只能內(nèi)部使用,且未來目錄結(jié)構(gòu)可能會更改。

我們只需要使用 --installcert 命令,指定目標(biāo)位置,然后證書文件就會被 copy 到相應(yīng)的位置了。

其中域名是必須的,其他參數(shù)是可選的。

有必要的話,可能需要對證書文件的所屬權(quán)限進(jìn)行一些設(shè)置。(我這邊沒有問題呢,就略了吧)

3.1 Nginx

bash

acme.sh --installcert -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"比如你可以在 nginx 的目錄下新建一個 ssl 目錄,然后把證書安裝 / copy 過去。

bash

acme.sh --installcert -d example.com /--key-file /etc/nginx/ssl/example.com.key /--fullchain-file /etc/nginx/ssl/example.com.fullchain.cer /--reloadcmd "service nginx force-reload"
這里用的是 service nginx force-reload, 不是 service nginx reload, 據(jù)測試, reload 并不會重新加載證書, 所以用的 force-reload。
Nginx 配置 ssl_certificate 使用 /etc/nginx/ssl/fullchain.cer ,而非 /etc/nginx/ssl/.cer ,否則 SSL Labs 的測試會報 Chain issues Incomplete 錯誤。

3.2 Apache

bash

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"在命令中的 reloadcmd 參數(shù)很重要! 這個用來指定證書更新(Renew)后執(zhí)行的命令,從而使續(xù)期后的證書生效。

默認(rèn) 60 天就會續(xù)期一次,上面這些參數(shù)會記錄下來并自動執(zhí)行。非常方便

4 生成 dhparam.pem 文件(可選)

bash

openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048這一步是為了增強(qiáng) SSL 的安全性。這里生成一個更強(qiáng)壯的 DHE 參數(shù)。

前向安全性(Forward Secrecy)的概念很簡單:客戶端和服務(wù)器協(xié)商一個永不重用的密鑰,并在會話結(jié)束時銷毀它。服務(wù)器上的 RSA 私鑰用于客戶端和服務(wù)器之間的 Diffie-Hellman 密鑰交換簽名。從 Diffie-Hellman 握手中獲取的預(yù)主密鑰會用于之后的編碼。因為預(yù)主密鑰是特定于客戶端和服務(wù)器之間建立的某個連接,并且只用在一個限定的時間內(nèi),所以稱作短暫模式(Ephemeral)。
使用了前向安全性,如果一個攻擊者取得了一個服務(wù)器的私鑰,他是不能解碼之前的通訊信息的。這個私鑰僅用于 Diffie Hellman 握手簽名,并不會泄露預(yù)主密鑰。Diffie Hellman 算法會確保預(yù)主密鑰絕不會離開客戶端和服務(wù)器,而且不能被中間人攻擊所攔截。
nginx 依賴于 OpenSSL 給 Diffie-Hellman (DH)的輸入?yún)?shù)。不幸的是,這意味著 Diffie-Hellman Ephemeral(DHE)將使用 OpenSSL 的默認(rèn)設(shè)置,包括一個用于密鑰交換的1024位密鑰。因為我們正在使用2048位證書,DHE 客戶端就會使用一個要比非 DHE 客戶端更弱的密鑰交換。
更多參考這里 Guide to Deploying Diffie-Hellman for TLS 吧。

5 配置 Nginx

沒用過 Apache,這里只說 Nginx 好了。(其實也不怎么會用(小聲bb

修改網(wǎng)站的 conf 配置文件,加入 SSL 的相關(guān)配置。

nginx

server {server_name example.com;listen 443 ssl http2 default_server;listen [::]:443 ssl http2 default_server;# ...# ssl 相關(guān)配置ssl_certificate /etc/nginx/ssl/example.com.fullchain.cer;ssl_certificate_key /etc/nginx/ssl/example.com.key;ssl_dhparam /etc/nginx/ssl/dhparam.pem;ssl_protocols TLSv1 TLSv1.1 TLSv1.2;ssl_ciphers '[ECDHE-ECDSA-AES128-GCM-SHA256|ECDHE-ECDSA-CHACHA20-POLY1305|ECDHE-RSA-AES128-GCM-SHA256|ECDHE-RSA-CHACHA20-POLY1305]:ECDHE+AES128:RSA+AES128:ECDHE+AES256:RSA+AES256:ECDHE+3DES:RSA+3DES';ssl_prefer_server_ciphers on;# ...}ssl_dhparam /etc/nginx/ssl/dhparam.pem; 是在 0x04 步驟中生成的,可選。

ssl_ciphers用于指定加密套件,這里采用的是 CloudFlare 家的,具體也不是很清楚 emmm??梢詤⒖家幌?Mozilla 的 Wiki:Security/Server Side TLS

更多參數(shù)可以參考 nginx 的文檔:Module ngx_http_ssl_module

TLSv1.3(可選)

現(xiàn)在很多網(wǎng)站都上 TLSv1.3 了,證書檢測的網(wǎng)站對于 TLSv1、TLSv1.1 都認(rèn)為不安全了,F(xiàn)irefox 自 74.0 版本開始也完全放棄對加密協(xié)議 TLS 1.0TLS 1.1 的支持了。

對于 TLSv1.3 的配置,需要安裝最新版的 openssl(OpenSSL 1.1.1 built with TLSv1.3或更高),而后重新編譯 nginx,是有點麻煩這里懶得弄了,后面需要再折騰吧。

開啟 HSTS(可選)

當(dāng)然,為了更加安全,可以選擇開啟 HSTS(HTTP Strict Transport Security,HTTP嚴(yán)格傳輸安全協(xié)議),強(qiáng)制瀏覽器通過 https 進(jìn)行訪問。需要在 location 下的設(shè)置中加入一個 header。

nginx

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";接下來的一年(即31536000秒)中,瀏覽器看到 header 中包含 Strict-Transport-Security 的話就會自動切換到 https。

但是在首次訪問網(wǎng)站時如果被劫持了,瀏覽器還是可能會通過 HTTP 明文傳遞信息。為此,Chrome 維護(hù)了一個 HSTS preload list,內(nèi)置在瀏覽器中,對于 Chrome, Firefox, Opera, Safari, IE 11 and Edge 等主流瀏覽器也適用??梢栽谶@里提交你的域名到這個列表里。(不過提交之前要考慮好,全站上 https 噢

如果 TLS 證書無效或不可信,用戶不能忽略瀏覽器警告繼續(xù)訪問網(wǎng)站。這就是前幾天訪問 GitHub (Pages) 等網(wǎng)站被攔下來的原因了。


上面的配置完成后檢查一下配置是否正確,而后重啟 nginx。

bash

nginx -tsystemctl restart nginx之后就可以試一下能不能通過 https 來訪問自己的網(wǎng)站啦!

到這里 SSL 配置就告一段落了,下面是一些 acme.sh 的維護(hù)相關(guān)的了。

6 更新證書

證書的有效期為 90 天,acme.sh 會 60 天更新(Renew)一次。

在安裝 acme.sh 的時候就自動配置了一條 cron 任務(wù)了,會每天檢查證書的情況。當(dāng)然可以到 crontab 里看一下。

bash

# crontab -l43 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null也可以試著用上面這條命令執(zhí)行看一下相關(guān)的配置是否正確。

強(qiáng)制更新可以這樣。

bash

acme.sh --renew -d example.com --forceacme.sh --renew -d example.com --force --ecc # 如果用的是ECC證書

0x07 停止更新證書

查看證書列表

bash

acme.sh --list停止 Renew

bash

acme.sh --remove -d example.com [--ecc]之后手動把目錄下的證書移除就行。

0x08 升級 acme.sh

bash

acme.sh --upgrade # 手動升級acme.sh --upgrade --auto-upgrade # 自動升級acme.sh --upgrade --auto-upgrade 0 # 停止自動升級

小結(jié)

除了上面這些配置之外,acme.sh 還提供了通知提醒,可以調(diào)用其他 API 來推送提醒,具體參考官方Wiki:notify。

總之感覺這個工具還是很實用的,大大降低了 SSL 配置的門檻呢。

草(一種植物),感覺我把官方的教程翻譯了,然后又找了一些其他的資料整合起來了的亞子emmm。不過大部分還是自己手碼的字啦!

實際上我這次配置的是 ECC 密鑰的泛域名證書,用的是 DNS API 的模式。其實幾個月前就折騰過 SSL 證書的配置了,然而過了就忘了,當(dāng)時先是用 HTTP 模式進(jìn)行驗證,發(fā)現(xiàn)行不通才換的 DNS 模式。這次干脆一起理一遍好了,過程中發(fā)現(xiàn)原來 HTTP 模式驗證比我想的還要強(qiáng)大,只是需求(主要是需要泛域名證書)對不上罷了。

怎么說好呢,絕對安全不大可能,都是想方設(shè)法盡可能相對安全一些呢。

希望這一篇不會浪費您的寶貴時間呢,有用的話歡迎給我買點好吃的/buy me a coffee(餓了喵

溜了溜了(

References & Extensive Reading

下面有的是官方文檔,有的是博客之類的,由于時效性有些內(nèi)容可能不適用了。注意一下就吼。

參考文章

關(guān)鍵詞:證書,更新,免費

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點擊下載Chrome瀏覽器
關(guān)閉