Nginx服務器使用Let’s Encrypt配置SSL

HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全為目標的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。 它是一個URI scheme(抽象標識符體系),句法類同http:體系。用於安全的HTTP數據傳輸。https:URL表明它使用了HTTP,但HTTPS存在不同於HTTP的默認端口及一個加密/身份驗證層(在HTTP與TCP之間)。這個系統的最初研發由網景公司(Netscape)進行,並內置於其瀏覽器Netscape Navigator中,提供了身份驗證與加密通訊方法。現在它被廣泛用於萬維網上安全敏感的通訊,例如交易支付方面。

Nginx服務器使用Let’s Encrypt配置SSL

1、SSL加密

SSL是Netscape公司所提出的安全保密協議,在瀏覽器(如Internet Explorer、Netscape Navigator)和Web服務器(如Netscape的Netscape Enterprise Server、ColdFusion Server等等)之間構造安全通道來進行數據傳輸,SSL運行在TCP/IP層之上、應用層之下,為應用程序提供加密數據通道,它採用了RC4、MD5以及RSA等加密算法,使用40 位的密鑰,適用於商業信息的加密。同時,Netscape公司相應開發了HTTPS協議並內置於其瀏覽器中,HTTPS實際上就是HTTP over SSL,它使用默認端口443,而不是像HTTP那樣使用端口80來和TCP/IP進行通信。HTTPS協議使用SSL在發送方把原始數據進行加密,然後在接受方進行解密,加密和解密需要發送方和接受方通過交換共知的密鑰來實現,因此,所傳送的數據不容易被網絡黑客截獲和解密。 然而,加密和解密過程需要耗費系統大量的開銷,嚴重降低機器的性能,相關測試數據表明使用HTTPS協議傳輸數據的工作效率只有使用HTTP協議傳輸的十分之一。假如為了安全保密,將一個網站所有的Web應用都啟用SSL技術來加密,並使用HTTPS協議進行傳輸,那麼該網站的性能和效率將會大大降低,而且沒有這個必要,因為一般來說並不是所有數據都要求那麼高的安全保密級別

2、TLS加密

TLS:安全傳輸層協議

TLS:Transport Layer Security

安全傳輸層協議(TLS)用於在兩個通信應用程序之間提供保密性和數據完整性。該協議由兩層組成: TLS 記錄協議(TLS Record)和 TLS 握手協議(TLS Handshake)。較低的層為 TLS 記錄協議,位於某個可靠的傳輸協議(例如 TCP)上面。

目前SSL加密免費證書有很多,一般包括Let’s Encrypt,StartSSL,COMODO PositiveSSL,CloudFlare SSL,Wosign沃通SSL(原來免費,現在收費),等等,在這裡推薦大家使用Let’s Encrypt

,下面小編寫下自己網站使用Let’s Encrypt配置的過程。

1、首先我們到https://github.com/certbot/certbot Let‘s Encrypt網站下載項目,如果您的機器上已安裝git,可以直接clone到本地,這裡小編就直接下載了

Nginx服務器使用Let’s Encrypt配置SSL

下載Let’s Encrypt資源

2、下載之後,我們將這個文件上傳到服務器,解壓到某個目錄下。例如我的解壓到/opt

3、解壓之後我們把文件重命名為letsencrypt,然後進入這個目錄執行這個命令,這個命令意思是自動安裝相關依賴,讓客戶端將引導您完成交互式獲取和安裝證書的過程。

./certbot-auto --help all

