Let's Encrypt,站點加密之旅

HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全爲目標的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎是SSL,所以加密的詳細內容就須要SSL。python

Let's Encrypt,是2016年4月12日成立的一家證書受權中心,提供免費的傳輸層安全(TLS)X.509證書,經過自動化的過程消除目前安全網站證書須要手工建立,加密,簽名,安裝以及更新的複雜性。linux

一直以來都以爲瀏覽器網址開頭的那把小綠鎖很別緻啊,如今Let's Encrypt橫空出世提供免費證書,說明https勢在必行,那我也來動手給博客加把鎖吧,看着就安全是吧。nginx

Let's Encrypt 的官網提供的腳本看起來更加自動化一些,但我沒有親自嘗試,而是在Github上搜到了一個開源腳本acme-tiny,用下來以後成功將博客加密完成。git

圖片描述

根據acme-tiny提供的說明文檔和我本身的實施過程列出如下幾步:github

克隆腳本

sudo git clone https://github.com/diafygi/acme-tiny.git  
cd acme-tiny

建立Let's Encrypt私鑰

openssl genrsa 4096 > account.key

建立CSR(Certificate Signing Request,證書籤名請求) 文件

ACME協議 (Let's Encrypt所使用的) 須要一個csr文件,用來進行證書籤名和證書更新。web

將須要加密的域名加到下面的代碼中,目前一張證書最多能夠加密 100 個域名:瀏覽器

openssl genrsa 4096 > domain.key     
openssl req -new -sha256 -key domain.key -subj "/" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:yoursite.com,DNS:www.yoursite.com")) > domain.csr

注意:openssl.cnf 文件的位置可能會由於linux版本的不一樣而有變安全

證實你擁有該域名

acme-tiny腳本會生成驗證文件並寫入到你指定的目錄下,而後經過 ".well-known/acme-challenge/" 這個URL來訪問到驗證文件. 注意: Let's Encrypt 會對你的服務器作一次http請求來進行驗證,所以你須要保證80端口可以訪問.服務器

  • 手動生成challenges目錄,用來存放驗證文件(路徑能夠根據須要修改)session

    mkdir -p /var/www/challenges

  • 配置nignx的80端口

server {

    listen 80;
    server_name yoursite.com www.yoursite.com;
    
    if ( $request_uri !~ "/.well-known/acme-challenge/*" ) { # 讓 Let's Encrypt 成功訪問到驗證文件不受 301 影響
        return 301 https://yoursite.com$request_uri; # 注意進行301重定向到https,不然經過http仍能訪問你的站點
    }
    
    location /.well-known/acme-challenge/ {
        alias /var/www/challenges/;
        try_files $uri =404;
    }

    #...你的其餘配置
}

Apache 則需修改 .htaccess 文件配置301重定向:

RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

獲取簽名證書

sudo chmod +x acme_tiny.py  
python acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir /var/www/challenges/ > ./signed.crt

安裝證書

針對nginx, 你還須要將 Let's Encrypt 的中間件證書 intermediate.pem 內容附加在簽名證書signed.crt以後:

wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem  
cat signed.crt intermediate.pem > chained.pem
server {
    listen 443;
    server_name yoursite.com, www.yoursite.com;

    ssl on;
    ssl_certificate /path/to/chained.pem;
    ssl_certificate_key /path/to/domain.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA;
    ssl_session_cache shared:SSL:50m;
    ssl_prefer_server_ciphers on;

    #...你的其餘配置
}

證書自動更新定時任務

恭喜!你的網站已經使用上了HTTPS。 但Let's Encrypt 證書有效期只有90天, 因此須要按期更新。如今只須要寫一個更新腳本並把它放到定時任務中便可。

腳本內容:

#!/usr/bin/sh

python /path/to/acme_tiny.py --account-key /path/to/account.key --csr /path/to/domain.csr --acme-dir /var/www/challenges/ > /tmp/signed.crt || exit

wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem

cat /tmp/signed.crt intermediate.pem > /path/to/chained.pem

service nginx reload

定時任務能夠設置爲每月執行一次:

0 0 1 * * /path/to/renew_cert.sh 2>> /var/log/acme_tiny.log

原文連接:https://macken.me/article/encrypt-your-webiste-with-lets-encrypt

相關文章
相關標籤/搜索