Nginx 實現全站 HTTPS( HTTP+DNS 通配符證書)

前段時間因需求在阿里雲上搭建過一次基於let's encrypt的nginx免費通配符證書,當時因爲有阿里雲的API接口,搭建的比較順利,最近由於公司內部測試需要,測試機沒有類似阿里雲之類的API接口,在搭建的時候發現http-01的方式沒法配置通配符證書,最後在github上找到了一種方法,所以現在就把兩種方式都回顧下。

acme原理:https://blog.csdn.net/canghaiguzhou/article/details/79945001

ACME 協議支持的驗證協議一般有兩種:

http 驗證:必須有可以正常運行的服務器和公網 IP。驗證時,需要在你的網站根目錄下放一個文件來驗證域名所有權,完成驗證後就可以生成證書了。
dns 驗證:不需要服務器和公網 IP。只需要爲域名添加一條 txt 解析記錄來驗證域名所有權。

通過 acme.sh 獲取通配符域名證書

acme.sh 的所有相關文件(包括安裝文件、申請到的證書等)都在 ~/.acme.sh/ 這一個目錄中。

安裝 acme.sh
在線安裝
curl https://get.acme.sh | sh
或者:
wget -O - https://get.acme.sh | sh

從 Git 安裝
git clone https://github.com/Neilpang/acme.sh.git
cd ./acme.sh
./acme.sh --install

安裝過程包含 3 個動作:

創建並複製 acme.sh 到你的家目錄 $HOME:~/.acme.sh/。所有的證書都會放到這個目錄中
創建別名: acme.sh=~/.acme.sh/acme.sh
創建每天的定時任務檢查證書,如果快要到期了會自動更新
定時任務示例:

0 "/home/user/.acme.sh"/acme.sh --cron --home "/home/user/.acme.sh" > /dev/null

驗證
安裝完成後,需要重新打開終端,acme.sh 命令才能生效

第一種DNS方式:
如果域名解析商提供 API,則可以自動藉助這個 API 通過工具添加 txt 記錄完成驗證。

例如阿里雲:
首先我們要把acme的配置替換成從阿里雲獲取的API參數
vim .acme.sh/account.conf

SAVEDAliKey='XXXXXX'
SAVEDAliSecret='XXXXXX'

修改完配置後,執行命令:
acme.sh --issue --dns dns_ali -d mydomain.com -d .mydomain.com

acme.sh 會保存 API 參數並生成定時任務,用於每天驗證證書是否即將過期,並及時更新。下面是通過 crontab -e 看到的新增的定時任務:
16 0 "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

證書生成後,需要把證書 copy 到真正需要用它的地方。

默認生成的證書都放在安裝目錄 ~/.acme.sh/ 下,但是請不要直接使用。而是使用 --installcert 命令安裝證書。

使用 --installcert 命令安裝證書

使用 --installcert 命令安裝證書時,證書文件會被複制到相應的位置:

acme.sh --installcert -d mydomain.com \
--key-file /etc/nginx/ssl/mydomain.key \
--fullchain-file /etc/nginx/ssl/fullchain.cer \
--reloadcmd "systemctl reload nginx.service"

配置nginx
Nginx 的配置 ssl_certificate 使用 /etc/nginx/ssl/fullchain.cer,而非 /etc/nginx/ssl/<domain>.cer,否則 SSL Labs 的測試會報 Chain issues Incomplete 錯誤

server{
listen 443 ssl;
server_name mydomain.com;
ssl on;
ssl_certificate /etc/nginx/ssl/fullchain.cer;
ssl_certificate_key /etc/nginx/ssl/mydomain.key;
ssl_session_timeout 5m;
}

第二種http方式:
這種方式如果只是單獨一個或者多個域名,直接執行命令即可,後邊呢的webroot是存放證書的目錄,可以手動修改增加

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

如果沒有運行任何 web 服務,80 端口是空閒的,那麼 acme.sh 可以運行爲 webserver,臨時監聽 80 端口,完成驗證:

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

這裏我在申請證書的時候遇到過一個問題,域名的公網IP+80其實是映射到我內網的IP+8080端口,但是我誤認爲是內網的80端口,所以在nginx的配置中我監聽了80端口,導致驗證文件一直下載不下來,最後修改了nginx監聽8080端口後解決。
報錯信息:
http://mydomain/.well-known/acme-challenge/YdvMFXcNTtNkZGWop-ZOXYSFR5qNlTn8AQvGhGg9Yww not found

問題解決後,發現申請下來的證書無法支持通配符,最終在github上找到了通過域名別名的解決方式。

http方式 支持https通配符免費證書:

首先,我們需要在DNS服務器上設置我們的域名別名:
_acme-challenge.mydomain.cn CNAME到 _acme-challenge.alidomain.cn

這裏我們做的操作是把要申請證書的域名CNAME到原先可以通過API接口申請通配符的域名上,前邊的_acme-challenge是必須要加的
而且我也還要配置.acme.sh/account.conf下 原先域名的key,完成後執行操作。

acme.sh --issue -d mydomain.cn --challenge-alias alidomain.cn --dns dns_ali -d *.mo-sky.cn
如果提示 可以加上 --force 參數

參考文章:https://github.com/Neilpang/acme.sh/wiki/DNS-alias-mode

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章