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

什麼是 Let’s Encrypt?

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

什麼是通配符證書?

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

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

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

證書包含的主機能夠不是同一個註冊域,不要問我註冊域是什麼?註冊域就是向域名註冊商購買的域名。web

對於我的用戶來講,因爲主機並非太多,因此使用 SAN 證書徹底沒有問題,可是對於大公司來講有一些問題:算法

  • 子域名很是多,並且過一段時間可能就要使用一個新的主機。
  • 註冊域也很是多。

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

Let’s Encrypt 通配符證書

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

這個功能能夠說很是重要,從功能上看 Let’s Encrypt 和傳統 CA 機構沒有什麼區別了,會不會觸動傳統 CA 機構的利益呢?api

爲何選擇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

相關文章
相關標籤/搜索