升級https, Let's Encrypt

升級的緣由

去年運營商大面積劫持http,咱們公司的小網站也未能倖免。當時不少用戶投訴,立刻升級https還有所顧慮,因此當時簡單hack了一下。在html中作多種判斷,若是是在div中加廣告,就把這個div幹掉;若是內嵌到iframe中,就改變url,從新加載。暫時解決了,可是治標不治本,因此最近就進行https的升級。html


新證書管理機構--Let's Encrypt

Let's Encrypt是去年十二月份開始公測的,能夠免費申請證書。其簽發的證書已經得到了交叉信任,已經能被全部主流瀏覽器信任了。交叉簽名來自 IdenTrust Root CA。python


申請證書工具letsencrypt-auto

官方提供了自動獲取證書的工具[letsencrypt-auto],只需一條命令,便可獲取證書。第一步是下載工具:nginx

git clone https://github.com/letsencrypt/letsencrypt

執行命令./letsencrypt-auto便可啓動客戶端,在執行以前,咱們來看看它的用法。
letsencrypt-auto官方集成了幾個插件來幫助咱們使用:git

  • apache 在Debian相關係統的Apache 2.4上,能夠實現自動獲取和安裝證書github

  • standalone 直接獲取證書。這個在申請過程當中,會啓動一個服務佔用80端口,並以此來進行域名全部者驗證web

  • webroot 若是本身啓動了web服務器,這個命令會在根目錄中寫文件,以便letsencrypt來驗證全部者apache

  • manual 徹底手動,本身動手,豐衣足食json

  • nginx 測試中,等穩定了再加入letsencrypt-auto瀏覽器

因此,若是正在運行apache服務器,能夠執行 ./letsencrypt-auto --apache -d example.com -d www.example.com -d other.example.net,這個會獲取證書,並安裝。
若是沒有web服務器,能夠執行: ./letsencrypt-auto certonly --standalone -d example.combash


letsencrypt-auto替代者

用過letsencrypt-auto就知道里面有不少坑了。

  • 我在用的過程當中,發現python2.6不支持,python3.5不支持,後來安裝python2.7.11才能夠運行。

  • 安裝python以前,要安裝bz2壓縮相關的包,否則執行letsencrypt-auto會報錯。

  • python的源,我用aliyun的不行,提示有個版本的包找不到,換成豆瓣的才能夠http://pypi.douban.com/

因此acme-tiny出現了,建議使用這個來代替letsencrypt-auto


利用acme-tiny申請證書步驟

創建Let's Encrypt帳戶的私鑰

openssl genrsa 4096 > account.key

生成域名的私鑰

openssl genrsa 4096 > domain.key

#對於單個域名,執行下面這條語句
openssl req -new -sha256 -key domain.key -subj "/CN=yoursite.com" > domain.csr

#對於多域名,能夠執行下面這條語句
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

新建challenge文件夾

mkdir -p /var/www/challenges/

這個文件夾能夠是任意文件夾,記得nginx有權限讀便可。配置nginx:

server {
        listen 80;
        server_name yoursite.com www.yoursite.com;
        location /.well-known/acme-challenge/ {
            alias /var/www/challenges/;
            try_files $uri =404;
        }
        ...the rest of your config
    }

驗證域名全部者,就是經過在/.well-known/acme-challenge/裏寫文件,而後經過公網來訪問,看能不能訪問到來判斷的。

正式開始申請

python acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir /var/www/challenges/ > ./signed.crt
提示成功後,signed.crt就是證書,對應的私鑰就是domain.key。若是要申請多個,account.key能夠不用變化,其餘都要變。

安裝證書

對於nginx,還須要額外步驟:

wget -O - https://letsencrypt.org/certs/lets-encrypt-x1-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_dhparam /path/to/server.dhparam;
        ssl_prefer_server_ciphers on;
    
        ...the rest of your config
    }

定時更新證書

能夠經過crontab來定時更新證書。腳本renew_cert.sh示例:

#!/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-x1-cross-signed.pem > intermediate.pem
cat /tmp/signed.crt intermediate.pem > /path/to/chained.pem
service nginx reload
#每個月1號執行
0 0 1 * * /path/to/renew_cert.sh 2>> /var/log/acme_tiny.log

注意事項

  • 更新證書時,要保證步驟3設置不變,即letsencrypt服務器可以訪問對應域名下的/.well-known/acme-challenge/文件夾

  • 同一個ip在3小時內最多申請10個域名的證書

  • 同一個根域名在七天內,只能註冊5個證書。同一個子域名註冊或更新都是要計算次數的。

相關文章
相關標籤/搜索