正文
現在很多站長都會考慮將自己的站點從http升級到https,不僅是基於安全的考慮,有的也是因為第三方平臺的限制,如谷歌瀏覽器會將http站點標記為不安全的站點,微信平臺要求接入的微信小程式必須使用https等。
那如何將一個http站點升級為https站點呢?
http與https的區別
為了資料傳輸的安全,https在http的基礎上加入了ssl協議,ssl協議依靠證照來驗證伺服器的身份,併為瀏覽器和伺服器之間的通訊加密。要想將http升級為https,只需要給http站點增加一個CA證照即可。
目前獲取CA證照有兩種途徑:
- 購買收費的CA證照
- 獲取免費的證照
收費的CA證照各大服務提供商都有賣,如阿里雲、騰訊雲等。
【系統架構】如何升級到https?一個指令碼幫你搞定,且永久免費
收費的證照不便宜,從阿里雲官方網站看,它的價格可以從幾千元到上萬元不等。
【系統架構】如何升級到https?一個指令碼幫你搞定,且永久免費
這對於小公司平臺,甚至是個人站點來說,是一個不小的開支。
Letsencrypt是一個免費、自動化和開放的證照頒發機構,其頒發的證照一次有效期為三個月,但是隻要能持續更新,基本可以永久使用。
今天推薦的這個指令碼acme.sh,實現了 acme 協議, 可以幫你持續自動從Letsencrypt更新CA證照。下載地址如下:
github.com/Neilpang/ac…
安裝 acme.sh
安裝acme.sh很簡單,一個命令即可:
curl get.acme.sh | sh
普通使用者和 root 使用者都可以安裝使用。安裝過程進行了以下幾步:
1、把acme.sh安裝到你的home目錄下:
~/.acme.sh/
並建立 一個 bash 的 alias,方便你使用:alias acme.sh=~/.acme.sh/acme.sh
2、自動為你建立 cronjob,每天 0:00 點自動檢測所有的證照。如果快過期了,需要更新,則會自動更新證照,安裝過程不會汙染已有的系統任何功能和檔案,所有的修改都限制在安裝目錄中:~/.acme.sh/
生成證照
acme.sh 實現了 acme 協議支援的所有驗證協議, 一般有兩種方式驗證:http 和 dns 驗證。
1、http 方式需要在你的網站根目錄下放置一個檔案, 來驗證你的域名所有權,完成驗證,然後就可以生成證照了。
acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/
acme.sh 會全自動的生成驗證檔案, 並放到網站的根目錄,然後自動完成驗證。最後會聰明的刪除驗證檔案,整個過程沒有任何副作用。
如果你用的是apache伺服器,acme.sh 還可以智慧的從 apache的配置中自動完成驗證,你不需要指定網站根目錄:
acme.sh --issue -d mydomain.com --apache
如果你用的是nginx伺服器,或者反代,acme.sh還可以智慧的從 nginx的配置中自動完成驗證,你不需要指定網站根目錄:
acme.sh --issue -d mydomain.com --nginx
注意:無論是 apache 還是 nginx 模式,acme.sh在完成驗證之後,會恢復到之前的狀態,都不會私自更改你本身的配置。好處是你不用擔心配置被搞壞,但也有一個缺點,你需要自己配置 ssl 的配置,否則,只能成功生成證照,你的網站還是無法訪問https。但是為了安全,你還是自己手動改配置吧。
如果你還沒有執行任何 web 服務,80 埠是空閒的, 那麼 acme.sh 還能假裝自己是一個webserver, 臨時聽在80 埠,完成驗證:
acme.sh --issue -d mydomain.com --standalone
2、dns 方式,在域名上新增一條 txt 解析記錄,驗證域名所有權。
這種方式的好處是,你不需要任何伺服器,不需要任何公網 ip,只需要 dns 的解析記錄即可完成驗證。不過,壞處是,如果不同時配置 Automatic DNS API,使用這種方式 acme.sh 將無法自動更新證照,每次都需要手動再次重新解析驗證域名所有權。
acme.sh --issue --dns -d mydomain.com
然後,acme.sh 會生成相應的解析記錄顯示出來,你只需要在你的域名管理皮膚中新增這條 txt 記錄即可。
等待解析完成之後, 重新生成證照:
acme.sh --renew -d mydomain.com
注意:第二次這裡用的是 --renew
dns 方式的真正強大之處在於可以使用域名解析商提供的 api 自動新增 txt 記錄完成驗證。
acme.sh 目前支援 cloudflare, dnspod, cloudxns, godaddy 以及 ovh 等數十種解析商的自動整合。
copy/安裝 證照
前面證照生成以後,接下來需要把證照 copy 到真正需要用它的地方。
注意:預設生成的證照都放在安裝目錄下:~/.acme.sh/,請不要直接使用此目錄下的檔案。例如,不要直接讓 nginx/apache 的配置檔案使用這下面的檔案。這裡面的檔案都是內部使用,而且目錄結構可能會變化。
正確的使用方法是使用 --installcert 命令,並指定目標位置,然後證照檔案會被copy到相應的位置,例如:
acme.sh --installcert -d <domain>.com
--key-file /etc/nginx/ssl/<domain>.key
--fullchain-file /etc/nginx/ssl/fullchain.cer
--reloadcmd "service nginx force-reload"
複製程式碼
一個小提醒,這裡用的是 service nginx force-reload,不是 service nginx reload,據測試, reload並不會重新載入證照,所以用的 force-reload。
Nginx 的配置 ssl_certificate 使用 /etc/nginx/ssl/fullchain.cer,而非 /etc/nginx/ssl/.cer ,否則 SSL Labs 的測試會報 Chain issues Incomplete 錯誤。
--installcert命令可以攜帶很多引數,來指定目標檔案。並且可以指定 reloadcmd, 當證照更新以後,reloadcmd會被自動呼叫,讓伺服器生效。
值得注意的是,這裡指定的所有引數都會被自動記錄下來,並在將來證照自動更新以後,被再次自動呼叫。
更新證照
目前證照在 60 天以後會自動更新,你無需任何操作。今後有可能會縮短這個時間,不過都是自動的,你不用關心。
更新 acme.sh
目前由於 acme 協議和 Letsencrypt CA 都在頻繁的更新,因此 acme.sh 也經常更新以保持同步。
升級 acme.sh 到最新版 :
acme.sh --upgrade
如果你不想手動升級, 可以開啟自動升級:
acme.sh --upgrade --auto-upgrade
之後, acme.sh 就會自動保持更新了。
你也可以隨時關閉自動更新:
acme.sh --upgrade --auto-upgrade 0
出錯怎麼辦:
如果出錯, 請新增 debug log:
acme.sh --issue ..... --debug
或者:
acme.sh --issue ..... --debug 2