申請 Let’s Encrypt 泛域名證書 及 Nginx/Apache 證書配置


什么是 Let’s Encrypt?

部署 HTTPS 網站的時候需要證書,證書由 CA (Certificate Authority )機構簽發,大部分傳統 CA 機構簽發證書是需要收費的,這不利於推動 HTTPS 協議的使用。Let’s Encrypt 也是一個 CA 機構,但這個 CA 機構是免費的!!!也就是說簽發證書不需要任何費用。

什么是通配符證書?

在沒有出現通配符證書之前,Let’s Encrypt 支持兩種證書。

1)單域名證書:證書僅僅包含一個主機。

2)SAN 證書:一張證書可以包括多個主機(Let’s Encrypt 限制是 20),也就是證書可以包含下列的主機:www.example.comwww.example.cnblog.example.com 等等。

證書包含的主機可以不是同一個注冊域,不要問我注冊域是什么?注冊域就是向域名注冊商購買的域名。

對於個人用戶來說,由於主機並不是太多,所以使用 SAN 證書完全沒有問題,但是對於大公司來說有一些問題:

  • 子域名非常多,而且過一段時間可能就要使用一個新的主機。
  • 注冊域也非常多。

讀者可以思考下,對於大企業來說,SAN 證書可能並不能滿足需求,類似於 sina 這樣的網站,所有的主機全部包含在一張證書中,而使用 Let’s Encrypt 證書是無法滿足的。

Let’s Encrypt 通配符證書

通配符證書就是證書中可以包含一個通配符,比如 .example.com、.example.cn,讀者很快明白,大型企業也可以使用通配符證書了,一張證書可以防止更多的主機了。

這個功能可以說非常重要,從功能上看 Let’s Encrypt 和傳統 CA 機構沒有什么區別了,會不會觸動傳統 CA 機構的利益呢?

為什么選擇Let’s Encrypt?

Let’s Encrypt和其他認證機構的區別:

  • 免費,Let’s Encrypt提供期限是90天的免費電子證書
  • 提供工具certbot自動生成電子證書文件  任何人都可以基於 ACME 協議實現一個客戶端,官方推薦的客戶端是Certbot

如何申請 Let’s Encrypt 通配符證書

安裝Certbot

從官方源安裝最新版certbot(最新版為0.22.0,從0.22.0版本才開始支持泛域名申請)

wget https://dl.eff.org/certbot-auto
chmod a+x ./certbot-auto

初始化

./certbot-auto

 

獲取證書

因為目前大多數國內的DNS服務商不在API支持的列表里,所以以下使用手動方式進行DNS認證,只要將下方命令中的*.thinkbig.com替換為自己的域名即可。注意!域名的 minirplus.com 解析記錄必須以 A記錄 方式指向當前運行命令的服務器IP,而不能使用CNAME記錄。 

./certbot-auto certonly --manual -d *.thinkbig.com --agree-tos --no-bootstrap --manual-public-ip-logging-ok --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory
運行該命令后,會要求 輸入郵箱,用於接收證書過期通知:
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel):

接着會出現一段廣告,大意是收集客戶郵箱給贊助商,Y 或 N 均可

-------------------------------------------------------------------------------
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about EFF and
our work to encrypt the web, protect its users and defend digital rights.
-------------------------------------------------------------------------------
(Y)es/(N)o:

接着重要的部分來了,在域名注冊商的網站,解析記錄中添加一個 _acme-challenge 前綴的域名 TXT記錄,記錄的內容為中間顯示的隨機碼_MdwehUGJ_qSMWNy7acNo_QzuS1YnV8_772JZUGmqQY

我用的是阿里雲,找到對應的域名,添加解析記錄即可

-------------------------------------------------------------------------------
Please deploy a DNS TXT record under the name
_acme-challenge.thinkbig.com with the following value:
 
_MdwehUGJ_qSMWNy7acNo_QzuS1YnV8_772JZUGmqQY
 
Before continuing, verify the record is deployed.
-------------------------------------------------------------------------------
Press Enter to Continue

接着確保當前域名的根記錄 thinkbig.com 為 A記錄 並且指向當前服務器IP(這條原本不成問題,因為國外的服務商的DNS根域名只能添加A記錄,但是國內的DNSPOD則更加靈活,可以添加CNAME記錄,所以會在認證的時候出現問題)

按回車,進行認證

等待片刻,出現如下信息,說明認證成功

申請操作成功后, 會在界面中輸出證書的存放路徑, 以及證書的到期時間 (90天)

Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/thinkbig.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/thinkbig.com/privkey.pem
   Your cert will expire on 2019-02-19. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot-auto
   again. To non-interactively renew *all* of your certificates, run
   "certbot-auto renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

 

證書的存放路徑

( 這里以thinkbig.com為例 )

生成證書中會創建 /etc/letsencrypt 文件夾, 證書文件默認存放在 /etc/letsencrypt/live/thinkbig.com 文件夾中, 其中 thinkbig.com 取自第一個域名
在 thinkbig.com 文件夾中包含 4 個文件 ./cert.pem ./chain.pem ./fullchain.pem ./privkey.pem

  • cert.pem 域名證書
  • chain.pem 根證書及中間證書
  • fullchain.pem 由 cert.pem 和 chain.pem 合並而成
  • privkey.pem 證書私鑰

