Nginx 配置 SSL 證書 + 搭建 HTTPS 網站教程

yg3n 9年前發布 | 277K 次閱讀 Nginx Web服務器

一、HTTPS 是什么?

根據維基百科的解釋:

超文本傳輸安全協議(縮寫:HTTPS,英語:Hypertext Transfer Protocol Secure)是超文本傳輸協議和SSL/TLS的組合,用以提供加密通訊及對網絡服務器身份的鑒定。HTTPS連接經常被用于萬維網上的交易支付和企業信息系統中敏感信息的傳輸。HTTPS不應與在RFC 2660中定義的安全超文本傳輸協議(S-HTTP)相混。

HTTPS 目前已經是所有注重隱私和安全的網站的首選,隨著技術的不斷發展,HTTPS 網站已不再是大型網站的專利,所有普通的個人站長和博客均可以自己動手搭建一個安全的加密的網站。

如果一個網站沒有加密,那么你的所有帳號密碼都是明文傳輸。可想而知,如果涉及到隱私和金融問題,不加密的傳輸是多么可怕的一件事。

鑒于本博客的讀者都是接近專業人士,我們不再多費口舌,直接進入正題吧。

二、使用 OpenSSL 生成 SSL Key 和 CSR

由于只有瀏覽器或者系統信賴的 CA 才可以讓所有的訪問者通暢的訪問你的加密網站,而不是出現證書錯誤的提示。所以我們跳過自簽證書的步驟,直接開始簽署第三方可信任的 SSL 證書吧。

OpenSSL 在 Linux、OS X 等常規的系統下默認都安裝了,因為一些安全問題,一般現在的第三方 SSL 證書簽發機構都要求起碼 2048 位的 RSA 加密的私鑰。

同時,普通的 SSL 證書認證分兩種形式,一種是 DV(Domain Validated),還有一種是 OV (Organization Validated),前者只需要驗證域名,后者需要驗證你的組織或公司,在安全性方面,肯定是后者要好。

無論你用 DV 還是 OV 生成私鑰,都需要填寫一些基本信息,這里我們假設如下:

域名,也稱為 Common Name,因為特殊的證書不一定是域名:example.com

組織或公司名字(Organization):Example, Inc.

部門(Department):可以不填寫,這里我們寫Web Security

城市(City):Beijing

省份(State / Province):Beijing

國家(Country):CN

加密強度:2048 位,如果你的機器性能強勁,也可以選擇 4096 位

按照以上信息,使用 OpenSSL 生成 key 和 csr 的命令如下

openssl req -new -newkey rsa:2048 -sha256 -nodes -out example_com.csr -keyout example_com.key -subj "/C=CN/ST=Beijing/L=Beijing/O=Example Inc./OU=Web Security/CN=example.com"  

PS:如果是泛域名證書,則應該填寫*.example.com

你可以在系統的任何地方運行這個命令,會自動在當前目錄生成example_com.csr和example_com.key這兩個文件

接下來你可以查看一下example_com.csr,得到類似這么一長串的文字

-----BEGIN CERTIFICATE REQUEST-----
MIICujCCAaICAQAwdTELMAkGA1UEBhMCQ04xEDAOBgNVBAgTB0JlaWppbmcxEDAO  
BgNVBAcTB0JlaWppbmcxFTATBgNVBAoTDEV4YW1wbGUgSW5jLjEVMBMGA1UECxMM  
V2ViIFNlY3VyaXR5MRQwEgYDVQQDEwtleGFtcGxlLmNvbTCCASIwDQYJKoZIhvcN  
AQEBBQADggEPADCCAQoCggEBAPME+nvVCdGN9VWn+vp7JkMoOdpOurYMPvclIbsI  
iD7mGN982Ocl22O9wCV/4tL6DpTcXfNX+eWd7CNEKT4i+JYGqllqP3/CojhkemiY  
SF3jwncvP6VoST/HsZeMyNB71XwYnxFCGqSyE3QjxmQ9ae38H2LIpCllfd1l7iVp  
AX4i2+HvGTHFzb0XnmMLzq4HyVuEIMoYwiZX8hq+kwEAhKpBdfawkOcIRkbOlFew  
SEjLyHY+nruXutmQx1d7lzZCxut5Sm5At9al0bf5FOaaJylTEwNEpFkP3L29GtoU  
qg1t9Q8WufIfK9vXqQqwg8J1muK7kksnbYcoPnNgPx36kZsCAwEAAaAAMA0GCSqG  
SIb3DQEBBQUAA4IBAQCHgIuhpcgrsNwDuW6731/DeVwq2x3ZRqRBuj9/M8oONQen  
1QIacBifEMr+Ma+C+wIpt3bHvtXEF8cCAJAR9sQ4Svy7M0w25DwrwaWIjxcf/J8U  
audL/029CkAuewFCdBILTRAAeDqxsAsUyiBIGTIT+uqi+EpGG4OlyKK/MF13FxDj  
/oKyrSJDtp1Xr9R7iqGCs/Zl5qWmDaLN7/qxBK6vX2R/HLhOK0aKi1ZQ4cZeP7Mr
8EzjDIAko87Nb/aIsFyKrt6Ze3jOF0/vnnpw7pMvhq+folWdTVXddjd9Dpr2x1nc  
y5hnop4k6kVRXDjQ4OTduQq4P+SzU4hb41GIQEz4  
-----END CERTIFICATE REQUEST-----

