# Certbot on Windows
###### tags: `w3HexSchool` . `ssl` . `certbot`
最近需要為個人使用的 Http 網站加上 SSL 憑證 ,
在 Windows 平台中常看到的是用 openSSL 去產生一個 SSL 憑證 ,
目前看到 openSSL 可以產生 自簽憑證 (Self-Signed Certificate),
但是此方法產生的 SSL 憑證會被瀏覽器認定為 "不可信任的來源"
![](https://i.imgur.com/ZjDNokq.png)
這方法走不通 , 讓我們換另一個方法來走 , 在 Linux 中使用 certbot 產生可信任的 SSL 憑證 , 常常可以看到文章在分享這個做法 ,
Q. 那在 windows 中 , 我們可以使用 certbot 來產生 SSL 憑證嗎 ?
A. 可以 😇
以下讓我們詳細說明一下 certbot 在 windows 上的一些可用的指令
## 前置作業
1.找到 `一台對外有 Public IP 的 Windows 電腦 or 虛擬機`
(可以使用 AWS . Azure ...等雲端平台輔助建立)
2.下載 certbot 提供的 [Windows 安裝檔](https://dl.eff.org/certbot-beta-installer-win32.exe)
3.準備 DNS 將其指向到你準備的 Public IP
:::info
當你要練習時 , 你可以使用 AWS . Azure ...等雲端平台 ,
建立對外有 Public IP 服務的 Windows 電腦 ,
在下不太建議 , 你真的拿一台實體的 Windows 電腦直接對外連線 ,
這樣做你很容易中毒 , 然後引發 ==[中毒大當機](https://www.ithome.com.tw/news/125118)==
:::
## 常用操作
- 建立 SSL 憑證 , 有各種類型的建立方式
```
certbot certonly --webroot -w C:\Users\andrew\Desktop\http-server -d azure.test.andrewdeveloper.com -n
```
- 刪除 SSL 憑證
```
certbot delete --cert-name azure.test.andrewdeveloper.com
```
- 註銷 SSL 憑證
```
certbot revoke --cert-path /etc/letsencrypt/live/CERTNAME/cert.pem
certbot revoke --cert-name azure.test.andrewdeveloper.com
```
- 更新 SSL 憑證
:::danger
目前在 windows 上 , certbot 還沒辦法自動更新 SSL 憑證
:::
## 指令解析
當你在 cmd 中輸入 `certbot -h` , certbot 會顯示內部可用的指令資訊
```shell
certbot [SUBCOMMAND] [options] [-d DOMAIN] [-d DOMAIN] ...
```
### 建立憑證
#### SUBCOMMAND
- `certonly`:更新或建立新的 SSL 憑證
- `renew`:更新快過期的的 SSL 憑證
- `enhance`:在目前的 SSL 憑證上追加安全性的增強功能
#### options
- `-d DOMAINS`:設定 SSL 憑證的域名 , 利用逗號區隔 ( 範例 : -d www.example.com,www.example.tw )
- `--standalone`:certbot 在 80 port 啟動 web server 自行驗證 SSL 憑證
- `--webroot`:將特定檔案放在網頁服務器的根文件夾中以進行身份驗證
- `--manual`: 以交互方式或使用Shell腳本獲取證書
- `-n`:非互動模式執行 certbot
- `--test-cert`:建立測試用的 SSL 憑證
- `--dry-run`:測試 "renew" 或 "certonly" 功能 (不儲存 SSL 憑證)
### 憑證管理
#### SUBCOMMAND
- `certificates`:顯示目前 certbot 管理的憑證
- `revoke`:使憑證失效 ( 支援 --cert-name . --cert-path 兩種參數 )
- `delete`:刪除憑證 ( 只支援 --cert-name 參數 )
#### options
- `--cert-name`:憑證的對應域名
- `--cert-path`:憑證的檔案位置
### 帳戶管理
- `register`: 建立 ACME 帳號
- `unregister`:註銷 ACME 帳號
- `update_account`:更新 ACME 帳號
- `--agree-tos`:訂閱 ACME 電子報
- `-m EMAIL`: 信件通知 ( ex:憑證到期 )
### 其他
- `-h, --help [TOPIC]`:`print this message, or detailed help on a topic;
the available TOPICS are:
all, automation, commands, paths, security, testing, or any of the
subcommands or plugins (certonly, renew, install, register, nginx,
apache, standalone, webroot, etc.)`
- `-h all`:顯示所有使用說明
- `--version`:顯示 certbot 版本
### 向 GUI 進發
certbot 參數中有一個 -n ( Run non-interactively ) 非互動模式 , 專門用來給其他程式呼叫使用 ,
也許之後可以用 ElectronJS 設計一個 GUI , 來操作 certbot ?
## 參考資料
- [certbot on windows](https://certbot.eff.org/instructions?ws=nginx&os=windows)