折騰起因
最近做了個小網站wawoo.fun,一個做mac壁紙的小網站,網站還處在初級階段,不能跟大神的比。網站發佈後發現因為沒有使用https,谷歌瀏覽器會在地址欄提示網站不安全。因此想提升下網站的逼格,把網站由http升級為https。
阿里雲免費證書只支持單域名
我買的是阿里雲的服務器,因此想到之前看到阿里雲有送免費的https證書,遂打開阿里雲證書申請頁面,發現贈送的免費證書只支持單域名的。我的站點至少需要一個支持wawoo.fun和www.wawoo.fun的證書,申請兩個單域名證書,然後再在nginx中分別配置,這個太low了,不是我想要的,通配符證書才是我想要的,但是阿里雲的通配符證書太貴了,不是我這個小站長消費的起的,於是放棄阿里雲的證書,尋找其他方案。
Let's Encrypt提供免費通配符證書
經過搜索發現,真的有提供免費通配符類型證書的機構,那就是Let's Encrypt,Let's Encrypt已為1.8億個網站提供了HTTPS證書,它是一個非盈利性證書頒發機構,其頒發的證書受所有主流瀏覽器廠商的信任,安全可靠。
Let's Encrypt證書申請客戶端選擇
申請Let's Encrypt的免費證書,需要使用Let's Encrypt的證書申請客戶端,官方推薦的是certbot,是腳本類型的,其他的證書申請客戶端還有很多。遂搜索了一下大家常用的證書申請客戶端,比較常用的是acme.sh,和certbot一樣是腳本類型的,試用了一下,確實很強大,在配置了阿里雲的域名解析API接口授權參數後,可以自動更新證書,更新後自動重啟nginx,超級方便。
遇到問題:證書自動更新後無法自動多節點部署
在準備使用acme.sh後,突然發現一個問題,就是如果我以後要擴充nginx容器的數量,證書自動更新就有問題了,多個容器內acme.sh會各自更新各自的,就會生成多個不一樣的證書,而且一旦我的容器個數超過5個,同時更新會觸法Let's Encrypt的證書更新請求速率限制,導致5個之外的所有容器都會更新失敗,這個不利於以後容器的擴展。而且如果我需要在阿里雲的CDN中部署證書,還要在每次證書更新後手動將證書上傳到阿里雲的CDN中,很不便捷。
找到答案:OHTTPS可在證書更新後自動部署至多節點
為了解決上面的問題,並充分發揚我懶的本質,我又開始了我的搜索之旅,經過了持久的搜索後,發現了這個寶藏站點ohttps.com,這個網站提供了我想要的所有功能。OHTTPS提供了證書的申請、吊銷、到期前通知、自動更新、更新後自動部署,並可自動部署至阿里雲或騰訊雲的負載均衡、CDN或證書列表中,還可以部署至Nginx容器中,並支持多節點自動部署。哇,真是太棒了,這個正是我想要的功能啊,更棒的是提供了免DNS授權模式,也就是不需要提供阿里雲域名解析API的accessKey和accessKeySecret就可以實現自動更新。
使用OHTTPS創建證書
首先需要註冊一個OHTTPS的賬號,註冊成功之後登錄進去打開證書管理頁面,點擊創建證書,然後進入創建證書步驟:
- 1、選擇證書類型,這裡我們選擇泛域名證書,也就是通配符證書,然後輸入我們的域名
- 2、選則驗證域名所有權方式,這裡我們選擇免DNS授權模式,然後它會提示需要添加1條CNAME類型的記錄至DNS域名解析記錄中,我們按照它的提示將記錄添加至wawoo.fun的域名解析記錄中
- 3、點擊創建證書,證書申請開始了
- 4、1 ~ 2分鐘之後證書申請成功,可以點擊查看證書內容
- 5、點擊管理證書後,會在證書管理頁面中看到我們申請的證書
在OHTTPS中創建證書Nginx容器部署節點
要使OHTTPS在證書自動更新後自動部署到Nginx容器中,我們需要先創建部署節點。選擇部署節點菜單,點擊添加節點,然後我們選擇Docker - Nginx,點擊生成令牌,這個令牌是在使用容器時會使用到的,下面我會使用到。
在OHTTPS中配置證書自動更新、自動部署
在證書管理頁面中,選擇我們剛才創建的證書,點擊配置,在這裡我們可以對證書進行配置:到期前是否進行通知、是否自動更新、更新後是否自動部署、部署至那些節點等。我們全部選擇自動,然後將我們剛才創建的部署節點添加進來。
構建我們自己的nginx容器鏡像
在OHTTPS中證書配置完成後,我們需要構建自己的nginx容器鏡像。這裡需要用到OHTTPS官方提供的ohttps/ohttps-nginx容器鏡像作為基礎鏡像,這個鏡像也是基於nginx官方鏡像構建的,添加了證書更新功能,證書從服務器拉取過來之後,會存在容器內部的/etc/nginx/certificates文件夾下,證書文件具體存放位置如下:
- 件私鑰文件cert.key:
`/etc/nginx/certificates/${證書ID}/cert.key`
- 證書文件fullchain.cer:
`/etc/nginx/certificates/${證書ID}/fullchain.cer`
其中證書ID是我們創建完證書後生成的證書ID,在證書管理頁面可以看到。然後我們可以在我們自己的nginx配置文件中使用證書文件:
ssl_certificate /etc/nginx/certificates/cert-o17xk289ev09d43l/fullchain.cer;
ssl_certificate_key /etc/nginx/certificates/cert-o17xk289ev09d43l/cert.key;
設置完nginx配置文件nginx.conf之後,我們需要編輯我們自己的Dockerfile文件,用以構建我們自己的鏡像。在Dockerfile文件中,需要設定兩個環境變量:
- PUSH_NODE_ID:就是我們創建的部署節點的ID,在部署節點管理頁面可以看到
- PUSH_NODE_TOKEN:就是我們創建部署節點時點擊生成的32位的Token
下面是Dockerfile文件:
FROM ohttps/ohttps-nginx:1.0.1
WORKDIR /etc/nginx
COPY ./nginx.conf /etc/nginx/nginx.conf
ENV PUSH_NODE_ID='push-k7l13g8j30xm9qp4'
ENV PUSH_NODE_TOKEN='0bfff9fc3024453819c4f107a397ca86'
Dockerfile文件編輯完成之後,就可以生成鏡像,然後我們就可以使用我們自己的鏡像啟動我們自己的nginx容器。這樣就實現了在證書到期前,自動更新證書,並自動將證書推送至Nginx容器中,永遠都不需要再擔心證書過期了。
我寫的OHTTPS使用簡介不是很詳細,具體怎麼使用OHTTPS,還請看OHTTPS官方文檔快速上手OHTTPS,具體怎麼使用OHTTPS的Docker - Nginx類型部署節點,也請看OHTTPS官方文檔部署節點 - Docker - Nginx。