給你的網站免費配置上 HTTPS 證書


現在越來越多的網站或服務增加了 HTTPS 證書,蘋果 AppStore、微信小程序等也已強制要求開發者需提供 HTTPS 的后端接口。在阿里雲 / 騰訊雲上有一年期的免費賽門鐵克 SSL 證書可供嘗鮮,但續用則需要付費。

Let's Encrypt 作為一個公共且免費 SSL 的項目逐漸被廣大用戶傳播和使用,是由 Mozilla、Cisco、Akamai、IdenTrust、EFF 等組織人員發起,主要的目的也是為了推進網站從 HTTP 向 HTTPS 過度的進程,目前已經有越來越多的商家加入和贊助支持。

而 Certbot 是由 Let’s Encrypt 官方推薦的一款快速獲得網站加密證書的 Python 腳本,簡單易用。

但是在 CentOS 6.* 環境下,由於 Python 的版本問題(系統自帶的 Python 是 2.6 版本,但是由於業務需要,又安裝了 2.7 版本的 Python),一直會有各種各樣的報錯,StackOverflow 和 Github 上也沒有找到好的解決方案。

好在 Let’s Encrypt 推薦了多種其他語言版本的工具用來快速獲取證書。https://letsencrypt.org/docs/client-options/

在此,我選擇了 acme.sh 這一 Bash 腳本,安裝較 Certbot 更方便。

主要步驟如下:

1. 安裝 acme.sh

安裝很簡單,一個命令:


curl https://get.acme.sh | sh

普通用戶和 root 用戶都可以安裝使用.

安裝過程進行了以下幾步:

  1. 把 acme.sh 安裝到你的 home 目錄下:

~/.acme.sh/

並創建 一個 bash 的 alias, 方便你的使用: acme.sh=~/.acme.sh/acme.sh

2). 自動為你創建 cronjob, 每天零點自動檢測所有的證書, 如果快過期了, 需要更新, 則會自動更新證書,可以通過 crontab -l 查看


2 0 * * *"/root/.acme.sh"/acme.sh --cron --home"/root/.acme.sh"> /dev/null

** 安裝過程不會污染已有的系統任何功能和文件 **, 所有的修改都限制在安裝目錄中: ~/.acme.sh/

2. 生成證書

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

如果你還沒有運行任何 web 服務, 80 端口是空閑的, 那么 acme.sh 還能假裝自己是一個 webserver, 臨時聽在 80 端口, 完成驗證:


acme.sh --issue -d mydomain.com --standalone

2. dns 方式, 在域名上添加一條 txt 解析記錄, 驗證域名所有權.

這種方式的好處是, 你不需要任何服務器, 不需要任何公網 ip, 只需要 dns 的解析記錄即可完成驗證.


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 等數十種解析商的自動集成.

以 dnspod 為例, 你需要先登錄到 dnspod 賬號, 生成你的 api id 和 api key, 都是免費的.

然后:


export DP_Id="1234"

export DP_Key="sADDsdasdgdsf"

acme.sh --issue --dns dns_dp -d aa.com -d www.aa.com

證書就會自動生成了. 這里給出的 api id 和 api key 會被自動記錄下來, 將來你在使用 dnspod api 的時候, 就不需要再次指定了.

直接生成就好了:


acme.sh --issue -d mydomain2.com --dns dns_dp

3. 修改 Web 服務器配置文件

以 nginx 為例。


http {

# 新增

server {

listen 80 default_server;

# 新增

listen 443 ssl;

ssl_certificate /etc/nginx/ssl/mydonain.cer;

ssl_certificate_key /etc/nginx/ssl/mydomain.key;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

ssl_prefer_server_ciphers on;

# 兼容其他老瀏覽器的 ssl_ciphers 設置請訪問 https://wiki.mozilla.org/Security/Server_Side_TLS

# 其他省略

}

}

4. copy/ 安裝證書

前面證書生成以后, 接下來需要把證書 copy 到真正需要用它的地方.

注意, 默認生成的證書都放在安裝目錄下: ~/.acme.sh/, 請不要直接使用此目錄下的文件, 例如: 不要直接讓 nginx/apache 的配置文件使用這下面的文件. 這里面的文件都是內部使用, 而且目錄結構可能會變化.

正確的使用方法是使用 --installcert 命令, 並指定目標位置, 然后證書文件會被 copy 到相應的位置,

例如:


acme.sh --installcert -d mydomain.com --key-file /etc/nginx/ssl/mydomain.key --fullchain-file /etc/nginx/ssl/mydonain.cer

最后,重啟 nginx 服務:


service nginx force-reload

這里用的是 service nginx force-reload, 不是 service nginx reload, 據測試, reload 並不會重新加載證書, 所以用的 force-reload

5. 更新證書

目前證書在 60 天以后會自動更新, 你無需任何操作. 今后有可能會縮短這個時間, 不過都是自動的, 你不用關心.

6. 更新 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM