亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

nginx配置ssl加密(單/雙向認(rèn)證、部分https)

kviccn / 1113人閱讀

摘要:設(shè)置協(xié)商加密算法時(shí),優(yōu)先使用我們服務(wù)端的加密套件,而不是客戶端瀏覽器的加密套件。

nginx下配置ssl本來(lái)是很簡(jiǎn)單的,無(wú)論是去認(rèn)證中心買(mǎi)SSL安全證書(shū)還是自簽署證書(shū),但最近公司OA的一個(gè)需求,得以有個(gè)機(jī)會(huì)實(shí)際折騰一番。一開(kāi)始采用的是全站加密,所有訪問(wèn)http:80的請(qǐng)求強(qiáng)制轉(zhuǎn)換(rewrite)到https,后來(lái)自動(dòng)化測(cè)試結(jié)果說(shuō)響應(yīng)速度太慢,https比http慢慢30倍,心想怎么可能,鬼知道他們?cè)趺礈y(cè)的。所以就試了一下部分頁(yè)面https(不能只針對(duì)某類(lèi)動(dòng)態(tài)請(qǐng)求才加密)和雙向認(rèn)證。下面分節(jié)介紹。

默認(rèn)nginx是沒(méi)有安裝ssl模塊的,需要編譯安裝nginx時(shí)加入--with-http_ssl_module選項(xiàng)。

關(guān)于SSL/TLS原理請(qǐng)參考 這里,如果你只是想測(cè)試或者自簽發(fā)ssl證書(shū),參考 這里 。

提示:nignx到后端服務(wù)器由于一般是內(nèi)網(wǎng),所以不加密。

1. 全站ssl

全站做ssl是最常見(jiàn)的一個(gè)使用場(chǎng)景,默認(rèn)端口443,而且一般是單向認(rèn)證。

server {
        listen 443;
        server_name example.com;

        root /apps/www;
        index index.html index.htm;

        ssl on;
        ssl_certificate ../SSL/ittest.pem;
        ssl_certificate_key ../SSL/ittest.key;

#        ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
#        ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
#        ssl_prefer_server_ciphers on;

}

如果想把http的請(qǐng)求強(qiáng)制轉(zhuǎn)到https的話:

server {
  listen      80;
  server_name example.me;
  rewrite     ^   https://$server_name$request_uri? permanent;

### 使用return的效率會(huì)更高 
#  return 301 https://$server_name$request_uri;
}

ssl_certificate證書(shū)其實(shí)是個(gè)公鑰,它會(huì)被發(fā)送到連接服務(wù)器的每個(gè)客戶端,ssl_certificate_key私鑰是用來(lái)解密的,所以它的權(quán)限要得到保護(hù)但nginx的主進(jìn)程能夠讀取。當(dāng)然私鑰和證書(shū)可以放在一個(gè)證書(shū)文件中,這種方式也只有公鑰證書(shū)才發(fā)送到client。

ssl_protocols指令用于啟動(dòng)特定的加密協(xié)議,nginx在1.1.13和1.0.12版本后默認(rèn)是ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2,TLSv1.1與TLSv1.2要確保OpenSSL >= 1.0.1 ,SSLv3 現(xiàn)在還有很多地方在用但有不少被攻擊的漏洞。

ssl_ciphers選擇加密套件,不同的瀏覽器所支持的套件(和順序)可能會(huì)不同。這里指定的是OpenSSL庫(kù)能夠識(shí)別的寫(xiě)法,你可以通過(guò) openssl -v cipher "RC4:HIGH:!aNULL:!MD5"(后面是你所指定的套件加密算法) 來(lái)看所支持算法。

ssl_prefer_server_ciphers on設(shè)置協(xié)商加密算法時(shí),優(yōu)先使用我們服務(wù)端的加密套件,而不是客戶端瀏覽器的加密套件。

https優(yōu)化參數(shù)

