Nginx開啓SSL支持HTTPS(使用Let's Encrypt免費證書)

Let's Encrypt是國外一個公共的免費SSL項目,由 Linux 基金會託管。html

它的來頭不小,由Mozilla、思科、Akamai、IdenTrust和EFF等組織發起,目的就是向網站自動簽發和管理免費證書,以便加速互聯網由HTTP過渡到HTTPS,目前Facebook等大公司開始加入贊助行列。python

Let's Encrypt已經得了 IdenTrust 的交叉簽名,這意味着其證書如今已經能夠被Mozilla、Google、Microsoft和Apple等主流的瀏覽器所信任,你只須要在Web 服務器證書鏈中配置交叉簽名,瀏覽器客戶端會自動處理好其它的一切,Let's Encrypt安裝簡單,目前看來推廣的很順利,確實幫助全球互聯網快速進入HTTPS時代了。nginx

這裏介紹一下使用NGINX如何配置使用Let's Encrypt的證書。c++

1、安裝NGINX

#yum -y install gcc gcc-c++ make libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel
#cd /usr/local
#wget http://nginx.org/download/nginx-1.13.0.tar.gz
#tar –zxvf nginx-1.13.0.tar.gz

進入nginx 文件夾目錄執行如下命令:git

./configure --prefix=/usr/local/nginx1.13 --with-http_stub_status_module --with-http_ssl_module

加了兩項編譯參數,給nginx加上http_stub_status_module模塊和http_ssl_module模塊。
若是沒有配置ssl模塊,開啓SSL參數後nginx會提示錯誤:nginx: [emerg] the 「ssl」 parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf)。github

  • –prefix=PATH : 指定nginx的安裝目錄。默認 /usr/local/nginx
  • –with-http_ssl_module : 使用https協議模塊。默認狀況下,該模塊沒有被構建。前提是openssl與openssl-devel已安裝
  • –with-http_stub_status_module : 用來監控 Nginx 的當前狀態

配置後輸入如下命令:web

make && make install


2、若是你已經安裝過nginx,只是沒加入http_ssl_module,這個SSL模塊,那能夠這麼操做。

一、切換到源碼包:apache

#cd /usr/local/src/nginx-1.13.0

二、查看nginx原有的模塊:centos

#/usr/local/nginx/sbin/nginx -V

在configure arguments:後面顯示的原有的configure參數以下:python3.x

--prefix=/usr/local/nginx --with-http_stub_status_module

那麼咱們的新配置信息就應該這樣寫:

#./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_modul

運行上面的命令便可,等配置完。
配置完成後,運行命令:

#make

這裏不要進行make install,不然就是覆蓋安裝。
而後備份原有已安裝好的nginx。

#cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak

而後將剛剛編譯好的nginx覆蓋掉原有的nginx(這個時候nginx要中止狀態)。

#service nginx stop
#cp ./objs/nginx /usr/local/nginx/sbin/

而後啓動nginx,仍能夠經過命令查看是否已經加入成功

#service nginx start
#/usr/local/nginx/sbin/nginx -V 

3、開始配置Let‘s Encrypt

Let’s Encrypt官網推薦你們使用Certbot來安裝。

  • 系統要求:官方文檔上已經寫出支持python2.6或2.7的操做系統上,python3.x有望在將來支持,若是是2.7以上SSL證書會自動安裝,不用手動的;須要使用Root帳戶安裝,有寫入文件/etc/letsencrypt, /var/log/letsencrypt, /var/lib/letsencrypt的權限,安裝時須要使用80和443端口。

一、保證你申請SSL的域名和服務器的IP是一致的,即域名確實是解析到你的服務器上的,可使用nslookup命令查詢。

#nslookup www.yourwebsite.com

Let’s Encrypt在給你分配證書時,會檢查你所在的服務器是否和域名解析的服務器一致。

二、安裝Git 和bc ,並從github上將代碼克隆到本地

#yum –y git bc
#git clone https://github.com/certbot/certbot /opt/certbot-master

三、安裝環境支持
由於certbot對Debian系統支持最好,能夠完成自動檢測並安裝相應的軟件。若是你是使用其它的Linux系統,Redhat或CentOS 6可能須要配置EPEL軟件源,Python須要2.7版本以上,若是發現運行第4步出錯,可能就是沒有安裝支持環境,能夠回來這裏安裝

# CentOS 6
yum install centos-release-SCL && yum update
yum install python27
scl enable python27 bash
yum install python27-python-devel python27-python-setuptools python27-python-tools python27-python-virtualenv
yum install augeas-libs dialog gcc libffi-devel openssl-devel python-devel

