HTTPS
超文本傳輸安全協議(縮寫:HTTPS,英語:Hypertext Transfer Protocol Secure)是超文本傳輸協議和SSL/TLS的組合,用以提供加密通訊及對網絡服務器身份的鑑定。HTTPS連接經常被用於萬維網上的交易支付和企業信息系統中敏感信息的傳輸。HTTPS不應與在RFC 2660中定義的安全超文本傳輸協議(S-HTTP)相混。
HTTPS 目前已經是所有注重隱私和安全的網站的首選,隨着技術的不斷髮展,HTTPS 網站已不再是大型網站的專利,所有普通的個人站長和博客均可以自己動手搭建一個安全的加密的網站。
如果一個網站沒有加密,那麼你的所有帳號密碼都是明文傳輸。可想而知,如果涉及到隱私和金融問題,不加密的傳輸是多麼可怕的一件事。
一、升級 OpenSSL
sudo apt-get update
sudo apt-get dist-upgrade
sudo wget openssl.org/source/openssl-1.0.2h.tar.gz
sudo tar -xvzfopenssl-1.0.2h.tar.gz
cd openssl-1.0.2h
sudo apt-get install make
sudo apt-get install gcc
sudo ./config –prefix=/usr/
sudo make depend
sudo make install
openssl version
二、使用 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 的命令如下
RSA 證書
RSA 證書可以用於 RSA 密鑰交換(RSA 非對稱加密)或 ECDHE 密鑰交換(RSA 非對稱簽名);而 ECC 證書只能用於 ECDHE 密鑰交換(ECDSA 非對稱簽名)。
sudo 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”
ECC 證書
並不是所有瀏覽器都支持 ECDHE 密鑰交換,也就是說 ECC 證書的兼容性要差一些。例如在 Windows XP 中,使用 ECC 證書的網站只有 Firefox 能訪問(Firefox 的 TLS 自己實現,不依賴操作系統);Android 平臺中,也需要 Android 4+ 才支持 ECC 證書。
openssl ecparam -genkey -name secp256r1 | openssl ec -out example.key
openssl req -new -key example.key -out example.csr
PS:如果是泛域名證書,則應該填寫*.example.com
你可以在系統的任何地方運行這個命令,會自動在當前目錄生成example_com.csr和example_com.key這兩個文件
這個 CSR 文件就是你需要提交給 SSL 認證機構的,當你的域名或組織通過驗證後,認證機構就會頒發給你兩個文件:example_com.crt和example_com.ca-bundle
而example_com.key是需要用在 Nginx 配置裏和example_com.crt、example_com.ca-bundle配合使用的,需要好好保管,千萬別泄露給任何第三方。
三、Nginx 配置 HTTPS 網站以及增加安全的配置
前面已經提到,你需要提交 CSR 文件給第三方 SSL 認證機構,通過認證後,他們會頒發給你兩個 CRT 文件,我們把這兩個文件合爲一個文件方便使用,如下:
cat example_com.crt example_com.ca-bundle > example_com.pem
最終我們得到了兩個文件:
example_com.key
example_com.pem
同時,爲了統一位置,你可以把這二個文件都移動到/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.pem;
ssl_certificate_key /etc/ssl/private/example_com.key;
}
同時,如果是全站 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;
}
檢測配置文件沒問題後重新讀取 Nginx 即可
nginx -t && nginx -s reload
至此,已經可以訪問https。
四、增加安全性
以上這麼做並不安全,默認是 SHA-1 形式,而現在主流的方案應該都避免 SHA-1,爲了確保更強的安全性,我們可以採取迪菲-赫爾曼密鑰交換
首先,進入/etc/ssl/certs目錄並生成一個dhparam.pem
cd /etc/ssl/certs
openssl dhparam -out dhparam.pem 4096 # 如果你的機器性能不夠強大,可以用 2048 位加密
生成完畢後,在 Nginx 的 SSL 配置後面加入
ssl on;
#ssl_certificate /etc/ssl/private/example_com.crt;
ssl_certificate /etc/ssl/private/example_com.pem;
ssl_certificate_key /etc/ssl/private/example_com.key;
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;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.4.4 8.8.8.8 valid=300s;
resolver_timeout 10s;
add_header Strict-Transport-Security max-age=63072000;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;