ssl_session_cache shared:SSL:10m; : 設(shè)置ssl/tls會(huì)話緩存的類(lèi)型和大小。如果設(shè)置了這個(gè)參數(shù)一般是sharedbuildin可能會(huì)參數(shù)內(nèi)存碎片,默認(rèn)是none,和off差不多,停用緩存。如shared:SSL:10m表示我所有的nginx工作進(jìn)程共享ssl會(huì)話緩存,官網(wǎng)介紹說(shuō)1M可以存放約4000個(gè)sessions。 詳細(xì)參考serverfault上的問(wèn)答ssl_session_cache。

ssl_session_timeout : 客戶端可以重用會(huì)話緩存中ssl參數(shù)的過(guò)期時(shí)間,內(nèi)網(wǎng)系統(tǒng)默認(rèn)5分鐘太短了,可以設(shè)成30m即30分鐘甚至4h。

設(shè)置較長(zhǎng)的keepalive_timeout也可以減少請(qǐng)求ssl會(huì)話協(xié)商的開(kāi)銷(xiāo),但同時(shí)得考慮線程的并發(fā)數(shù)了。

提示:在生成證書(shū)請(qǐng)求csr文件時(shí),如果輸入了密碼,nginx每次啟動(dòng)時(shí)都會(huì)提示輸入這個(gè)密碼,可以使用私鑰來(lái)生成解密后的key來(lái)代替,效果是一樣的,達(dá)到免密碼重啟的效果:

openssl rsa -in ittest.key -out ittest_unsecure.key
導(dǎo)入證書(shū)

如果你是找一個(gè)知名的ssl證書(shū)頒發(fā)機(jī)構(gòu)如VeriSign、Wosign、StartSSL簽發(fā)的證書(shū),瀏覽器已經(jīng)內(nèi)置并信任了這些根證書(shū),如果你是自建C或獲得二級(jí)CA授權(quán),都需要將CA證書(shū)添加到瀏覽器,這樣在訪問(wèn)站點(diǎn)時(shí)才不會(huì)顯示不安全連接。各個(gè)瀏覽的添加方法不在本文探討范圍內(nèi)。

2. 部分頁(yè)面ssl

一個(gè)站點(diǎn)并不是所有信息都是非常機(jī)密的,如網(wǎng)上商城,一般的商品瀏覽可以不通過(guò)https,而用戶登錄以及支付的時(shí)候就強(qiáng)制經(jīng)過(guò)https傳輸,這樣用戶訪問(wèn)速度和安全性都得到兼顧。

但是請(qǐng)注意不要理解錯(cuò)了,是對(duì)頁(yè)面加密而不能針對(duì)某個(gè)請(qǐng)求加密,一個(gè)頁(yè)面或地址欄的URL一般會(huì)發(fā)起許多請(qǐng)求的,包括css/png/js等靜態(tài)文件和動(dòng)態(tài)的java或php請(qǐng)求,所以要加密的內(nèi)容包含頁(yè)面內(nèi)的其它資源文件,否則就會(huì)出現(xiàn)http與https內(nèi)容混合的問(wèn)題。在http頁(yè)面混有https內(nèi)容時(shí),頁(yè)面排版不會(huì)發(fā)生亂排現(xiàn)象;在https頁(yè)面中包含以http方式引入的圖片、js等資源時(shí),瀏覽器為了安全起見(jiàn)會(huì)阻止加載。

下面是只對(duì)example.com/account/login登錄頁(yè)面進(jìn)行加密的栗子:

root /apps/www;
index index.html index.htm;

server {
    listen      80;
    server_name example.com;

    location ^~ /account/login {
        rewrite ^ https://$server_name:443$request_uri? permanent;
    }
    location / {
        proxy_pass  http://localhost:8080;

        ### Set headers ####
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_redirect     off; 
    }
}

server {
    listen 443 ssl;
    server_name example.com;

    ssl on;
    ssl_certificate ../SSL/ittest.pem;
    ssl_certificate_key ../SSL/ittest.key;
    ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
    ssl_prefer_server_ciphers on;

    location ^~ /account/login {
        proxy_pass  http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_redirect     off; 

        ### Most PHP, Python, Rails, Java App can use this header -> https ###
        proxy_set_header X-Forwarded-Proto  $scheme;
    }
    location / {
        rewrite  ^  http://$server_name$request_uri? permanent;
    }
}

