Nginx搭建HTTPS服務(wù)器和強(qiáng)制使用HTTPS訪問(wèn)的方法
HTTPS簡(jiǎn)介
HTTPS(Hyper Text Transfer Protocol Secure),是一種基于SSL/TLS的HTTP,所有的HTTP數(shù)據(jù)都是在SSL/TLS協(xié)議封裝之上進(jìn)行傳輸?shù)?。HTTPS協(xié)議是在HTTP協(xié)議的基礎(chǔ)上,添加了SSL/TLS握手以及數(shù)據(jù)加密傳輸,也屬于應(yīng)用層協(xié)議。Https使用的默認(rèn)端口是443。更多HTTPS原理可以參考阮一峰老師的文章:http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html
SSL證書
證書類型簡(jiǎn)介
要設(shè)置安全服務(wù)器,使用公共鑰創(chuàng)建一對(duì)公私鑰對(duì)。大多數(shù)情況下,發(fā)送證書請(qǐng)求(包括自己的公鑰),你的公司證明材料以及費(fèi)用到一個(gè)證書頒發(fā)機(jī)構(gòu)(CA)。CA驗(yàn)證證書請(qǐng)求及您的身份,然后將證書返回給您的安全服務(wù)器。
但是內(nèi)網(wǎng)實(shí)現(xiàn)一個(gè)服務(wù)器端和客戶端傳輸內(nèi)容的加密,可以自己給自己頒發(fā)證書,只需要忽略掉瀏覽器不信任的警報(bào)即可!
由CA簽署的證書為您的服務(wù)器提供兩個(gè)重要的功能:
- 瀏覽器會(huì)自動(dòng)識(shí)別證書并且在不提示用戶的情況下允許創(chuàng)建一個(gè)安全連接。
- 當(dāng)一個(gè)CA生成一個(gè)簽署過(guò)的證書,它為提供網(wǎng)頁(yè)給瀏覽器的組織提供身份擔(dān)保。
多數(shù)支持ssl的web服務(wù)器都有一個(gè)CA列表,它們的證書會(huì)被自動(dòng)接受。當(dāng)一個(gè)瀏覽器遇到一個(gè)其授權(quán)CA并不在列表中的證書,瀏覽器將詢問(wèn)用戶是否接受或拒絕連接。
制作CA證書
ca.key CA私鑰:
openssl genrsa -des3 -out ca.key 2048

ca.crt CA根證書(公鑰):
openssl req -new -x509 -days 365 -key ca.key -out ca.crt

制作網(wǎng)站的證書并用CA簽名認(rèn)證
這里,假設(shè)網(wǎng)站域名為www.example.com,生成com.example.com證書私鑰:
openssl genrsa -des3 -out www.example.com.pem 1024

制作解密后的www.example.com證書私鑰:
openssl rsa -in www.example.com.pem -out www.example.com.key

生成簽名請(qǐng)求:
openssl req -new -key www.example.com.pem -out www.example.com.csr

可以在Common Name中填入網(wǎng)站域名,即可生產(chǎn)該網(wǎng)站的證書。
用CA進(jìn)行簽名:

