前段時(shí)間鳞骤,看見很多大會(huì)都在分享全站HTTPS的經(jīng)驗(yàn)窒百。HTTPS固然好,前提是SSL證書豫尽,并且簽發(fā)證書的機(jī)構(gòu)要靠譜篙梢。沃通的CA證書就相繼被Mozilla和Google封殺了。曾經(jīng)對(duì)于普通用戶美旧,權(quán)威渤滞,安全,并且免費(fèi)的證書無疑就像天上的星星榴嗅,可望而不可及⊥唬現(xiàn)在,這些星星變成了餡餅掉了下來嗽测。沒錯(cuò)绪励,我們可以申請(qǐng)安全免費(fèi)的ssl證書--- Let‘s Encrypt。
Let’s Encrypt是電子前哨基金會(huì)(EFF)發(fā)布的免費(fèi) SSL 證書服務(wù)唠粥,Google疏魏,Mozilla和Microsoft都極力支持。很早之前就聽說了let’s encrypt厅贪,當(dāng)時(shí)礙于其證書有效期短蠢护,并且配置麻煩,遂懶得折騰养涮。最近發(fā)現(xiàn)他們的網(wǎng)站發(fā)布了工具和一系列自動(dòng)化的工作流配置葵硕。嘗試了一下眉抬,還蠻不錯(cuò)。
安裝 Cerbot
Certbot專門用來部署Let‘s encrypt的工具懈凹,其官網(wǎng)會(huì)根據(jù)使用的web服務(wù)器軟件和操作系統(tǒng)平臺(tái)蜀变,提供響應(yīng)的安裝工具和安裝方法。
我這里選擇了Nginx
和Ubuntu16.10
的組合介评。會(huì)看到網(wǎng)站跳轉(zhuǎn)到一個(gè)簡(jiǎn)易的使用文檔库北。使用下面的命令安裝即可:
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install certbot
對(duì)于Ubuntu14以上的版本,可能并沒有add-apt-repository
们陆。需要安裝下面的軟件包:
$ sudo apt-get install python-software-properties
$ sudo apt-get install software-properties-common
Cerbot是EFF為了避免以前使用letsencyrpt配置繁瑣而開發(fā)的工具寒瓦。因操作系統(tǒng)不一樣,安裝的軟件包也不一樣坪仇,例如
centos
安裝的是cerbot-auto
杂腰,以前的ubuntu
安裝的則是letsencyrpt
。具體用那個(gè)椅文,直接通過上面的組合喂很,根據(jù)文檔提示即可。
配置
別擔(dān)心皆刺,Cerbot就是為了減少配置而生的少辣。這里的配置即創(chuàng)建一個(gè)目錄,配置域名訪問服務(wù)器即可羡蛾。首先創(chuàng)建一個(gè)文件夾漓帅,用于letsencrypt的目錄。
$ sudo mkdir -p /etc/letsencrypt
然后編輯nginx林说,啟動(dòng)一個(gè)基本的web服務(wù)煎殷。假設(shè)你的網(wǎng)站根目錄再/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服務(wù)器的主要作用在于讓letsencrypt校驗(yàn)?zāi)闶窃撚蛎乃姓摺R驗(yàn)榈认抡{(diào)用Certbot命令的時(shí)候珠移,會(huì)在www
目錄下創(chuàng)建一個(gè)隱藏的.well-known/acme-challenge
的文件弓乙,然后letsencrypt訪問http://www.example.com/.well-known/acme-challenge
。如果無法訪問钧惧,那么letsencrypt會(huì)認(rèn)為該域名不是你的暇韧,自然就無法為你簽發(fā)證書了。
生成證書
又是安裝浓瞪,又是配置服務(wù)器懈玻。目前為止還不算復(fù)雜。當(dāng)然乾颁,下面也不會(huì)復(fù)雜涂乌,有了上面的準(zhǔn)備艺栈,生成證書只需要一條命令。
$ sudo certbot certonly --webroot -w /var/www -d www.example.com
運(yùn)行命令之后湾盒,會(huì)有一些選擇湿右,Yes
或者No
,有一步需要提供一個(gè)郵箱罚勾,用于證書快過期的時(shí)候收到letsencrypt的提示毅人。
上面的命令中,certonly是子命令尖殃,webroot
是一個(gè)插件丈莺。w
參數(shù)表示網(wǎng)站的根目錄,即certbot創(chuàng)建.well-know
的地方分衫,d
參數(shù)表示簽發(fā)的域名场刑。可以一次指定多個(gè) w 網(wǎng)站
和d 域名
的配對(duì)蚪战。
對(duì)于其他系統(tǒng),有可能不是這個(gè)
certbot
命令铐懊,可能是certbot-auto
或者letsencrypt
簽發(fā)成功之后邀桑,就會(huì)在/etc/letsencrypt
下生成如下的文件:
$ ls
accounts archive csr keys live post-hook.d pre-hook.d renew-hook.d renewal
其中archive
文件夾存放多個(gè)歸檔的證書,keys
是所有的證書科乎。這些都是跟重簽證書和續(xù)有效期有關(guān)的壁畸。使用certbot的工具,我們可以忽略這些目錄茅茂。當(dāng)前使用的證書存放在live文件下捏萍。
在/etc/letsencrypt/live/www.example.com
目錄下有README cert.pem chain.pem fullchain.pem privkey.pem
這幾個(gè)文件,
- privkey.pem 這是私匙空闲,對(duì)應(yīng)Nginx的ssl_certificate_key選項(xiàng)令杈。
- cert.pem 服務(wù)器證書,對(duì)應(yīng)SSLCertificateFile選項(xiàng)碴倾。
- chain.pem 除服務(wù)器證書之外的所有證書逗噩,Nginx對(duì)應(yīng)ssl_trusted_certificate選項(xiàng)。
- fullchain.pem 包括上面的服務(wù)器證書和其他證書跌榔,Nginx對(duì)應(yīng)ssl_certificate選項(xiàng)异雁。
實(shí)際上live目錄的存放的證書文件都是對(duì)archive的連接。我們只要指定該目錄的文件僧须,當(dāng)證書更下的時(shí)候纲刀,會(huì)自動(dòng)修改連接。
配置HTTPS
我們已經(jīng)生成了SSL證書担平,下面就是應(yīng)用到我們的服務(wù)器了示绊。對(duì)于配置nginx的https锭部,有mozilla的一個(gè)網(wǎng)站提供了最佳實(shí)踐。我們只需要選擇nginx和openssl的版本耻台,就會(huì)自動(dòng)生成一個(gè)基礎(chǔ)配置給我們空免,非常方便
對(duì)于上面的配置,大致如下:
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;
表示監(jiān)聽443端口盆耽,并開啟http2蹋砚,當(dāng)然也可以不開啟。
ssl_certificate
配置fullchain.pem
的路徑摄杂; ssl_certificate_key
配置privkey.pem
的路徑坝咐。
ssl_dhparam
的配置/etc/nginx/ssl
。如果不存在這個(gè)文件析恢,就自己創(chuàng)建墨坚。創(chuàng)建的命令如下:
$ sudo mkdir /etc/nginx/ssl
$ sudo openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048
生成ssl_dhparam.pem文件大概需要一分鐘。ssl_trusted_certificate
的配置是可選的映挂,并且nginx文檔也提到ssl_certificate
如果已經(jīng)包含了intermediates
泽篮,所以我們就配置這個(gè)。
resolver的作用是配置解析OCSP服務(wù)器的域名柑船,通常會(huì)寫VPS云服務(wù)商提供的DNS服務(wù)器帽撑。這里我們也忽略。
配置完畢之后鞍时,重啟nginx亏拉,此時(shí)再訪問你的域名www.example.com
就能看見https的協(xié)議,瀏覽器加上了一把綠色的小鎖逆巍。
檢測(cè)SSL的安全性
配置成功HTTPS之后及塘,為了驗(yàn)證我們的成果,可以通過Qualys SSL Labs網(wǎng)站檢測(cè)锐极。不出意外笙僚,你將得到一個(gè)A+。如果還沒有溪烤,則仔細(xì)看看還差什么方面的修補(bǔ)啦味咳。
如果開啟了nginx的HTTP2配置,也會(huì)看見瀏覽器訪問的開發(fā)者工具中檬嘀,顯示的h2的協(xié)議槽驶。當(dāng)然,nginx開啟http需要版本在1.9.5之上鸳兽,編譯還需要設(shè)置--with-http_v2_module
掂铐。對(duì)于1.10.1以上的版本,則默認(rèn)安裝的就能開啟http2的功能。
更新證書
letsencrypt的證書權(quán)威且安全全陨,就是有效期只有90天爆班。過期前需要續(xù)時(shí)間。好在certbot提供的工具足夠簡(jiǎn)單辱姨。
運(yùn)行命令sudo certbot renew
即可續(xù)時(shí)間柿菩,如果還沒到過期時(shí)間,運(yùn)行命令也不會(huì)有大礙雨涛。當(dāng)然你可以使用命令測(cè)試sudo certbot renew --dry-run
枢舶。續(xù)的時(shí)候certbot也會(huì)根據(jù)上面配置域名的時(shí)候,校驗(yàn)服務(wù)器上.well-know
替久。確保你的服務(wù)器依然可以訪問這個(gè)文件凉泄,不然會(huì)認(rèn)證失敗。
成功續(xù)了時(shí)間之后蚯根,還需要重啟服務(wù)器后众。因此需要自己寫一個(gè)腳本或者cron。定期更新證書的有效期并且重啟nginx服務(wù)颅拦。
總結(jié)
Let‘s Encrypt項(xiàng)目剛開始的時(shí)候蒂誉,使用確實(shí)很麻煩。有好心人做了第三方配置腳本距帅,可是對(duì)不同系統(tǒng)的兼容性比較差拗盒。不知道是不是用戶反饋還是EFF看不下去了,才開發(fā)了Certbot锥债。Certbot確實(shí)是神器,化繁為簡(jiǎn)痊臭。由此可見哮肚,很多時(shí)候,我們可以通過技術(shù)創(chuàng)造去提供更好的服務(wù)广匙。使用HTTPS允趟,開啟HTTP2.0。讓letsencrypt為你的網(wǎng)站保駕護(hù)航鸦致。