Nginx 配置 HTTPS 服務器

瀏覽器地址欄標志著 HTTPS 的綠色小鎖頭從心理層面上可以給用戶專業安全的心理暗示,本文簡單總結一下如何在 Nginx 配置 HTTPS 服務器,讓自己站點上『綠鎖』。

?

Nginx 配置 HTTPS 并不復雜,主要有兩個步驟:簽署第三方可信任的 SSL 證書?和?配置 HTTPS

簽署第三方可信任的 SSL 證書

SSL 證書主要有兩個功能:加密身份證明,通常需要購買,也有免費的,通過第三方 SSL 證書機構頒發。由于可信的證書頒發機構只有那么幾家,所以必須要從他們那里獲取或者購買。我的https證書是從騰訊云那里免費獲取的(網址:https://console.qcloud.com/ssl)。通過之后下載下來就可以了。



申請的都是一年的有效期,之前在騰訊云購買了云服務器、域名,域名已使用云解析服務,可自動添加DNS記錄驗證,很快就能驗證通過。

通過后會用申請的域名為包名發送給你,打開后有


我們主要用到Nginx包里的文件

自簽名ssl證書

也可以使用自己簽名SSL證書配置HTTPS,使用自己簽名SSL證書配置到服務器后,可以通過HTTPS正常訪問應用,但是瀏覽器會提示該網站的安全證書不受信任,不會有綠鎖標志。

使用openssl生成證書

openssl 是目前最流行的 SSL 密碼庫工具,其提供了一個通用、健壯、功能完備的工具套件,用以支持SSL/TLS 協議的實現。

官網:https://www.openssl.org/source/

1. SSH登錄到服務器,使用下述命令創建根證書的私匙:

sudo openssl req -x509 -nodes -days 36500 -newkey rsa:2048 -keyout /root/project/ssl/nginx.key -out /root/project/ssl/nginx.crt

req: 配置參數-x509指定使用 X.509證書簽名請求管理(certificate signing request (CSR))."X.509" 是一個公鑰代表that SSL and TLS adheres to for its key and certificate management.

-nodes: 告訴OpenSSL生產證書時忽略密碼環節.(因為我們需要Nginx自動讀取這個文件,而不是以用戶交互的形式)。

-days 36500: 證書有效期,100年

-newkey rsa:2048: 同時產生一個新證書和一個新的SSL key(加密強度為RSA 2048)

-keyout:SSL輸出文件名

-out:證書生成文件名

它會問一些問題。需要注意的是在common name中填入網站域名,如wiki.xby1993.net即可生成該站點的證書,同時也可以使用泛域名如*.xby1993.net來生成所有二級域名可用的網站證書。

整個問題應該如下所示:


Country Name (2 letter code) [AU]:CN

State or Province Name (full name) [Some-State]:Fu jian

Locality Name (eg, city) []:Xia men

Organization Name (eg, company) [Internet Widgits Pty Ltd]:lin

Organizational Unit Name (eg, section) []:qiezi

Common Name (e.g. server FQDN or YOUR name) []:www.qeizi666.cn

Email Address []:363232233@qq.com

上面的命令會在`/root/project/ssl`目錄下生成`nginx.crt`和`nginx.key`文件,創建了有效期100年,加密強度為RSA2048的SSL密鑰key和X509證書文件。

配置 HTTPS

Nginx安裝ssl模塊

Nginx 默認安裝的情況下ssl模塊并未被安裝,如果要使用該模塊則需要在編譯nginx時指定–with-http_ssl_module參數.

1.查看ngixn版本極其編譯參數

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

我已經安裝ssl模塊,所以有ssl的一些信息

2.進入你自己的nginx源碼目錄

cd developer/nginx-1.13.9/


3.重新編譯的代碼和模塊

./configure --prefix=/usr/local/nginx--with-http_stub_status_module --with-http_ssl_module --with-file-aio --with-http_realip_module

4.make,千萬別make install,否則就覆蓋安裝了

make

5.備份舊的nginx程序

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

6.復制objs下的nginx程序覆蓋舊的

cp objs/nginx /usr/local/nginx/sbin/nginx

7.測試新的nginx程序是否正確

/usr/local/nginx/sbin/nginx -t


8.重啟nginx

/usr/local/nginx/sbin/nginx -s reload

9.查看ngixn版本極其編譯參數

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

Nginx上啟用https

配置Nginx配置文件

編輯nginx.conf

vim /usr/local/nginx/conf/nginx.conf

在http下添加

include vhost/*.conf;

這是為了方便擴展和維護

在conf目錄下創建vhost文件夾,里面專門存放nginx的配置,可以以域名為文件名存在配置


Nginx上啟用https

#簡單配置

server {

? ? ? listen? ? ? ? 443 ssl;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? server_name? ? www.****.com;#域名? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ssl_certificate? ? ? /root/project/ssl/nginx.crt;#證書路徑? ? ?

? ? ? ssl_certificate_key? /root/project/ssl/nginx.key;#key路徑? ? ? ? ? ? ?

? ? ? ssl_session_cache? ? shared:SSL:1m; #s儲存SSL會話的緩存類型和大小? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ssl_session_timeout? 5m; #會話過期時間

? ? ? #...? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? }


將http訪問自動跳轉到https

server{

? ? ? ? listen 80 www.****.com;? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ? rewrite? ^/(.*)$ https://www.****.com/$1 permanent;?

}? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

HTTPS服務器優化

激活?keepalive?長連接,一個連接發送更多個請求

復用 SSL 會話參數,在并行并發的連接數中避免進行多次 SSL『握手』

這些會話會存儲在一個 SSL 會話緩存里面,通過命令?ssl_session_cache?配置,可以使緩存在機器間共享,然后利用客戶端在『握手』階段使用的?seesion id?去查詢服務端的 session cathe(如果服務端設置有的話),簡化『握手』階段。

1M 的會話緩存大概包含 4000 個會話,默認的緩存超時時間為 5 分鐘,可以通過使用?ssl_session_timeout?命令設置緩存超時時間。下面是一個擁有 10M 共享會話緩存的多核系統優化配置例子:

server {

? ? ? listen? ? ? ? 443 ssl;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? server_name? ? www.****.com;#域名? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ssl_certificate? ? ? /root/project/ssl/nginx.crt;#證書路徑? ? ?

? ? ? ssl_certificate_key? /root/project/ssl/nginx.key;#key路徑? ? ? ? ? ? ?

? ? ? ssl_session_cache? ? shared:SSL:1m; #s儲存SSL會話的緩存類型和大小? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ssl_session_timeout? 5m; #會話過期時間? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ssl_ciphers? HIGH:!aNULL:!MD5; #為建立安全連接,服務器所允許的密碼格式列表? ? ? ? ? ??

? ? ? ssl_prefer_server_ciphers? on; #依賴SSLv3和TLSv1協議的服務器密碼將優先于客戶端密碼

? ? ?#配置共享會話緩存大小

? ? ? ssl_session_cacheshared:SSL:10m;

? ? ? #配置會話超時時間

? ? ? ssl_session_timeout10m;

?#...? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? }


使用 HSTS 策略強制瀏覽器使用 HTTPS 連接

HSTS – HTTP Strict Transport Security,HTTP嚴格傳輸安全。它允許一個 HTTPS 網站要求瀏覽器總是通過 HTTPS 來訪問,這使得攻擊者在用戶與服務器通訊過程中攔截、篡改信息以及冒充身份變得更為困難。

只要在 Nginx 配置文件加上以下頭信息就可以了:

add_headerStrict-Transport-Security"max-age=31536000; includeSubDomains;preload"always;

max-age:設置單位時間內強制使用 HTTPS 連接

includeSubDomains:可選,所有子域同時生效

preload:可選,非規范值,用于定義使用『HSTS 預加載列表』

always:可選,保證所有響應都發送此響應頭,包括各種內置錯誤響應

加強 HTTPS 安全性

HTTPS 基礎配置采取的默認加密算法是 SHA-1,這個算法非常脆弱,安全性在逐年降低,在 2014 年的時候,?Google 官方博客就宣布在 Chrome 瀏覽器中逐漸降低 SHA-1 證書的安全指示,會從 2015 年起使用 SHA-2 簽名的證書,可參閱?Rabbit_Run?在 2014 年發表的文章:《為什么Google急著殺死加密算法SHA-1》

為此,主流的 HTTPS 配置方案應該避免 SHA-1,可以使用?迪菲-赫爾曼密鑰交換(D-H,Diffie–Hellman key exchange)方案。

首先在目錄?/root/project/ssl?運行以下代碼生成?dhparam.pem?文件:

一般網站使用的SSL證書都是RSA證書,這種證書基本都是2048位的密鑰,但是證書密鑰交換密鑰必須要比證書密鑰更長才能安全,而默認的只有1024位,所以我們需要手動生成一個更強的密鑰。所以配置之前,如果沒有DH-key就需要做下面的步驟

有screen則跳過,沒則安裝

yum -y install screen

生成4096位的DH-Key(證書密鑰交換密鑰)

screen -S DH

openssl dhparam -out dhparam.pem 4096


執行之后需要等很長時間,總之慢慢等,網路出現中斷,可以執行下面命令重新連接安裝窗口

screen -r DH

熬過漫長的等待時間后,建議生成的dhparam.pem文件最好跟SSL證書放在一起方便管理。

然后加入 Nginx 配置:

#優先采取服務器算法

ssl_prefer_server_ciphers? on;

#使用DH文件

ssl_dhparam? ? ?/root/project/ssl/dhparam.pem;

ssl_protocols? ? ?TLSv1 TLSv1.1TLSv1.2;

#定義算法

ssl_ciphers? "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";

一般情況下還應該加上以下幾個增強安全性的命令:

#減少點擊劫持

add_headerX-Frame-Options DENY;

#禁止服務器自動解析資源類型

add_headerX-Content-Type-Options nosniff;

#防XSS攻擊

add_headerX-Xss-Protection1;


優化后的綜合配置

server {

? ? ? ? listen? ? ? ? ? ? ? 443 ssl;

? ? ? ? ? server_name? ? www.****.com;#域名? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ssl_certificate? ? ? /root/project/ssl/nginx.crt;#證書路徑? ? ?

????ssl_certificate_key? /root/project/ssl/nginx.key;#key路徑?

????ssl_session_cache? ? shared:SSL:1m; #s儲存SSL會話的緩存類型和大小? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ? ssl_session_timeout? 5m; #會話過期時間

#設置長連接

? ? ? ? keepalive_timeout? 70;

#HSTS策略

? ? ? ? add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

#優先采取服務器算法

? ? ? ? ssl_prefer_server_ciphers on;

? #使用DH文件

? ? ? ? ssl_dhparam ? ? /root/project/ssl/dhparam.pem;

? ? ? ? ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

? ? ? ? #定義算法

? ? ? ? ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";

? ? ? ?#減少點擊劫持

? ? ? ? add_header X-Frame-Options DENY;

? ? ? ? #禁止服務器自動解析資源類型

? ? ? ? add_header X-Content-Type-Options nosniff;

? ? ? ? #防XSS攻擊

? ? ? ? add_header X-Xss-Protection 1;

? ? ? ? #......

}

配置完成

測試新的nginx程序是否正確

/usr/local/nginx/sbin/nginx? ?-t

重啟Nginx!

/usr/local/nginx/sbin/nginx -s reload

總結

OK,我們簡單總結一下在 Nginx 下配置 HTTPS 的關鍵要點:

獲得 SSL 證書

通過第三方可靠證書頒發機構獲取,或者通過 OpenSSL 命令獲得 example.key 和 example.csr 文件

HTTPS優化

減少 CPU 運算量

使用 keepalive 長連接

復用 SSL 會話參數

使用 HSTS 策略強制瀏覽器使用 HTTPS 連接

添加 Strict-Transport-Security 頭部信息

使用 HSTS 預加載列表(HSTS Preload List)

加強 HTTPS 安全性

使用迪菲-赫爾曼密鑰交換(D-H,Diffie–Hellman key exchange)方案

添加 X-Frame-Options 頭部信息,減少點擊劫持

添加 X-Content-Type-Options 頭部信息,禁止服務器自動解析資源類型

添加 X-Xss-Protection 頭部信息,防XSS攻擊

其實簡單的個人博客,如果沒有敏感數據交互的話,使用 http 協議通訊,一般都夠用了,頁面速度還會更快,但正如文章開頭所說,戴上『綠鎖』,更專業更安全~~有興趣的同學可以去深入了解折騰下:)


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,978評論 2 374

推薦閱讀更多精彩內容