關(guān)于rewrite與location的寫(xiě)法參考這里。當(dāng)瀏覽器訪問(wèn)http://example.com/account/login.xx時(shí),被301到https://example.com/account/login.xx,在這個(gè)ssl加密的虛擬主機(jī)里也匹配到/account/login,反向代理到后端服務(wù)器,后面的傳輸過(guò)程是沒(méi)有https的。這個(gè)login.xx頁(yè)面下的其它資源也是經(jīng)過(guò)https請(qǐng)求nginx的,登錄成功后跳轉(zhuǎn)到首頁(yè)時(shí)的鏈接使用http,這個(gè)可能需要開(kāi)發(fā)代碼里面控制。

上面配置中使用了proxy_set_header X-Forwarded-Proto $scheme,在jsp頁(yè)面使用request.getScheme()得到的是https 。如果不把請(qǐng)求的$scheme協(xié)議設(shè)置在header里,后端jsp頁(yè)面會(huì)一直認(rèn)為是http,將導(dǎo)致響應(yīng)異常。

ssl配置塊還有個(gè)與不加密的80端口類(lèi)似的location /,它的作用是當(dāng)用戶直接通過(guò)https訪問(wèn)首頁(yè)時(shí),自動(dòng)跳轉(zhuǎn)到不加密端口,你可以去掉它允許用戶這樣做。

3. 實(shí)現(xiàn)雙向ssl認(rèn)證

上面的兩種配置都是去認(rèn)證被訪問(wèn)的站點(diǎn)域名是否真實(shí)可信,并對(duì)傳輸過(guò)程加密,但服務(wù)器端并沒(méi)有認(rèn)證客戶端是否可信。(實(shí)際上除非特別重要的場(chǎng)景,也沒(méi)必要去認(rèn)證訪問(wèn)者,除非像銀行U盾這樣的情況)

要實(shí)現(xiàn)雙向認(rèn)證HTTPS,nginx服務(wù)器上必須導(dǎo)入CA證書(shū)(根證書(shū)/中間級(jí)證書(shū)),因?yàn)楝F(xiàn)在是由服務(wù)器端通過(guò)CA去驗(yàn)證客戶端的信息。還有必須在申請(qǐng)服務(wù)器證書(shū)的同時(shí),用同樣的方法生成客戶證書(shū)。取得客戶證書(shū)后,還要將它轉(zhuǎn)換成瀏覽器識(shí)別的格式(大部分瀏覽器都認(rèn)識(shí)PKCS12格式):

openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12

然后把這個(gè)client.p12發(fā)給你相信的人,讓它導(dǎo)入到瀏覽器中,訪問(wèn)站點(diǎn)建立連接的時(shí)候nginx會(huì)要求客戶端把這個(gè)證書(shū)發(fā)給自己驗(yàn)證,如果沒(méi)有這個(gè)證書(shū)就拒絕訪問(wèn)。

同時(shí)別忘了在 nginx.conf 里配置信任的CA:(如果是二級(jí)CA,請(qǐng)把根CA放在后面,形成CA證書(shū)鏈)

    proxy_ignore_client_abort on;

    ssl on;
    ...
    ssl_verify_client on;
    ssl_verify_depth 2;
    ssl_client_certificate ../SSL/ca-chain.pem;

#在雙向location下加入:
    proxy_set_header X-SSL-Client-Cert $ssl_client_cert;
拓展:使用geo模塊

nginx默認(rèn)安裝了一個(gè)ngx_http_geo_module,這個(gè)geo模塊可以根據(jù)客戶端IP來(lái)創(chuàng)建變量的值,用在如來(lái)自172.29.73.0/24段的IP訪問(wèn)login時(shí)使用雙向認(rèn)證,其它段使用一般的單向認(rèn)證。

geo $duplexing_user {
    default 1;
    include geo.conf;  # 注意在0.6.7版本以后,include是相對(duì)于nginx.conf所在目錄而言的
}

語(yǔ)法 geo [$address] $variable { … },位于http段,默認(rèn)地址是$reoute_addr,假設(shè) conf/geo.conf 內(nèi)容:

