Let’s Encrypt的證書籤發原理實際上和傳統的PKI一樣,只不過自動化完成了生成CSR和私鑰、提交CSR、取回證書的過程。
此外還要驗證域名所屬,這一部分和傳統的簽發機構是一樣的,不過傳統的簽發機構還允許我們使用域名whois中填寫的郵箱來驗證,而Letsencrypt貌似只能通過http challenge的方式來驗證。即和驗證服務器約定一個uri和隨機字符串,驗證服務器請求這一uri,如果得到的內容和約定的隨機字符串相同,則驗證通過。如圖所示:
(官網上抄的)
這意味着我們得在每台部署https的前端的負載均衡服務器上都裝一個letencrypt工具。有沒有什麼集中化管理的辦法的呢?
實際上,由於challenge的uri的有規律,我們可以將前端服務器收到的這類請求代理到同一台專門用來簽發、更新證書的服務器上。如圖所示:
- 當在服務器B上發起域名a.example.com新的簽發請求後,Let’s Encrypt的簽發服務器返回一個challange uri (8303)和response (ed98)。
- 服務器B使用webroot插件將這個uri和response寫入本地磁盤上對應的文件。
- Let’s Encrypt的簽發服務器為了驗證example.com的所屬,查詢到example.com指向前端服務器A,於是發送一個HTTP請求/.well-known/acme-challenge/8303到服務器A
- 服務器A反代這一請求到服務器B
- B讀取剛才第二步時寫入到response,返回到A;A返回到Let’s Encrypt的簽發服務器
- 驗證成功,發證!
然後,我們只要從服務器A上取回存儲在B上到證書就可以了。可以在B上做一個RESTful的api。注意要配置allow和deny。
A服務器(前端)的nginx配置如下:
1 2 3 4 5 6 7 8 |
server { # 其他的location # location { ..... } location ~ /.well-known { proxy_pass http://B.example.com:23333; } } |
B服務器的nginx配置如下:
1 2 3 4 5 6 7 8 9 |
server { listen 23333; server_name B.example.com; location ~ /.well-known { root /tmp/letsencrypt; allow IP-OF-A; deny all; } } |
然後在B上運行:
1 |
./letsencrypt-auto --webroot -w /tmp/letsencrypt -d exmaple.com; |
什麼叫還是不想畫(拖出去
其實就是懶(爬走
畫好了
有貓丙,https://github.com/xdtianyu/scripts/tree/master/lets-encrypt
好
下面的評論好2333,思路可以借鑒。