這個 CSR 文件就是你需要提交給 SSL 認證機構的,當你的域名或組織通過驗證后,認證機構就會頒發給你一個example_com.crt

而example_com.key是需要用在 Nginx 配置里和example_com.crt配合使用的,需要好好保管,千萬別泄露給任何第三方。

三、Nginx 配置 HTTPS 網站以及增加安全的配置

前面已經提到,你需要提交 CSR 文件給第三方 SSL 認證機構,通過認證后,他們會頒發給你一個 CRT 文件,我們命名為example_com.crt

同時,為了統一,你可以把這三個文件都移動到/etc/ssl/private/目錄。

然后可以修改 Nginx 配置文件

server {  
    listen 80;
    listen [::]:80 ssl ipv6only=on; 
    listen 443 ssl;
    listen [::]:443 ssl ipv6only=on;
    server_name example.com;

    ssl on;
    ssl_certificate /etc/ssl/private/example_com.crt;
    ssl_certificate_key /etc/ssl/private/example_com.key;
}

檢測配置文件沒問題后重新讀取 Nginx 即可

nginx -t && nginx -s reload

但是這么做并不安全,默認是 SHA-1 形式,而現在主流的方案應該都避免 SHA-1,為了確保更強的安全性,我們可以采取迪菲-赫爾曼密鑰交換

首先,進入/etc/ssl/certs目錄并生成一個dhparam.pem

cd /etc/ssl/certs  
openssl dhparam -out dhparam.pem 2048 # 如果你的機器性能足夠強大,可以用 4096 位加密  

生成完畢后,在 Nginx 的 SSL 配置后面加入

        ssl_prefer_server_ciphers on;
        ssl_dhparam /etc/ssl/certs/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";
        keepalive_timeout 70;
        ssl_session_cache shared:SSL:10m;
        ssl_session_timeout 10m; 

同時,如果是全站 HTTPS 并且不考慮 HTTP 的話,可以加入 HSTS 告訴你的瀏覽器本網站全站加密,并且強制用 HTTPS 訪問

        add_header Strict-Transport-Security max-age=63072000;
        add_header X-Frame-Options DENY;
        add_header X-Content-Type-Options nosniff;

同時也可以單獨開一個 Nginx 配置,把 HTTP 的訪問請求都用 301 跳轉到 HTTPS

server {  
        listen 80;
        listen [::]:80 ssl ipv6only=on;
        server_name     example.com;
        return 301 https://example.com$request_uri;
}

四、可靠的第三方 SSL 簽發機構

眾所周知,前段時間某 NIC 機構爆出過針對 Google 域名的證書簽發的丑聞,所以可見選擇一家靠譜的第三方 SSL 簽發機構是多么的重要。

目前一般市面上針對中小站長和企業的 SSL 證書頒發機構有:

StartSSL

Comodo / 子品牌 Positive SSL

GlobalSign / 子品牌 AlphaSSL

GeoTrust / 子品牌 RapidSSL

其中 Postivie SSL、AlphaSSL、RapidSSL 等都是子品牌,一般都是三級四級證書,所以你會需要增加 CA 證書鏈到你的 CRT 文件里。

以 Comodo Positive SSL 為例,需要串聯 CA 證書,假設你的域名是example.com

那么,串聯的命令是

cat example_com.crt COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt AddTrustExternalCARoot.crt > example_com.signed.crt  

來自:https://s.how/nginx-ssl/

在 Nginx 配置里使用 example_com.signed.crt 即可

如果是一般常見的 AplhaSSL 泛域名證書,他們是不會發給你 CA 證書鏈的,那么在你的 CRT 文件后面需要加入 AlphaSSL 的 CA 證書鏈

AlphaSSL Intermediate CA

五、針對企業的 EV SSL

EV SSL,是 Extended Validation 的簡稱,更注重于對企業網站的安全保護以及嚴格的認證。

最明顯的區別就是,通常 EV SSL 顯示都是綠色的條,比如本站的 SSL 證書就是 EV SSL。

如果貴公司想獲取專業的 EV SSL,可以隨時聯系我們 info at cat dot net

六、本文參考文獻

Apache + WordPress + SSL 完全指南

OpenSSL CSR Creation

NGINX - PhoenixWiki

 本文由用戶 yg3n 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!