yum install python-argparse

# CentOS 7
yum install -y git python27
yum install -y augeas-libs dialog gcc libffi-devel openssl-devel python-devel
yum install python-argparse


四、安裝開始,須要停掉nginx,由於須要用到80端口鏈接驗證

#service nginx stop
#/opt/certbot-master/letsencrypt-auto --help

或者用指定域名和郵箱進行安裝,免得設置。

#/opt/certbot-master/letsencrypt-auto certonly --standalone -email 郵箱地址(郵箱地址是用來接收緊急通知和找回密鑰的) -d 域名

執行上述命令後,會彈出對話框,贊成用戶協議,而後按文字提示操做下去就好了,支持多域名,只須要在用空格或者英文逗號分隔就行了。若是使用國內 VPS,此處可能會因爲 DNS 問題出錯,能夠嘗試更換 VPS 的 DNS 爲第三方,好比 8.8.8.8。

運行完成以後,你會看到下面這個提示:
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
  /etc/letsencrypt/live/bnxb.com/fullchain.pem. Your cert will
  expire on 2017-08-16. To obtain a new version of the certificate in
  the future, simply run Let's Encrypt again.
- Your account credentials have been saved in your Let's Encrypt
  configuration directory at /etc/letsencrypt. You should make a
  secure backup of this folder now. This configuration directory will
  also contain certificates and private keys obtained by Let's
  Encrypt so making regular backups of this folder is ideal.
- If you like Let's Encrypt, please consider supporting our work by:

Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate

命令完成後,最新版本的證書位置:/etc/letsencrypt/live/域名/
每一個域名一個目錄,有如下文件:

  • cert.pem 申請的服務器證書文件
  • privkey.pem 服務器證書對應的私鑰
  • chain.pem 除服務器證書外,瀏覽器解析所需的其餘所有證書,好比根證書和中間證書
  • fullchain.pem 包含服務器證書的所有證書鏈文件

nginx 中用到的是fullchain.pem 和 privkey.pem 其餘爲apache使用的證書。

五、啓用更安全的加密方式
默認是 SHA-1 形式,而如今主流的方案應該都避免 SHA-1,爲了確保更強的安全性,咱們能夠採起迪菲-赫爾曼密鑰交換。

#yum install openssl
#yum install openssl-devel
#openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

完整配置:

server {
        #nginx 監聽端口,443爲默認https端口,ssl指使用https
        listen 80 default backlog=2048;
        listen 443 ssl;
        # 服務器名稱
        server_name bnxb.com;
        # https證書公鑰
        ssl_certificate /etc/letsencrypt/live/bnxb.com/fullchain.pem;
        # https證書私鑰 要注意保存!
        ssl_certificate_key /etc/letsencrypt/live/域名/privkey.pem;
        # 支持的加密協議
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        #nginx默認會使用Diffiel-Hellman交換密鑰是1024位的,相對不安全,因此須要替換使用更安全的
        ssl_dhparam /etc/ssl/certs/dhparam.pem;
        # 支持的加密套件
        ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
        # 定義session過時時間
        ssl_session_timeout 1d;



        ssl_session_cache shared:SSL:50m;
        ssl_stapling on;
        ssl_stapling_verify on;
        # 若是是全站 HTTPS 而且不考慮 HTTP 的話能夠爲響應頭添加要求瀏覽器使用https重定向的 header
        add_header Strict-Transport-Security max-age=15768000;
        # 禁止外部站點iframe
        add_header X-Frame-Options DENY;
        # The rest of your server block
        root /path/to/root;
        index index.html index.htm;
        location / {
                try_files $uri $uri/ =404;
        }
}

還能夠再增長配置80端口跳轉到HTTPS:

location / {
      return 301 https://$server_name$request_uri;
    }

經過此網址查詢你的SSL狀態:https://www.ssllabs.com/ssltest/analyze.html?d=域名


Let's Encrypt證書只有90天有效期,過時前須要續期。

  • 手動續期:
#./letsencrypt-auto renew --force-renewal
  • 能夠經過配置腳本自動更新證書。
#!/bin/sh
# This script renews all the Let's Encrypt certificates with a validity < 30 days

if ! /opt/letsencrypt/letsencrypt-auto renew > /var/log/letsencrypt/renew.log 2>&1 ; then
    echo Automated renewal failed:
    cat /var/log/letsencrypt/renew.log
    exit 1
fi
nginx -t && nginx -s reload
  • 開啓定時任務Cron。
#crontab -e
編輯任務內容

@daily /path/to/renewCerts.sh

完畢。

相關文章
相關標籤/搜索