使用Nginx實現(xiàn)HTTPS雙向驗證的方法
https單向驗證應(yīng)用廣泛想必大家都很熟悉,我已經(jīng)在一篇博文中分享過,這次來看看Nginx如何實現(xiàn)雙向驗證。
單向驗證與雙向驗證的區(qū)別:
單向驗證: 指客戶端驗證服務(wù)器端證書,服務(wù)器并不需要驗證客戶端證書。
雙向驗證:指客戶端驗證服務(wù)器端證書,而服務(wù)器也需要通過CA的公鑰證書來驗證客戶端證書。
詳細(xì)的握手過程:
單向驗證
瀏覽器發(fā)送一個連接請求給安全服務(wù)器。
1、服務(wù)器將自己的證書,以及同證書相關(guān)的信息發(fā)送給客戶瀏覽器。
2、客戶瀏覽器檢查服務(wù)器送過來的證書是否是由自己信賴的CA中心所簽發(fā)的。如果是,就繼續(xù)執(zhí)行協(xié)議;如果不是,客戶瀏覽器就給客戶一個警告消息:警告客戶這個證書不是可以信賴的詢問客戶是否需要繼續(xù)。
3、接著客戶瀏覽器比較證書里的消息,例如域名和公鑰,與服務(wù)器剛剛發(fā)送的相關(guān)消息是否一致,如果是一致的,客戶瀏覽器認(rèn)可這個服務(wù)器的合法身份。
4、瀏覽器隨機產(chǎn)生一個用于后面通訊的“通話密鑰”,然后用服務(wù)器的公鑰對其加密,然后將加密后的“預(yù)主密碼”傳給服務(wù)器。
5、服務(wù)器從客戶發(fā)送過來的密碼方案中,選擇一種加密程度最高的密碼方案,用服務(wù)器的私鑰加密后通知瀏覽器。
6、瀏覽器針對這個密碼方案,接著用服務(wù)器的公鑰加過密后發(fā)送給服務(wù)器。
7、服務(wù)器接收到瀏覽器送過來的消息,用自己的私鑰解密,獲得。
8、服務(wù)器、瀏覽器接下來的通訊都是用對稱密碼方案,使用相同的對稱密鑰。
雙向驗證
1、瀏覽器發(fā)送一個連接請求給安全服務(wù)器。
2、服務(wù)器將自己的證書,以及同證書相關(guān)的信息發(fā)送給客戶瀏覽器。
3、客戶瀏覽器檢查服務(wù)器送過來的證書是否是由自己信賴的CA中心所簽發(fā)的。如果是,就繼續(xù)執(zhí)行協(xié)議;如果不是,客戶瀏覽器就給客戶一個警告消息:警告客戶這個證書不是可以信賴的詢問客戶是否需要繼續(xù)。
4、接著客戶瀏覽器比較證書里的消息,例如域名和公鑰,與服務(wù)器剛剛發(fā)送的相關(guān)消息是否一致,如果是一致的,客戶瀏覽器認(rèn)可這個服務(wù)器的合法身份。
5、服務(wù)器要求客戶的身份認(rèn)證,用戶可以建立一個隨機數(shù)然后對其進(jìn)行數(shù)字簽名,將這個含有簽名的隨機數(shù)和客戶自己的證書以及加密過的“預(yù)主密碼”一起傳給服務(wù)器。
6、服務(wù)器必須檢驗客戶證書和簽名隨機數(shù)的合法性,具體的合法性驗證過程包括:客戶的證書使用日期是否有效,為客戶提供證書的CA 是否可靠,發(fā)行CA 的公鑰能否正確解開客戶證書的發(fā)行CA的數(shù)字簽名,檢查客戶的證書是否在證書廢止列表(CRL)中。檢驗如果沒有通過,通訊立刻中斷;如果驗證通過,服務(wù)器將用自己的私鑰解開加密的“預(yù)主密碼”,然后執(zhí)行一系列步驟來產(chǎn)生主通訊密碼(客戶端也將通過同樣的方法產(chǎn)生相同的主通訊密碼)。
7、客戶瀏覽器告訴服務(wù)器自己所能夠支持的通訊對稱密碼方案。
8、服務(wù)器從客戶發(fā)送過來的密碼方案中,選擇一種加密程度最高的密碼方案,用客戶的公鑰加過密后通知瀏覽器。
9、瀏覽器針對這個密碼方案,選擇一個通話密鑰,接著用服務(wù)器的公鑰加過密后發(fā)送給服務(wù)器。
10、服務(wù)器接收到瀏覽器送過來的消息,用自己的私鑰解密,獲得通話密鑰。
11、服務(wù)器、瀏覽器接下來的通訊都是用對稱密碼方案,使用相同的對稱密鑰。
一、自建CA,簽署證書
#openssl配置文件路徑 vim/etc/pki/tls/openssl.cnf #下面只列出配置文件中和自建CA有關(guān)的幾個關(guān)鍵指令 dir=/etc/pki/CA#CA的工作目錄 database=$dir/index.txt#簽署證書的數(shù)據(jù)記錄文件 new_certs_dir=$dir/newcerts#存放新簽署證書的目錄 serial=$dir/serial#新證書簽署號記錄文件 certificate=$dir/ca.crt#CA的證書路徑 private_key=$dir/private/cakey.pem#CA的私鑰路徑
使用openssl制作CA的自簽名證書
#切換到CA的工作目錄 cd/etc/pki/CA #制作CA私鑰 (umask077;opensslgenrsa-outprivate/cakey.pem2048) #制作自簽名證書 opensslreq-new-x509-keyprivate/cakey.pem-outca.crt #生成數(shù)據(jù)記錄文件,生成簽署號記錄文件,給文件一個初始號。 touchindex.txt touchserial echo'01'>serial #自建CA完成
準(zhǔn)備服務(wù)器端證書
#制作服務(wù)器端私鑰 (umask077;opensslgenrsa-outserver.key1024) #制作服務(wù)器端證書申請指定使用sha512算法簽名(默認(rèn)使用sha1算法) opensslreq-new-keyserver.key-sha512-outserver.csr #簽署證書 opensslca-inserver.csr-outserver.crt-days3650
準(zhǔn)備客戶端證書
#制作客戶端私鑰 (umask077;opensslgenrsa-outkehuduan.key1024) #制作客戶端證書申請 opensslreq-new-keykehuduan.key-outkehuduan.csr #簽署證書 opensslca-inkehuduan.csr-outkehuduan.crt-days3650
注意事項:
1、制作證書時會提示輸入密碼,設(shè)置密碼可選,服務(wù)器證書和客戶端證書密碼可以不相同。
2、服務(wù)器證書和客戶端證書制作時提示輸入省份、城市、域名信息等,需保持一致。
3、以下信息根證書需要和客戶端證書匹配,否則可能出現(xiàn)簽署問題。
countryName = match stateOrProvinceName = match organizationName = match organizationalUnitName = match
如何指定簽署證書的簽名算法
<strong>opensslreqxx -[digest]Digesttosignwith(seeopenssldgst-hforlist)</strong>
查看使用的簽名算法:
<strong>#使用-sha256指定算法 opensslreq-new-keyserver.key-sha256-outserver.csr</strong>
二、提供Nginx配置文件
<strong>server{ listen443; server_namepro.server.com; ssion; ssi_silent_errorson; ssi_typestext/shtml; sslon; ssl_certificate/data/server/nginx/ssl/self/server.crt; ssl_certificate_key/data/server/nginx/ssl/self/server.key; ssl_client_certificate/data/server/nginx/ssl/self/ca/ca.crt; ssl_verify_clienton; ssl_protocolsTLSv1TLSv1.1TLSv1.2; ssl_ciphersECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-RC4-SHA:!ECDHE-RSA-RC4-SHA:ECDH-ECDSA-RC4-SHA:ECDH-RSA-RC4-SHA:ECDHE-RSA-AES256-SHA:!RC4-SHA:HIGH:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!CBC:!EDH:!kEDH:!PSK:!SRP:!kECDH; ssl_prefer_server_ciphersOn; indexindex.htmlindex.htmindex.php; root/data/www; location~.*\.(php|php5)?$ { #fastcgi_passunix:/tmp/php-cgi.sock; fastcgi_pass127.0.0.1:9000; fastcgi_indexindex.php; includefastcgi.conf; } location~.*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires30d; } location~.*\.(js|css)?$ { expires1h; } ###thisistouseopenwebsitelianjielikeonapache## location/{ if(!-e$request_filename){ rewrite^(.*)$/index.php?s=$1last; break; } keepalive_timeout0; } location~/.svn/{ denyall; } ###end## include/data/server/nginx/conf/rewrite/test.conf; access_log/log/nginx/access/access.log; }</strong>
客戶端證書格式轉(zhuǎn)換
<strong>#將文本格式的證書轉(zhuǎn)換成可以導(dǎo)入瀏覽器的證書 opensslpkcs12-export-clcerts-inclient.crt-inkeyclient.key-outclient.p12</strong>
三、將證書導(dǎo)入瀏覽器,這里以Chrome為例
1、在瀏覽器窗口右上角找到設(shè)置
2、在設(shè)置窗口中找到高級設(shè)置
3、找到管理證書
4、點擊導(dǎo)入證書,然后選擇證書路徑就可以了
5、在導(dǎo)入證書之后就可以正常訪問到服務(wù)器數(shù)據(jù)了
6、如果沒有成功導(dǎo)入客戶端證書就訪問服務(wù)器的話,那么服務(wù)器驗證客戶端證書這步就會失敗,然后返回如下錯誤
由于用的是自簽證書不被公有CA信任,所以https那里會有紅叉。
以上所述是小編給大家介紹的使用Nginx實現(xiàn)HTTPS雙向驗證的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
- Nginx實現(xiàn)根據(jù)域名http、https分發(fā)配置示例
- Nginx出現(xiàn)The plain HTTP request was sent to HTTPS port問題解決方法
- Nginx搭建HTTPS服務(wù)器和強制使用HTTPS訪問的方法
- 詳解Nginx服務(wù)器中配置全站HTTPS安全連接的方法
- Linux下nginx配置https協(xié)議訪問的方法
- 微信小程序Server端環(huán)境配置詳解(SSL, Nginx HTTPS,TLS 1.2 升級)
- CentOS7 配置Nginx支持HTTPS訪問的實現(xiàn)方案
- Nginx+Tomcat+Https 服務(wù)器負(fù)載均衡配置實踐方案詳解
- 詳解阿里云LINUX服務(wù)器配置HTTPS(NGINX)
- Nginx搭建https服務(wù)器教程
相關(guān)文章
Nginx通過用戶IP獲取所在國家及地理位置的實現(xiàn)方法
Nginx是一款高性能、輕量級的Web服務(wù)器和反向代理服務(wù)器,今天講解Nginx十分常用的功能之一,通過IP獲取用戶所在的國家,一般廣泛應(yīng)用在各類需要定位的網(wǎng)站上面,來定位用戶首次訪問的國家,通過IP解析庫GeoLite2-Country來實現(xiàn)功能,需要的朋友可以參考下2023-10-10nginx實現(xiàn)一個域名配置多個laravel項目的方法示例
這篇文章主要介紹了nginx實現(xiàn)一個域名配置多個laravel項目的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-01-01nginx提示:500 Internal Server Error錯誤解決辦法
這篇文章主要介紹了 nginx提示:500 Internal Server Error錯誤解決辦法的相關(guān)資料,這里提供了解決該問題的詳細(xì)步驟,希望能幫助到大家,需要的朋友可以參考下2017-08-08