去年運營商大面積劫持http,咱們公司的小網站也未能倖免。當時不少用戶投訴,立刻升級https還有所顧慮,因此當時簡單hack了一下。在html中作多種判斷,若是是在div中加廣告,就把這個div幹掉;若是內嵌到iframe中,就改變url,從新加載。暫時解決了,可是治標不治本,因此最近就進行https的升級。html
Let's Encrypt是去年十二月份開始公測的,能夠免費申請證書。其簽發的證書已經得到了交叉信任,已經能被全部主流瀏覽器信任了。交叉簽名來自 IdenTrust Root CA。python
官方提供了自動獲取證書的工具[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.com
。bash
用過letsencrypt-auto
就知道里面有不少坑了。
我在用的過程當中,發現python2.6不支持,python3.5不支持,後來安裝python2.7.11才能夠運行。
安裝python以前,要安裝bz2壓縮相關的包,否則執行letsencrypt-auto
會報錯。
python的源,我用aliyun的不行,提示有個版本的包找不到,換成豆瓣的才能夠http://pypi.douban.com/
。
因此acme-tiny出現了,建議使用這個來代替letsencrypt-auto
。
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
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個證書。同一個子域名註冊或更新都是要計算次數的。