解決方法:
mkdir -p demoCA/newcerts touch demoCA/index.txt touch demoCA/serial echo "01" > demoCA/serial
然后,再執(zhí)行簽名命令即可。
基于Nginx搭建HTTPS虛擬主機(jī)
虛擬主機(jī)配置文件
upstream sslfpm {
server 127.0.0.1:9000 weight=10 max_fails=3 fail_timeout=20s;
}
server {
listen 192.168.1.*:443;
server_name 192.168.1.*;
#為一個(gè)server開(kāi)啟ssl支持
ssl on;
#為虛擬主機(jī)指定pem格式的證書文件
ssl_certificate /home/wangzhengyi/ssl/wangzhengyi.crt;
#為虛擬主機(jī)指定私鑰文件
ssl_certificate_key /home/wangzhengyi/ssl/wangzhengyi_nopass.key;
#客戶端能夠重復(fù)使用存儲(chǔ)在緩存中的會(huì)話參數(shù)時(shí)間
ssl_session_timeout 5m;
#指定使用的ssl協(xié)議
ssl_protocols SSLv3 TLSv1;
#指定許可的密碼描述
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
#SSLv3和TLSv1協(xié)議的服務(wù)器密碼需求優(yōu)先級(jí)高于客戶端密碼
ssl_prefer_server_ciphers on;
location / {
root /home/wangzhengyi/ssl/;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
error_page 404 /404.html;
location = /50x.html {
root /usr/share/nginx/www;
}
location = /404.html {
root /usr/share/nginx/www;
}
# proxy the PHP scripts to fpm
location ~ \.php$ {
access_log /var/log/nginx/ssl/ssl.access.log main;
error_log /var/log/nginx/ssl/ssl.error.log;
root /home/wangzhengyi/ssl/;
fastcgi_param HTTPS on;
include /etc/nginx/fastcgi_params;
fastcgi_pass sslfpm;
}
}
HTTPS服務(wù)器優(yōu)化
方法
SSL操作需要消耗CPU資源,所以在多處理器的系統(tǒng),需要啟動(dòng)多個(gè)工作進(jìn)程,而且數(shù)量需要不少于可用CPU的個(gè)數(shù)。最消耗CPU資源的SSL操作是SSL握手,有兩種方法可以將每個(gè)客戶端的握手操作數(shù)量降到最低:
保持客戶端長(zhǎng)連接,在一個(gè)SSL連接發(fā)送多個(gè)請(qǐng)求
在并發(fā)的連接或者后續(xù)的連接中重用SSL會(huì)話參數(shù),這樣可以避免SSL握手操作。
會(huì)話緩存用于保存SSL會(huì)話,這些緩存在工作進(jìn)程間共享,可以使用ssl_session_cache指令進(jìn)行配置。1M緩存可以存放約4000個(gè)會(huì)話。默認(rèn)的緩存超時(shí)時(shí)間是5m,可以使用ssl_session_timeout加大它。
ssl_session_cache指令
語(yǔ)法:ssl_session_cache off|none|builtin:size|shared:name:size
使用環(huán)境:main,server
緩存類型:
off -- 硬關(guān)閉,nginx明確告訴客戶端這個(gè)會(huì)話不可重用
none -- 軟關(guān)閉,nginx告訴客戶端會(huì)話能夠被重用,但是nginx實(shí)際上不會(huì)重用它們
bultin -- openssl內(nèi)置緩存,僅可用于一個(gè)工作進(jìn)程.可能導(dǎo)致內(nèi)存碎片
shared -- 所有工作進(jìn)程的共享緩存。(1)緩存大小用字節(jié)數(shù)指定(2)每個(gè)緩存必須擁有自己的名稱(3)同名的緩存可用于多個(gè)虛擬主機(jī)
優(yōu)化示例
#優(yōu)化ssl服務(wù) ssl_session_cache shared:wzy:10m; #客戶端能夠重復(fù)使用存儲(chǔ)在緩存中的會(huì)話參數(shù)時(shí)間 ssl_session_timeout 10m;
nginx強(qiáng)制使用https訪問(wèn)(http跳轉(zhuǎn)到https)
基于nginx搭建了一個(gè)https訪問(wèn)的虛擬主機(jī),監(jiān)聽(tīng)的域名是test.com,但是很多用戶不清楚https和http的區(qū)別,會(huì)很容易敲成http://test.com,這時(shí)會(huì)報(bào)出404錯(cuò)誤,所以我需要做基于test.com域名的http向https的強(qiáng)制跳轉(zhuǎn)
nginx的rewrite方法
思路
這應(yīng)該是大家最容易想到的方法,將所有的http請(qǐng)求通過(guò)rewrite重寫到https上即可
配置
server {
listen 192.168.1.111:80;
server_name test.com;
rewrite ^(.*)$ https://$host$1 permanent;
}
搭建此虛擬主機(jī)完成后,就可以將http://test.com的請(qǐng)求全部重寫到https://test.com上了
nginx的497狀態(tài)碼
error code 497 497 - normal request was sent to HTTPS
解釋:當(dāng)此虛擬站點(diǎn)只允許https訪問(wèn)時(shí),當(dāng)用http訪問(wèn)時(shí)nginx會(huì)報(bào)出497錯(cuò)誤碼
思路
利用error_page命令將497狀態(tài)碼的鏈接重定向到https://test.com這個(gè)域名上
配置
server {
listen 192.168.1.11:443; #ssl端口
listen 192.168.1.11:80; #用戶習(xí)慣用http訪問(wèn),加上80,后面通過(guò)497狀態(tài)碼讓它自動(dòng)跳到443端口
server_name test.com;
#為一個(gè)server{......}開(kāi)啟ssl支持
ssl on;
#指定PEM格式的證書文件
ssl_certificate /etc/nginx/test.pem;
#指定PEM格式的私鑰文件
ssl_certificate_key /etc/nginx/test.key;
#讓http請(qǐng)求重定向到https請(qǐng)求
error_page 497 https://$host$uri?$args;
}
index.html刷新網(wǎng)頁(yè)
思路
上述兩種方法均會(huì)耗費(fèi)服務(wù)器的資源,我們用curl訪問(wèn)baidu.com試一下,看百度的公司是如何實(shí)現(xiàn)baidu.com向www.baidu.com的跳轉(zhuǎn)

可以看到百度很巧妙的利用meta的刷新作用,將baidu.com跳轉(zhuǎn)到www.baidu.com.因此我們可以基于http://test.com的虛擬主機(jī)路徑下也寫一個(gè)index.html,內(nèi)容就是http向https的跳轉(zhuǎn)
index.html <html> <meta http-equiv="refresh" content="0;url=https://test.com/"> </html>
相關(guān)文章
Python操作數(shù)據(jù)庫(kù)之?dāng)?shù)據(jù)庫(kù)編程接口
這篇文章主要介紹了Python操作數(shù)據(jù)庫(kù)之?dāng)?shù)據(jù)庫(kù)編程接口,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下2022-06-06
Python中列表遍歷使用range和enumerate的區(qū)別講解
這篇文章主要介紹了Python中列表遍歷使用range和enumerate的區(qū)別,在Python編程語(yǔ)言中,遍歷list有range和enumerate方法,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12
Fiddler如何抓取手機(jī)APP數(shù)據(jù)包
Fiddler,這個(gè)是所有軟件開(kāi)發(fā)者必備神器!這款工具不僅可以抓取PC上開(kāi)發(fā)web時(shí)候的數(shù)據(jù)包,而且可以抓取移動(dòng)端,通過(guò)本文給大家介紹Fiddler如何抓取手機(jī)APP數(shù)據(jù)包,感興趣的朋友一起學(xué)習(xí)吧2016-01-01
Python使用Selenium模擬瀏覽器自動(dòng)操作功能
這篇文章主要介紹了Python使用Selenium模擬瀏覽器自動(dòng)操作功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
使用pandas模塊實(shí)現(xiàn)數(shù)據(jù)的標(biāo)準(zhǔn)化操作
這篇文章主要介紹了使用pandas模塊實(shí)現(xiàn)數(shù)據(jù)的標(biāo)準(zhǔn)化操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05
淺談pytorch卷積核大小的設(shè)置對(duì)全連接神經(jīng)元的影響
今天小編就為大家分享一篇淺談pytorch卷積核大小的設(shè)置對(duì)全連接神經(jīng)元的影響,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01
Pygame實(shí)現(xiàn)游戲最小系統(tǒng)功能詳解
這篇文章主要介紹了Pygame實(shí)現(xiàn)游戲最小系統(tǒng),Pygame是一個(gè)專門用來(lái)開(kāi)發(fā)游戲的 Python 模塊,主要為開(kāi)發(fā)、設(shè)計(jì) 2D 電子游戲而生,具有免費(fèi)、開(kāi)源,支持多種操作系統(tǒng),具有良好的跨平臺(tái)性等優(yōu)點(diǎn)2022-11-11

