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

1、HTTPS 是什麼?

根據維基百科的解釋:html

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

HTTPS 目前已是全部注重隱私和安全的網站的首選,隨着技術的不斷髮展,HTTPS 網站已再也不是大型網站的專利,全部普通的我的站長和博客都可以本身動手搭建一個安全的加密的網站。nginx

若是一個網站沒有加密,那麼你的全部賬號密碼都是明文傳輸。可想而知,若是涉及到隱私和金融問題,不加密的傳輸是多麼可怕的一件事。api

鑑於本博客的讀者都是接近專業人士,咱們再也不多費口舌,直接進入正題吧。瀏覽器

2、使用 OpenSSL 生成 SSL Key 和 CSR

因爲只有瀏覽器或者系統信賴的 CA 纔可讓全部的訪問者通暢的訪問你的加密網站,而不是出現證書錯誤的提示。因此咱們跳過自簽證書的步驟,直接開始簽署第三方可信任的 SSL 證書吧。安全

OpenSSL 在 Linux、OS X 等常規的系統下默認都安裝了,由於一些安全問題,通常如今的第三方 SSL 證書籤發機構都要求起碼 2048 位的 RSA 加密的私鑰。服務器

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

不管你用 DV 仍是 OV 生成私鑰,都須要填寫一些基本信息,這裏咱們假設以下:session

域名,也稱爲 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配合使用的,須要好好保管,千萬別泄露給任何第三方。

3、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;
}

 

4、可靠的第三方 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

相關文章
相關標籤/搜索