127.0.0.1/32    LOCAL;  # 本地
172.29.73.23/32 SEAN;   # 某個(gè)IP
172.29.73.0/24  1;      # IP段,可以按國(guó)家或地域定義后面的不同的值

需要配置另外一個(gè)虛擬主機(jī)server{ssl 445},里面使用上面雙向認(rèn)證的寫(xiě)法,然后在80或443里使用變量$duplexing_user去判斷,如果為1就rewrite到445,否則rewrite到443。具體用法可以參考nginx geo使用方法。

參考

Nginx部署部分https與部分http

Linux+Nginx/Apache/Tomcat新增SSL證書(shū),開(kāi)啟https訪問(wèn)教程

SSL & SPDY 已全面部署

SSL證書(shū)與Https應(yīng)用部署小結(jié)

ngx_http_ssl_module docs

Optimizing HTTPS on Nginx

http://zhangge.net/4861.html

http://blog.chinaunix.net/uid-192074-id-3135733.html


原文鏈接地址:http://seanlook.com/2015/05/28/nginx-ssl/


文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/39177.html

相關(guān)文章

  • 簡(jiǎn)述 HTTPS 證書(shū)認(rèn)證

    摘要:個(gè)人信息交換格式,也稱(chēng)為支持安全存儲(chǔ)證書(shū)私鑰和證書(shū)路徑中的所有證書(shū)。由,標(biāo)準(zhǔn)定義,以作為證書(shū)文件后綴名。加密消息語(yǔ)法標(biāo)準(zhǔn),格式支持證書(shū)的存儲(chǔ)和認(rèn)證路徑中的所有證書(shū)??蛻舳说淖C書(shū)也采用根證書(shū)簽名,服務(wù)器端對(duì)客戶端進(jìn)行證書(shū)認(rèn)證。 前言 在我們不論是對(duì)服務(wù)器還是客戶端進(jìn)行 HTTPS 進(jìn)行配置時(shí),首先需要準(zhǔn)備好的肯定是相關(guān)證書(shū)文件了,而證書(shū)文件是什么又從哪里可以獲取到相關(guān)證書(shū),并且它們又是什...

    why_rookie 評(píng)論0 收藏0
  • Nginx(3)-創(chuàng)建 https 站點(diǎn)

    摘要:常見(jiàn)的對(duì)稱(chēng)加密算法密鑰長(zhǎng)度可選等非對(duì)稱(chēng)加密非對(duì)稱(chēng)加密,密鑰成對(duì)出現(xiàn),一公一私。申請(qǐng)者將自己的公鑰和個(gè)人站點(diǎn)信息發(fā)送給,請(qǐng)求其做認(rèn)證。定義了證書(shū)的結(jié)構(gòu)以及認(rèn)證協(xié)議標(biāo)準(zhǔn),目前使用的是第三版。 對(duì)稱(chēng)加密 對(duì)稱(chēng)加密中加密和解密使用相同的密鑰,加解密速度快,算法公開(kāi),計(jì)算量小。 showImg(https://segmentfault.com/img/bVbp5uW); 使用對(duì)稱(chēng)加密,交易雙方都...

    hss01248 評(píng)論0 收藏0
  • 使用certbot為你的網(wǎng)站免費(fèi)上https

    摘要:在計(jì)算機(jī)網(wǎng)絡(luò)上,經(jīng)由超文本傳輸協(xié)議進(jìn)行通信,但利用來(lái)對(duì)數(shù)據(jù)包進(jìn)行加密。不應(yīng)與在中定義的安全超文本傳輸協(xié)議相混淆。是超文本傳輸協(xié)議,信息是明文傳輸,則是具有安全性的加密傳輸協(xié)議。 關(guān)于作者 程序開(kāi)發(fā)人員,不拘泥于語(yǔ)言與技術(shù),目前主要從事PHP和前端開(kāi)發(fā),使用Laravel和VueJs,App端使用Apicloud/Cordova混合式開(kāi)發(fā)。合適和夠用是永不停息的追求。個(gè)人網(wǎng)站:https...

    MangoGoing 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<