提高 SEO 排名快使用 Let’s Encrypt 免費的 SSL 憑證替網站加上綠色鎖頭!

2016-11-29 Nginx

Google 從 2014 就開始宣告要將 HTTPS 列為 ranking signal 之一的項目,對於 SEO 是一個很重要的公開指標,以往 Google 對於 ranking signal 絕不公開,可見 Google 對於網站加密非常看重

 

對於某些網站可能是自行經營像是小弟僅是使用一台非常爛的主機在跑 Blog 做紀錄,買個網域就已經很奢侈了要在買下 SSL 憑證一年約增加 1000 左右的成本實在不划算

 

但是在這個大環境下的資安越來越重要,就出現了許多提供免費 SSL 憑證的平台;如 StartSSL、WoSign(沃通)、CloudFlare

StartSSL 是很久以前的老牌免費 SSL 憑證提供一年期,但是申請一次非常的複雜,而 WoSign 也是非常的繁複,CloudFlare 雖然只要打開 SSL 支援就可以使用,但是 Windows XP Chrome 並不支援會出現「ERR_SSL_VERSION_OR_CIPHER_MISMATCH」,幾經研究最後選擇 Let’s Encrypt 這一個 SSL 憑證,原因如下介紹。

 

 

letsencrypt

Let’s Encrypt 是由許多大公司以及各大非營利團體為了推廣 HTTPS 而贊助的一家免費發佈 SSL certificate 的 Certiciate Authority。

isrg-keys

 

限制
Let’s Encrypt 目前已經正式開放,但有發行數量限制,一般人可能會遇到的:

  • Names/Certificate:單一 certificate 限制 100 個 hostname。
  • Certificates/Domain:每個 domain 每個禮拜最多 20 個 certificate,但 renew 不計算在 quota 內 (需要憑證內的 hostname 與之前完全一樣)。
  • Certificates/FQDNset:相同 hostname 的憑證每個禮拜最多發出五個。。

 

Let’s Encrypt 申請 SSL 憑證

由於網路上已經太多 Let’s Encrypt 的申請教學並且已經很詳細了小弟在這邊就不再贅述如何從網站上申請,在這篇就來討論比較技術性的申請方式!

 

Let’s Encrypt 申請一次是只有三個月的期限,如果每三個月就要申請一次也太累了,所以在這邊除了申請,還包含了自動續約 (Auto Renew) 的教學,讓站長們不用再關心自己的網站憑證是否過期。

 

Let’s Encrypt 除了免費 SSL 還佛心到提供 Certbot 這個自動續約的工具

 

Step.1 從 git clone 一份 Certbot 下來

$ cd /usr/local/
$ git clone https://github.com/certbot/certbot

 

Step.2 第一次建立 SSL 憑證使用 certbot 自動產生憑證 shazi.info 和 test.shazi.info

$ ./certbot-auto --nginx -d shazi.info

在這邊必須特別注意的是使用 –nginx 他會去檢查你的設定檔中是否有 server_name 有 shazi.info 這個 hostname,如果沒有會建立失敗。

 

 

如果你只是單純想建立 SSL 憑證,就寫個 nginx 的 config,server_name 為 shazi.info 這個網域,因為 Let’s Encrypt 會去搜尋後加入 SSL 參數與 Listen 443,但這都不是本篇的重點。

$ vim /etc/nginx/conf.d/shazi.info.conf

server {
    listen 80;
    server_name shazi.info;
...
}

 

Step.3 使用 Easy 安裝

在出現這個畫面之前 certbot 會驗證你要申請的網域是否可以訪問以及 web server 是否有誤。

easy

 

 

Step.4 在第一次建立好 certbot 好之後會產生設定在 /etc/letsencrypt

# 憑證檔案產生處
$ ls /etc/letsencrypt/archive/shazi.info
cert1.pem  chain1.pem  fullchain1.pem  privkey1.pem