4、您也可以從命令行準確地告訴它您希望它執行的操作。舉例來說,如果你想獲得一個證書的example.com, www.example.com以及other.example.com,使用Apache插件都獲取並安裝證書,你可以這樣做:(執行這個命令前提具備完整插件支持的網絡服務器,如果沒有,可以使用“獨立”或“webroot”插件獲取證書,參見步驟5,6 這裡小編採用的是webroot 的方式

./certbot-auto --apache -d example.com -d www.example.com -d other.example.com

(你運行該命令的第一次,它將使一個帳戶,並要求郵件並同意了讓我們加密用戶協議,您可以自動化那些(–emai和–agree-tos)

5、如果您想使用尚未具備完整插件支持的網絡服務器,則仍然可以使用“

獨立”模式獲取證書,多個域名使用多個-d參數,也可以用“,”分割,例如:”-d leepeng.com.cn,www.leepeng.com.cn”

./certbot-auto certonly --standalone --email [email protected] -d example.com -d www.example.com -d other.example.net

6、如果您想使用尚未具備完整插件支持的網絡服務器,則仍然可以使用“webroot ”模式獲取證書:(前提要保證服務器能夠訪問到-w所指定的目錄下)

./certbot-auto certonly --webroot -w /var/www/html -d www.leepeng.com.cn

7、執行步驟6後可能出現如下錯誤404的錯誤,按照路徑錯誤地址創建相應目錄./well-known/acme-challenge創建到這裡後面就不需要了。創建完成後再次執行步驟6命令即可,沒有出現這個問題請忽略。

Nginx服務器使用Let’s Encrypt配置SSL

8、生成成功後會自動保存在/etc/letsencrypt目錄下生成證書文件,目錄結構如圖,這時候我們可以根據生成的證書配置服務器了,這裡建議把把證書備份哈!

Nginx服務器使用Let’s Encrypt配置SSL

SSL證書Nginx配置

1、有了證書之後,我們準備開始配置,配置之前我們需要準備dhparam.pem文件:

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

執行後會顯示

This is going to take a long time.......+...........................+............................+............................+............++*++*++*

那麼這些打印的內容是什麼呢? dhparam 算法是在 2^4096 個數字中找出兩個質數,所以需要的時間挺長。….. 意思是有可能的質數,+ 是正在測試的質數,* 是已經找到的質數。這就涉及到前向安全性(Forward Secrecy)的概念,客戶端和服務器協商一個永不重用的密鑰,並在會話結束時銷燬它。服務器上的 RSA 私鑰用於客戶端和服務器之間的 Diffie-Hellman 密鑰交換籤名。從 Diffie-Hellman 握手中獲取的預主密鑰會用於之後的編碼。因為預主密鑰是特定於客戶端和服務器之間建立的某個連接,並且只用在一個限定的時間內,所以稱作短暫模式(Ephemeral)。

如果使用前向安全機制,攻擊者取得了一個服務器的私鑰,他是不能解碼之前的通訊信息的。這個私鑰僅用於 Diffie Hellman 握手簽名,並不會洩露預主密鑰。Diffie Hellman 算法會確保預主密鑰絕不會離開客戶端和服務器,而且不能被中間人攻擊所攔截。

所有版本的 nginx 都依賴於 OpenSSL 給 Diffie-Hellman 的輸入參數。如果不特別聲明,將使用 OpenSSL 的默認設置,1024 位密鑰。這絕壁是不安全的,因為我們正在使用 2048 位證書,所以要有一個更強大的 DH(更多詳細描述請前往:https://www.pupboss.com/nginx-add-ssl/ )

2、接下來我們配置Nginx服務器,首先修改server,請求80端口重定向到https這個域名

server {

listen 80;

return 301 https://www.leepeng.com.cn$request_uri;

server_name www.leepeng.com.cn;

……..

接下來我們配置nginx,添加server,根據自己實際情況配置

server {

listen 443 ssl;

server_name www.leepeng.com.cn;

ssl_certificate /ssl/live/www.leepeng.com.cn/fullchain.pem;

ssl_certificate_key /ssl/live/www.leepeng.com.cn/privkey.pem;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

ssl_prefer_server_ciphers on;

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’;

ssl_session_timeout 1d;

ssl_session_cache shared:SSL:50m;

ssl_stapling on;

ssl_stapling_verify on;

add_header Strict-Transport-Security max-age=15768000;

# The rest of your server block

root /var/www/html;

index index.php index.html index.htm;

location / {

try_files $uri $uri/ /index.php?$args;

#root /var/www/html;

#index index.php index.html index.htm;

}

location ~ .*\\.(js|css|png|jpg|gif)$

{

if (-f $request_filename) {

expires 1d;

break;

}

}

配置好後重啟nginx,在瀏覽器訪問:

Nginx服務器使用Let’s Encrypt配置SSL

最後,點擊證書信息後可知是3個月的期限,到期後可以通過執行腳本./certbot-auto renew來更新證書就可以了,哈哈,是不是很方便呢!以上就是SSL在Nginx服務器上配置的過程,供大家參考,謝謝!


分享到:


相關文章: