1. 程式人生 > 其它 >使用Let's Encrypt的SSL證書配置HTTPS手記

使用Let's Encrypt的SSL證書配置HTTPS手記

前段時間,看見很多大會都在分享全站HTTPS的經驗。HTTPS固然好,前提是SSL證書,並且簽發證書的機構要靠譜。沃通的CA證書就相繼被Mozilla和Google封殺了。曾經對於普通使用者,權威,安全,並且免費的證書無疑就像天上的星星,可望而不可及。現在,這些星星變成了餡餅掉了下來。沒錯,我們可以申請安全免費的ssl證書--- Let's Encrypt

Let’s Encrypt是電子前哨基金會(EFF)釋出的免費 SSL 證書服務,Google,Mozilla和Microsoft都極力支援。很早之前就聽說了let’s encrypt,當時礙於其證書有效期短,並且配置麻煩,遂懶得折騰。最近發現他們的網站釋出了工具和一系列自動化的工作流配置。嘗試了一下,還蠻不錯。

安裝 Cerbot

Certbot專門用來部署Let‘s encrypt的工具,其官網會根據使用的web伺服器軟體和作業系統平臺,提供響應的安裝工具和安裝方法。

我這裡選擇了Nginx和Ubuntu16.10的組合。會看到網站跳轉到一個簡易的使用文件。使用下面的命令安裝即可:

$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install certbot

對於Ubuntu14以上的版本,可能並沒有add-apt-repository。需要安裝下面的軟體包:

$ sudo apt-get install python-software-properties
$ sudo apt-get install software-properties-common

Cerbot是EFF為了避免以前使用letsencyrpt配置繁瑣而開發的工具。因作業系統不一樣,安裝的軟體包也不一樣,例如centos安裝的是cerbot-auto,以前的ubuntu安裝的則是letsencyrpt。具體用那個,直接通過上面的組合,根據文件提示即可。

配置

別擔心,Cerbot就是為了減少配置而生的。這裡的配置即建立一個目錄,配置域名訪問伺服器即可。首先建立一個資料夾,用於letsencrypt的目錄。

$ sudo mkdir -p /etc/letsencrypt

然後編輯nginx,啟動一個基本的web服務。假設你的網站根目錄再/var/www下。nginx配置大致如下

server {
        listen 80 default_server;
      
        root /var/www;

        index index.html index.htm index.nginx-debian.html;
        
        server_name www.example.com;

        location / {
               
                try_files $uri $uri/ =404;
        }
}

配置完畢nginx,確保能訪問 http://www.example.com。配置域名和http伺服器的主要作用在於讓letsencrypt校驗你是該域名的所有者。因為等下呼叫Certbot命令的時候,會在www目錄下建立一個隱藏的.well-known/acme-challenge的檔案,然後letsencrypt訪問http://www.example.com/.well-known/acme-challenge。如果無法訪問,那麼letsencrypt會認為該域名不是你的,自然就無法為你簽發證書了。

生成證書

又是安裝,又是配置伺服器。目前為止還不算複雜。當然,下面也不會複雜,有了上面的準備,生成證書只需要一條命令。

$ sudo certbot certonly --webroot -w /var/www -d www.example.com 

執行命令之後,會有一些選擇,Yes或者No,有一步需要提供一個郵箱,用於證書快過期的時候收到letsencrypt的提示。

上面的命令中,certonly是子命令,webroot是一個外掛。w引數表示網站的根目錄,即certbot建立.well-know的地方,d引數表示簽發的域名。可以一次指定多個 w網站d域名的配對。

對於其他系統,有可能不是這個certbot命令,可能是certbot-auto或者letsencrypt

簽發成功之後,就會在/etc/letsencrypt下生成如下的檔案:

$ ls
accounts  archive  csr  keys  live  post-hook.d  pre-hook.d  renew-hook.d  renewal

其中archive資料夾存放多個歸檔的證書,keys是所有的證書。這些都是跟重簽證書和續有效期有關的。使用certbot的工具,我們可以忽略這些目錄。當前使用的證書存放在live檔案下。

/etc/letsencrypt/live/www.example.com 目錄下有README cert.pem chain.pem fullchain.pem privkey.pem這幾個檔案,