創建一個 2048 位的 Diffie-Hellman 文件
(nginx 默認使用 1024 位的 Diffie–Hellman 進行密鑰交換, 安全性太低)

openssl dhparam -out /etc/letsencrypt/live/dhparams.pem 2048

nginx TSL 配置 (強制http重定向到https)

( 這里以thinkbig.com為例 )

首先對 http 協議進行 301 重定向到 https 協議

server {
  listen 80;
  server_name example.com www.thinkbig.com;
  return 301 https://thinkbig.com$request_uri;
}

Nginx Https 相關配置( 這里以thinkbig.com為例 )

server {
    listen 443 ssl;
    server_name thinkbig.com www.thinkbig.com;
    
    # 配置站點證書文件地址
    ssl_certificate      /etc/letsencrypt/live/thinkbig.com/fullchain.pem;
    # 配置證書私鑰
    ssl_certificate_key  /etc/letsencrypt/live/thinkbig.com/privkey.pem;
    
    # 配置 Diffie-Hellman 交換算法文件地址
    ssl_dhparam          /etc/letsencrypt/live/dhparams.pem;
    
    # 配置服務器可使用的加密算法
    ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';

    # 指定服務器密碼算法在優先於客戶端密碼算法時,使用 SSLv3 和 TLS 協議
    ssl_prefer_server_ciphers  on;
    
    # ssl 版本 可用 SSLv2,SSLv3,TLSv1,TLSv1.1,TLSv1.2 
    # ie6 只支持 SSLv2,SSLv3 但是存在安全問題, 故不支持
    ssl_protocols        TLSv1 TLSv1.1 TLSv1.2;
    
    # 配置 TLS 握手后生成的 session 緩存空間大小 1m 大約能存儲 4000 個 session
    ssl_session_cache          shared:SSL:50m;
    # session 超時時間
    ssl_session_timeout        1d;
    
    # 負載均衡時使用 此處暫時關閉 詳情見 https://imququ.com/post/optimize-tls-handshake.html 
    # 1.5.9 及以上支持
    ssl_session_tickets off;
    
    # 瀏覽器可能會在建立 TLS 連接時在線驗證證書有效性,從而阻塞 TLS 握手,拖慢整體速度。OCSP stapling 是一種優化措施,服務端通過它可以在證書鏈中封裝證書頒發機構的 OCSP(Online Certificate Status Protocol)響應,從而讓瀏覽器跳過在線查詢。服務端獲取 OCSP 一方面更快(因為服務端一般有更好的網絡環境),另一方面可以更好地緩存 以上內容來自 https://imququ.com/post/my-nginx-conf-for-wpo.html
    # 1.3.7 及以上支持
    ssl_stapling               on;
    ssl_stapling_verify        on;
    # 根證書 + 中間證書
    ssl_trusted_certificate    /etc/letsencrypt/live/thinkbig.com/fullchain.pem;
    
    # HSTS 可以告訴瀏覽器,在指定的 max-age 內,始終通過 HTTPS 訪問該域名。即使用戶自己輸入 HTTP 的地址,或者點擊了 HTTP 鏈接,瀏覽器也會在本地替換為 HTTPS 再發送請求 相關配置見 https://imququ.com/post/sth-about-switch-to-https.html
    add_header Strict-Transport-Security max-age=60;
    
    # 在此填寫原本 http 協議中的配置
}

 

以上配置完成后, 重啟 nginx 即可完成對 https 的切換

service nginx restart

 

Apache Https 相關配置( 這里以thinkbig.com為例 )

進入/etc/apache2/sites-available,修改泛域名配置文件(這里以000-default.conf為例),添加SSL配置,將下面配置中的SSL證書地址,替換為之前成功獲取的證書地址(如直接使用以下配置,請修改DocumentRoot和Directory目錄為泛域名指向的目錄)

<VirtualHost *:80>
    ServerAdmin admin@thinkbig.com
    DocumentRoot /var/www/vps
    ServerSignature Off
    <Directory /var/www/vps >
        Options -Indexes
    </Directory>
</VirtualHost>
 
<IfModule mod_ssl.c>
    <VirtualHost *:443>
        ServerAdmin admin@thinkbig.com
        DocumentRoot /var/www/vps
        ServerSignature Off
        <Directory /var/www/vps >
            Options -Indexes
        </Directory>
        SSLEngine on
        SSLCertificateFile /etc/letsencrypt/live/thinkbig.com/fullchain.pem;
        SSLCertificateKeyFile /etc/letsencrypt/live/thinkbig.com/privkey.pem
    </VirtualHost>
</IfModule>

更新證書:

certbot生成的證書是有90天期限的。
使用以下命令即可進行 續期, 續期成功后需要服務器

./certbot-auto renew

該命令只會對快到期的證書才會進行更新, 如果希望強制更新, 可以增加 --force-renewal 參數

自動更新證書:

crontab中加上下邊這句:

 0 0 1 */2 * certbot-auto renew --quiet --force-renewal

了解更多,https://github.com/ywdblog/certbot-letencrypt-wildcardcertificates-alydns-au


免責聲明!

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



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