自從我懂事以來,都是利用 certbot 進行 「HTTP-01 Challenge 」,讓發證單位透過http方式驗證,以取得免費的https證書。
除非遇到Let’sEncrypt考驗伺服器秀逗 ,否則不可能出問題;長大後,我雄心壯志到各地歷練,發現有些主機 80、443 port 居然被封鎖,沒有了80 port (http),就無法透過HTTP-01考驗方式取得https證書 。直到此時,我才知道「代誌不是我們憨人想的架甘丹 」—事情不是我們想像的這麼簡單啊。
Let’s Encrypt的Challenge Types ,列出支援的驗證類型,裡面提到若 HTTP-01 不能用,還有其他選擇,例如本文要說的:DNS-01 Challenge 。
DNS-01 使用原理很簡單:DNS伺服器提供ACME DNS API,讓Let’s Encrypt 能夠透過API進行考驗,就能取得https證書了。
2024-4-2 新作法 使用開源acme.sh專案 1. 線上安裝
# 若需要使用dns-01方式,email必須是提供API token相同帳號 curl https://get.acme.sh | sh -s email=xxx@test.com # 安裝完畢程式會在 /root/.acme.sh/acme.sh ("root"因帳號而異)
2. 使用DNS方式授權 取得API Token 或 API Key (以 cloudflare 為例子)
3. 取得授權檔案
/root/.acme.sh/acme.sh --set-default-ca --server letsencrypt export CF_Key = "b0e689102efab2cf7a1547aaa8b57c4eb65ff " export CF_Email = "提供API Key之email帳號 " /root/.acme.sh/acme.sh --issue --dns dns_cf -d remote.test.com 或 export CF_Token = "ibrxxFFlKZ5FrsBpisXRU7GzO_2KzSwRAQoAwbsT " export CF_Email = "提供API Token之email帳號 " /root/.acme.sh/acme.sh --issue --dns dns_cf -d remote.test.com # 因為我使用apache httpd、CentOS 7.9;httpd 最高到2.4.6,只能支援RAS加密,不支援ECC; # 然而acme預設產生的是ECC加密檔案,所以指令需額外加上 -k 4096改成產生RSA加密檔案。 /root/.acme.sh/acme.sh --issue --dns dns_cf -k 4096 -d remote.test.com
# 產生完授權證書後,進行安裝到letsencrypt所在目錄 /root/.acme.sh/acme.sh --install-cert -d remote.test.com \ --cert-file /etc/letsencrypt/live/remote.test.com /cert.pem \ --key-file /etc/letsencrypt/live/remote.test.com /privkey.pem \ --fullchain-file /etc/letsencrypt/live/remote.test.com /fullchain.pem
#自動更新授權證書(會自動加到crontab)
/root/.acme.sh/acme.sh --upgrade --auto-upgrade
# acme產生檔案與 Let's encrypt檔案對應如下ACME <-> Let's Encrypt ========================================================== ca.cer <-> cer.pem fullchain.cer <-> fullchain.pem remote.test.com.cer <-> chain.pem remote.test.com.key <-> privkey.pem ==========================================================
(已失效) 以google domains 為範例:(很可惜google賣掉網域代管業務)
1、先建立權杖(token)
登入google domain後,點選「安全性」->ACME DNS API 「建立權杖」
此權杖只會出現一次,因此複製後,要妥善保存 。
2、我想使用certbot方式取得憑證,所以到 「certbot-dns-google-domains 」github ,取得執行方式。 2.1 新增權杖檔案
vi /var/lib/letsencrypt/dns_google_domains_credentials.ini
dns_google_domains_access_token = QWVpQWZjT1xxxxxxg2N3lrMi1LUQ==
dns_google_domains_zone = test.com
2.2 docker方式執行,輕鬆取得https證書。
docker run \
-v '/var/lib/letsencrypt:/var/lib/letsencrypt' \
-v '/etc/letsencrypt:/etc/letsencrypt' \
--cap-drop=all \
ghcr.io/aaomidi/certbot-dns-google-domains:latest \
certbot certonly \
--authenticator 'dns-google-domains' \
--dns-google-domains-credentials '/var/lib/letsencrypt/dns_google_domains_credentials.ini' \
--server 'https://acme-v02.api.letsencrypt.org/directory' \
--non-interactive \
--dns-google-domains-zone 'test.com ' \
-d 'xxx.test.com '
3、還有其他取得證書方式(一樣是google domain) 請參考 List of known ACME clients to work the ACME DNS API
若使用的是阿里雲解析 ,可參考這篇文章 ,我自己測試結果沒問題;提醒一下,要使用let’s encrypt,dns需要有CAA record 允許let’s encrypt 發證,否則會出現 「Verify error : CAA ……」錯誤
未免忘記,節錄一些指令;
除了指令外,還需要在阿里雲加上RAM帳號 ,授權該帳號能透過阿里雲OpenAPI修改DNS ,
並且取得該RAM帳號「Key」與「Secret」,以下指令需要用到。
yum install socat
curl https://get.acme.sh | sh
vim /root/.acme.sh/acme.sh.env
export LE_WORKING_DIR="/root/.acme.sh"
alias acme.sh="/root/.acme.sh/acme.sh"
export Ali_Key="xxxx "
export Ali_Secret="yyyy "
source ~/.bashrc
env
acme.sh --set-default-ca --server letsencrypt
acme.sh --issue --dns dns_ali --dnssleep 180 -d xxxx.test.com
#若以上指令不行,可改以下指令
acme.sh -f --use-wget --issue --dns dns_ali --dnssleep 180 -d xxxx.test.com
2023/6/16 我在RockyLinux 9.2安裝失敗出現以下問題 (google代管之網域)
[Errno 13] Permission denied: '/etc/letsencrypt/.certbot.lock'
這很複雜,原因很多,我的解法如下:
解法1. selinux 放行,然後再關起門來
setenforce 0 ; docker run \
-v '/var/lib/letsencrypt:/var/lib/letsencrypt' \
-v '/etc/letsencrypt:/etc/letsencrypt' \
--cap-drop=all \
ghcr.io/aaomidi/certbot-dns-google-domains:latest \
certbot certonly \
--authenticator 'dns-google-domains' \
--dns-google-domains-credentials '/var/lib/letsencrypt/dns_google_domains_credentials.ini' \
--server 'https://acme-v02.api.letsencrypt.org/directory' \
--non-interactive \
--dns-google-domains-zone 'test.com' \
-d 'xxx.test.com' ; setenforce 1;
解法2. 確認相關套件是否安裝
dnf install httpd mod_ssl
certbot --apache
#若出現The requested apache plugin does not appear to be installed,則代表缺少套件
yum list installed|grep certbot
certbot.noarch 2.6.0-1.el9 @epel
python3-certbot.noarch 2.6.0-1.el9 @epel
這樣還缺少 python3-certbot-apache , 我再安裝一下
dnf install python3-certbot-apache