▪ privkey.pem 這是私匙,對應Nginx的sslcertificatekey選項。 ▪ cert.pem 伺服器證書,對應SSLCertificateFile選項。 ▪ chain.pem 除伺服器證書之外的所有證書,Nginx對應ssltrustedcertificate選項。 ▪ fullchain.pem 包括上面的伺服器證書和其他證書,Nginx對應ssl_certificate選項。

實際上live目錄的存放的證書檔案都是對archive的連線。我們只要指定該目錄的檔案,當證書更下的時候,會自動修改連線。

配置HTTPS

我們已經生成了SSL證書,下面就是應用到我們的伺服器了。對於配置nginx的https,有mozilla的一個網站提供了最佳實踐。我們只需要選擇nginx和openssl的版本,就會自動生成一個基礎配置給我們,非常方便

對於上面的配置,大致如下:

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    # Redirect all HTTP requests to HTTPS with a 301 Moved Permanently response.
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    # certs sent to the client in SERVER HELLO are concatenated in ssl_certificate
    ssl_certificate /path/to/signed_cert_plus_intermediates;
    ssl_certificate_key /path/to/private_key;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;

    # Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
    ssl_dhparam /path/to/dhparam.pem;

    # intermediate configuration. tweak to your needs.
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    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';
    ssl_prefer_server_ciphers on;

    # HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)
    add_header Strict-Transport-Security max-age=15768000;

    # OCSP Stapling ---
    # fetch OCSP records from URL in ssl_certificate and cache them
    ssl_stapling on;
    ssl_stapling_verify on;

    ## verify chain of trust of OCSP response using Root CA and Intermediate certs
    ssl_trusted_certificate /path/to/root_CA_cert_plus_intermediates;

    ....
}

listen 443 ssl http2; 表示監聽443埠,並開啟http2,當然也可以不開啟。 ssl_certificate配置fullchain.pem的路徑; sslcertificatekey配置privkey.pem的路徑。 ssl_dhparam的配置/etc/nginx/ssl。如果不存在這個檔案,就自己建立。建立的命令如下:

$ sudo mkdir /etc/nginx/ssl
$ sudo openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048

生成ssl_dhparam.pem檔案大概需要一分鐘。ssl_trusted_certificate的配置是可選的,並且nginx文件也提到ssl_certificate 如果已經包含了intermediates,所以我們就配置這個。

resolver的作用是配置解析OCSP伺服器的域名,通常會寫VPS雲服務商提供的DNS伺服器。這裡我們也忽略。

配置完畢之後,重啟nginx,此時再訪問你的域名www.example.com就能看見https的協議,瀏覽器加上了一把綠色的小鎖。

檢測SSL的安全性

配置成功HTTPS之後,為了驗證我們的成果,可以通過Qualys SSL Labs網站檢測。不出意外,你將得到一個A+。如果還沒有,則仔細看看還差什麼方面的修補啦。

如果開啟了nginx的HTTP2配置,也會看見瀏覽器訪問的開發者工具中,顯示的h2的協議。當然,nginx開啟http需要版本在1.9.5之上,編譯還需要設定--with-http_v2_module。對於1.10.1以上的版本,則預設安裝的就能開啟http2的功能。

更新證書

letsencrypt的證書權威且安全,就是有效期只有90天。過期前需要續時間。好在certbot提供的工具足夠簡單。

執行命令sudo certbot renew即可續時間,如果還沒到過期時間,執行命令也不會有大礙。當然你可以使用命令測試sudo certbot renew --dry-run。續的時候certbot也會根據上面配置域名的時候,校驗伺服器上.well-know。確保你的伺服器依然可以訪問這個檔案,不然會認證失敗。

成功續了時間之後,還需要重啟伺服器。因此需要自己寫一個指令碼或者cron。定期更新證書的有效期並且重啟nginx服務。

總結

Let‘s Encrypt專案剛開始的時候,使用確實很麻煩。有好心人做了第三方配置指令碼,可是對不同系統的相容性比較差。不知道是不是使用者反饋還是EFF看不下去了,才開發了Certbot。Certbot確實是神器,化繁為簡。由此可見,很多時候,我們可以通過技術創造去提供更好的服務。使用HTTPS,開啟HTTP2.0。讓letsencrypt為你的網站保駕護航。