# letsencrypt會產生softlink提供給web server使用,目的是用來auto renew
$ ls -l /etc/letsencrypt/live/shazi.info
lrwxrwxrwx 1 root root 34 Nov 28 02:43 cert.pem -> ../../archive/shazi.info/cert1.pem
lrwxrwxrwx 1 root root 35 Nov 28 02:43 chain.pem -> ../../archive/shazi.info/chain1.pem
lrwxrwxrwx 1 root root 39 Nov 28 02:43 fullchain.pem -> ../../archive/shazi.info/fullchain1.pem
lrwxrwxrwx 1 root root 37 Nov 28 02:43 privkey.pem -> ../../archive/shazi.info/privkey1.pem

# 然後shazi.info設定檔certbot就會很雞婆的自動加上ssl參數
$ cat /etc/nginx/conf.d/shazi.info.conf

server {
...

listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/shazi.info/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/shazi.info/privkey.pem; # managed by Certbot
ssl_session_cache shared:le_nginx_SSL:10m; # managed by Certbot
ssl_session_timeout 10m; # managed by Certbot

ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # managed by Certbot
ssl_prefer_server_ciphers on; # managed by Certbot

ssl_ciphers [ECDHE-ECDSA-AES128-GCM-SHA256|ECDHE-ECDSA-CHACHA20-POLY1305]:[ECDHE-RSA-AES128-GCM-SHA256|ECDHE-RSA-CHACHA20-POLY1305]:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:DES-CBC3-SHA; # managed by Certbot

...
}

 

Step.5 如上 certbot 自動加入的 SSL 參數都已經不適用在現在,因為本篇要延伸前一篇 “Nginx 編譯最新的 SSL(Chacha20-Poly1305)” 使用 http2 進行 SSL

# 修改SSL設定檔支援http/2
$ vim /etc/nginx/conf.d/shazi.info.conf

server {
    listen 443 ssl http2;
    server_name shazi.info;
    index index.php index.html;

    ssl on;
    ssl_certificate /etc/letsencrypt/live/shazi.info/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/shazi.info/privkey.pem;
    ssl_ciphers [ECDHE-ECDSA-AES128-GCM-SHA256|ECDHE-ECDSA-CHACHA20-POLY1305]:[ECDHE-RSA-AES128-GCM-SHA256|ECDHE-RSA-CHACHA20-POLY1305]:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:DES-CBC3-SHA;
    ssl_session_cache   shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers   on;
}

 

Step.5 重啟 nginx 驗證 SSL 憑證,並且支援 chacha20 的綠色小鎖頭

chacha20

 

 

自動 Renew Let’s Encrypt  SSL 憑證

當憑證申請搞定之後,就要讓他能自動重新續約 SSL 憑證

Step.1 certbot Auto Renew 的設定是參考在/etc/letsencrypt/renewal

$ vim /etc/letsencrypt/renewal/shazi.info.conf

# renew_before_expiry = 30 days
version = 0.9.3
cert = /etc/letsencrypt/live/shazi.info/cert.pem
privkey = /etc/letsencrypt/live/shazi.info/privkey.pem
chain = /etc/letsencrypt/live/shazi.info/chain.pem
fullchain = /etc/letsencrypt/live/shazi.info/fullchain.pem

# Options used in the renewal process
[renewalparams]
authenticator = nginx
installer = nginx
account = c1a94fsdfbd385eqqee65463d88ds6d481

憑證的路徑是 certbot 產生時的 softlink,必須存在。

 

Step.2 使用 certbot 提供的 letsencrypt-auto 這個工具自動續約

$ cd /usr/local/certbot
$ ./letsencrypt-auto renew

Saving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/shazi.info.conf
-------------------------------------------------------------------------------
Cert not yet due for renewal

The following certs are not due for renewal yet:
  /etc/letsencrypt/live/shazi.info/fullchain.pem (skipped)
  /etc/letsencrypt/live/cloud.shazi.info/fullchain.pem (skipped)
No renewals were attempted.

檢查完沒有需要續約的憑證自動略過

 

Step.3 建立在 crontab 每天檢查一次

$ crontab -e

0 0 * * * sh /usr/local/letsencrypt/letsencrypt-auto renew > /var/log/letsencrypt-auto.log

 

 

打完收工!!

給 Mr. 沙先生一點建議

彙整

分類

展開全部 | 收合全部

License

訂閱 Mr. 沙先生 的文章

輸入你的 email 用於訂閱