# acme.sh 操作紀錄
###### tags: `ACME.sh` `acme.sh` `letsencrypt`
- [官方wiki](https://github.com/acmesh-official/acme.sh/wiki/)
- [官方中文 wiki](https://github.com/acmesh-official/acme.sh/wiki/说明)
- [參考教學-DNS手動模式](https://www.796t.com/content/1544691721.html)
- ~~[參考教學](https://www.kjnotes.com/devtools/103)~~
## 1. 安裝 acme.sh
建議都在各自的家目錄操作,如果想要在其他位置,每個指令中請自行加入 `--home .` 這項參數
### 方法一*
*本文件使用此方式*
```shell=bash
git clone https://github.com/acmesh-official/acme.sh.git
```
### 方法二
```shell=bash
curl https://get.acme.sh | sh -s email=my@example.com
```
### 安裝後的設定
```shell=bash
echo alias acme.sh=~/acme.sh/acme.sh >> ~/.bashrc
```
註冊帳號
```shell=bash
acme.sh --register-account -m email@example.com --server letsencrypt
acme.sh --set-default-ca --server letsencrypt
```
## 2. 獲取證書
```shell=bash
acme.sh --issue -d example.com --dns \
--yes-I-know-dns-manual-mode-enough-go-ahead-please
```
中間這個步驟我忘記截圖 可以先看上面的參考教學-手動DNS
簡單來說就是要去 cloudflare 裡面對應的 domain,新增TXT紀錄,上面指令下完,會給你兩個東西,一個是紀錄名稱,一個是內容
ex: 
之後依照官方示執行
```
acme.sh --renew -d example.com \
--yes-I-know-dns-manual-mode-enough-go-ahead-please
```
詳細請參考[官方說明](https://github.com/acmesh-official/acme.sh/wiki/DNS-manual-mode)
:::danger
以下已無法使用
```shell=bash
acme.sh --issue --alpn --tlsport 10443 -d example.com --server letsencrypt \
--pre-hook "docker stop nginx_nginx_1 && service nginx restart" \
--post-hook "service nginx stop && docker restart nginx_nginx_1"
```
- `--tlsport` 使用 tls-alpn-01 挑戰,因為學校會擋 80 port,而他可以使用 443 port 來獲取證書,詳細請參考[官方說明](https://github.com/acmesh-official/acme.sh/wiki/TLS-ALPN-without-downtime)
*(不使用 dns-01,因為無法達到自動更新證書,因為大多的 DNS API 不給 `.ml`、`.tk`、`.cf`、`.ca`、... 這些頂級域名使用,像 cloudflare 和 luadns 就是如此,可以先看上面的**參考教學**做一遍,就知道這在說啥了。仍然可以用這些域名挑戰 dns-01,但只能透過手動)*
- `--server` 指定憑證機構為 letsencrypt,acme 預設是 ZeroSSL。
*(我不知道 ZeroSSL 為啥一直不過,換成 letsencrypt 就過了)*
:::
## 3. 安裝證書
- Nginx *(實驗室都用這個)*
```shell=bash
acme.sh --install-cert -d example.com \
--cert-file /etc/letsencrypt/live/example.com/cert.pem \
--key-file /etc/letsencrypt/live/example.com/privkey.pem \
--fullchain-file /etc/letsencrypt/live/example.com/fullchain.pem \
--ca-file /etc/letsencrypt/live/example.com/chain.pem \
--reloadcmd "docker restart nginx_nginx_1"
# or
--reloadcmd "systemctl reload nginx.service"
```
**reloadcmd 請依照執行環境變動**
## 4. 更新證書
現在只能用手動的方式以 dns 更新憑證,方法就是再做一次第 2 點。
## 5. 更新 acme.sh
```shell=bash
# 手動更新
./acme.sh --upgrade
```
```shell=bash
# 啟用自動更新
./acme.sh --upgrade --auto-upgrade
```
```shell=bash
# 關閉自動更新
./acme.sh --upgrade --auto-upgrade 0
```
## 6. debug
```shell=bash
# 輸出部分訊息
./acme.sh --issue ..... --debug
```
或
```shell=bash
# 輸出更完整訊息
./acme.sh --issue ..... --debug 2
```
## 參考
- [Which client support tls-alpn challenge?](https://community.letsencrypt.org/t/which-client-support-tls-alpn-challenge/75859)
- [Renewing via port 443](https://community.letsencrypt.org/t/renewing-via-port-443/106771)