久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

httpd設(shè)置HTTPS雙向認(rèn)證

 abin30 2018-01-04
     去年用tomcat、jboss配置過HTTPS雙向認(rèn)證,,那時(shí)候主要用的是JDK自帶的keytool工具,。這次是用httpd + openssl,區(qū)別比較大

在網(wǎng)上搜索了很多文章,,發(fā)現(xiàn)全面介紹的不多,,或者就是版本比較舊了。所以把我配置的過程完整地記錄下來,,以供參考

首先要說明一下,,HTTPS涉及到的內(nèi)容非常繁雜,包括各種術(shù)語,、命令,、算法,我現(xiàn)在也沒有完全搞清楚,。本文會盡量把我知道的解釋一下,,但是深入的內(nèi)容,暫時(shí)不打算深究了

一,、環(huán)境

httpd: 2.4.4
openssl:1.0.1
os:ubuntu 12.04 LTS

二,、場景

我準(zhǔn)備在httpd上配置一個HTTPS雙向認(rèn)證,既向客戶端表明自己的身份,,也只允許特定的客戶端訪問,。本文說的主要是作為server的角色的配置,至于作為client的配置,,最后也會稍微介紹一下,,但是不會詳細(xì)說明

一般來說,互聯(lián)網(wǎng)站不會去配置雙向認(rèn)證,,因?yàn)榭蛻舳俗C書的分發(fā)和管理會比較麻煩,,會把用戶擋在門外,所以一般是不能這么做的,。當(dāng)然,,像銀行等對安全要求很高的網(wǎng)站,也會采用雙向認(rèn)證,,比如U盾,、安全控件什么的,其實(shí)就是固化的客戶端證書

但是對于企業(yè)應(yīng)用來說,,客戶一般是固定的,,比如兩個已知的系統(tǒng)對接、內(nèi)部系統(tǒng)集成等。所以在企業(yè)應(yīng)用領(lǐng)域,,雙向認(rèn)證還是比較常見的

三,、背景知識

證書(Certificate)是HTTPS的核心,但是其實(shí)證書并不是一個單一的東西,,而是幾種技術(shù)的綜合

為了網(wǎng)絡(luò)傳輸?shù)陌踩?,有很多種技術(shù),最主要的是以下3種:

1,、加密/解密

避免消息明文傳輸,,對消息進(jìn)行加密。早期一般是用對稱加密算法,,現(xiàn)在一般都是不對稱加密,,最常見的算法就是RSA。在后面的介紹中,,也會多次看到RSA這個詞

2,、消息摘要

這個技術(shù)主要是為了避免消息被篡改。消息摘要是把一段信息,,通過某種算法,得出一串字符串,。這個字符串就是消息的摘要,。如果消息被篡改(發(fā)生了變化),那么摘要也一定會發(fā)生變化(一般是這樣的,。如果2個不同的消息生成的摘要是一樣的,,那么這就叫發(fā)生了碰撞)

消息摘要的算法主要有MD5和SHA,在證書領(lǐng)域,,一般都是用SHA(安全哈希算法)

3,、數(shù)字簽名

數(shù)字簽名是為了驗(yàn)證雙方的身份,避免身份偽造

以上三個技術(shù)結(jié)合起來,,就是在HTTPS中廣泛應(yīng)用的證書(certificate),,證書本身攜帶了加密/解密的信息,并且可以標(biāo)識自己的身份,,也自帶消息摘要

四,、在httpd中配置單向HTTPS

首先在%HTTPD_HOME%/conf/目錄下,修改httpd.conf文件,,加載必要的模塊
Httpd代碼  收藏代碼
  1. LoadModule socache_shmcb_module modules/mod_socache_shmcb.so  
  2. LoadModule socache_dbm_module modules/mod_socache_dbm.so  
  3. LoadModule socache_memcache_module modules/mod_socache_memcache.so  
  4. LoadModule ssl_module modules/mod_ssl.so  

這里的前提是,,在編譯httpd的時(shí)候,已經(jīng)編譯了ssl模塊,。這個步驟看另一篇文檔:
http://kyfxbl./blog/1902299

然后再導(dǎo)入默認(rèn)的SSL配置文件,,當(dāng)然也可以選擇不導(dǎo)入,在httpd.conf直接配置。但是導(dǎo)入默認(rèn)的可以節(jié)省很多時(shí)間,,并且默認(rèn)的文件是用vhost配置的,,不會跟main server沖突,可以算是一種最佳實(shí)踐
Httpd代碼  收藏代碼
  1. # Secure (SSL/TLS) connections  
  2. Include conf/extra/httpd-ssl.conf  
  3.   
  4. <IfModule ssl_module>  
  5. SSLRandomSeed startup builtin  
  6. SSLRandomSeed connect builtin  
  7. </IfModule>  

然后打開%HTTPD_HOME%/conf/extra/目錄,,看一下httpd-ssl.conf,,主要有以下幾個配置
Httpd代碼  收藏代碼
  1. SSLEngine on  
  2. SSLCertificateFile "/usr/local/httpd/conf/server.cer"  
  3. SSLCertificateKeyFile "/usr/local/httpd/conf/server.key.pem"  
  4. #SSLCACertificateFile "/usr/local/httpd/conf/ca.cer"  
  5. #SSLVerifyClient require  
  6. #SSLVerifyDepth  10  

只要開啟前3個,單向的HTTPS認(rèn)證就配置好了,。后面3個目前先注釋掉,,是后面雙向認(rèn)證才用到

然后重啟一下httpd,會發(fā)現(xiàn)報(bào)錯:

AH00526: Syntax error on line 106 of /usr/local/httpd/conf/extra/httpd-ssl.conf:
SSLCertificateFile: file '/usr/local/httpd/conf/server.cer' does not exist or is empty

這是因?yàn)閔ttpd需要一個服務(wù)端的私鑰(.key.pem),,和一個服務(wù)端證書(.cer),。前面已經(jīng)配置了這2個文件的路徑,但是還沒有創(chuàng)建,。下一步就要創(chuàng)建這些文件

五,、創(chuàng)建CA(Certificate Authority)

這個CA,也叫“根證書”

服務(wù)端做了一個證書,,但是這是沒有法律效力的,,誰都可以自己做證書,就根本達(dá)不到安全的目的,。所以就要有一個機(jī)構(gòu),,負(fù)責(zé)來確認(rèn)服務(wù)端的身份,然后統(tǒng)一的簽發(fā)證書,。這樣才能有權(quán)威性

當(dāng)瀏覽器通過HTTPS協(xié)議訪問一個網(wǎng)站,,網(wǎng)站首先會發(fā)過來一個自己的證書(certificate)。接下來瀏覽器就會到權(quán)威機(jī)構(gòu)(CA),,去驗(yàn)證一下這個證書是不是它簽發(fā)的,。如果是的話,就信任這個網(wǎng)站的證書,,繼續(xù)訪問;如果不是的話,,要怎么處理就依賴于實(shí)現(xiàn)了。一般的瀏覽器會彈出一個警告,,讓用戶自己決定要不要繼續(xù)訪問,。當(dāng)然直接拒絕也是可以的

現(xiàn)在國際上有3大CA機(jī)構(gòu),如果是要自己做一個網(wǎng)站的話,,如上所述,,一般是需要請這些權(quán)威機(jī)構(gòu)幫忙簽發(fā)證書的。現(xiàn)在所有的主流瀏覽器,,默認(rèn)都安裝了這些CA的根證書,,所以如果網(wǎng)站的證書是這些權(quán)威機(jī)構(gòu)簽發(fā)的,瀏覽器就不會發(fā)出警告了。比如支付寶,,它的證書是由VeriSign簽發(fā)的,,所以訪問支付寶,瀏覽器不會發(fā)出警告



這里還有一個鏈條的關(guān)系,,比如我有10個子網(wǎng)站,,如果每個都要去找CA簽發(fā)證書,就很麻煩,。我可以找CA給我簽發(fā)一個次級根證書,,然后再用這個次級根證書給自己簽發(fā)10個證書。那么只要客戶的瀏覽器里有CA根證書就可以了,,這10個證書都可以通過認(rèn)證,,不要求客戶安裝次級根證書,原文見下:

引用
Intermediate CA certificates lie between the root CA certificate (which is installed in the browsers) and the server certificate (which you installed on the server).


如果是企業(yè)應(yīng)用,,那完全可以自己給自己當(dāng)CA,,因?yàn)榭梢砸竽繕?biāo)用戶(系統(tǒng))安裝自己的CA根證書,效果是一樣的,,還可以省下請權(quán)威CA簽發(fā)證書的費(fèi)用(互聯(lián)網(wǎng)應(yīng)用分發(fā)自己的CA到無數(shù)的互聯(lián)網(wǎng)用戶上,,難度很大)

下面就介紹如何創(chuàng)建自己的CA

1、準(zhǔn)備工作

先在隨便一個目錄,,創(chuàng)建以下幾個子目錄:
/private
/certificates

其中private放的是私鑰和CSR(后面會介紹),,certificates里放的就是證書了

2、創(chuàng)建CA私鑰
Openssl代碼  收藏代碼
  1. openssl genrsa -aes256 -out private/ca.key.pem 2048  

最后的參數(shù)是RSA密鑰的長度,,默認(rèn)是512。2048其實(shí)長了一點(diǎn),,老的瀏覽器稍后會不支持,,不過現(xiàn)在的主流瀏覽器都是支持的,所以問題不大

通過這個命令,,私鑰就創(chuàng)建好了,,文件名是ca.key.pem

用這個命令,可以看一下剛才創(chuàng)建的這個私鑰的信息
Openssl代碼  收藏代碼
  1. openssl rsa -noout -text -in private/ca.key.pem  

不過基本上,,看也是白看,,反正我是看不懂。只知道私鑰里其實(shí)有2組數(shù)字,,是用來形成公鑰的,,最后也會包含在證書里

引用

A private key contains a series of numbers. Two of these numbers form the "public key", the others are part of the "private key". The "public key" bits are included when you generate a CSR, and subsequently form part of the associated Certificate.


另外,最后的.pem擴(kuò)展名,,是表示該私鑰用PEM編碼,。實(shí)際上私鑰和證書都是用PEM編碼的,PEM只是一種編碼格式,不需要太在意,。httpd可以直接處理這種編碼格式,,但是瀏覽器和JAVA都不行,所以在需要的時(shí)候,,會把編碼從PEM改成PKCS,,后面會介紹。只要知道證書和私鑰都有編碼,,只是編碼是PEM還是PKCS的區(qū)別而已,。就像"你好"可以用UTF-8編碼,也可以用GBK編碼一樣,,內(nèi)容是不變的

3,、創(chuàng)建CA簽名請求
Openssl代碼  收藏代碼
  1. openssl req -new -key private/ca.key.pem -out private/ca.csr -subj "/C=CN/ST=SZ/L=SZ/O=kyfxbl/OU=kyfxbl/CN=*."  

這里要注意的是,如果不用-subj參數(shù),,那么就會在命令行交互輸入簽發(fā)目標(biāo)的身份識別信息,,這叫DN(Distinguished Name)。其中別的都不要緊,,最重要的是CN那一行,,因?yàn)槲疫@里是根證書,所以我設(shè)置為*.,,這樣我后面用這個CA簽發(fā)的www.,、game.、news.……,,全都是有效的

生成的簽名請求文件,,是ca.csr
Openssl代碼  收藏代碼
  1. openssl req -noout -text -in private/ca.csr  

同上,看不懂

4,、自己簽發(fā)CA根證書
Openssl代碼  收藏代碼
  1. openssl x509 -req -days 3650 -sha1 -extensions v3_ca -signkey private/ca.key.pem -in private/ca.csr -out certificates/ca.cer  

這里參數(shù)很復(fù)雜,,我也不太清楚準(zhǔn)確的意思是什么,可以用openssl x509 -help自己研究一下

生成的ca.cer,,就是最終的根證書了,!這個文件非常重要,因?yàn)楹罄m(xù)的服務(wù)端證書,、客戶端證書,,都是用這個CA簽發(fā)的,也要把它分發(fā)給客戶,,讓他們導(dǎo)入到自己的瀏覽器或者系統(tǒng)中

查看的命令是:
Openssl代碼  收藏代碼
  1. openssl x509 -noout -text -in certificates/ca.cer  


5,、把根證書從PEM編碼轉(zhuǎn)為PKCS編碼

這步其實(shí)不是必選的,但是前面說過,,JAVA環(huán)境是不能直接用PEM編碼的證書的,,很多瀏覽器也不行,,所以有時(shí)候也需要轉(zhuǎn)一下編碼
Openssl代碼  收藏代碼
  1. openssl pkcs12 -export -cacerts -inkey private/ca.key.pem -in certificates/ca.cer -out certificates/ca.p12  

得到的ca.p12就是轉(zhuǎn)碼后的CA根證書,在不能直接用ca.cer的時(shí)候,,就用ca.p12代替

六,、簽發(fā)服務(wù)端證書

現(xiàn)在CA根證書和私鑰都有了,就可以開始簽發(fā)服務(wù)端證書了(簽發(fā)請求ca.csr是過程文件,,有了cer就不再需要它了,,要刪掉也可以)。下面的命令和簽發(fā)CA證書時(shí)都差不多,,但是參數(shù)上有區(qū)別

1,、創(chuàng)建服務(wù)端私鑰
Openssl代碼  收藏代碼
  1. openssl genrsa -aes256 -out private/server.key.pem 2048  

2、創(chuàng)建服務(wù)端證書簽發(fā)請求
Openssl代碼  收藏代碼
  1. openssl req -new -key private/server.key.pem -out private/server.csr -subj "/C=CN/ST=SZ/L=SZ/O=kyfxbl/OU=kyfxbl/CN=www."  

和ca.csr的區(qū)別在于,,這里的CN不是*.,,而是www.,因?yàn)槲椰F(xiàn)在是在為www.申請證書

3,、利用CA根證書,,簽發(fā)服務(wù)端證書
Openssl代碼  收藏代碼
  1. openssl x509 -req -days 3650 -sha1 -extensions v3_req -CA certificates/ca.cer -CAkey private/ca.key.pem -CAserial ca.srl -CAcreateserial -in private/server.csr -out certificates/server.cer  

這里和前面自己簽發(fā)CA證書時(shí),參數(shù)區(qū)別就比較大了,,最后得到的server.cer,,就是服務(wù)端證書

七、測試單向認(rèn)證

把server.key.pem和server.cer拷貝到%HTTPD_HOME%/conf/目錄下,,然后重新啟動httpd,,會要求輸入一個密碼



然后訪問http://localhost:443/,會報(bào)400錯誤:



接下來用https://localhost:443來訪問,,瀏覽器報(bào)警:



這里就是前面創(chuàng)建CSR時(shí),,輸入的CN的作用,這個證書是為www.申請的,,這里請求的地址卻是localhost,,不匹配所以報(bào)錯。為了能用www.這個主機(jī)名來訪問,,就需要改一下/etc/hosts文件:

127.0.0.1       localhost
192.168.1.102   www.

然后就可以用www.來訪問了,,再試一下:https://www./

這次瀏覽器還是告警,,但是告警信息變了:



證書信息如下:



可以看到這個證書是由*.這個CA頒發(fā)的,,瀏覽器不認(rèn)識,所以不信任由這個CA簽發(fā)的所有證書,。接下來就需要把ca.cer導(dǎo)入瀏覽器,。這里直接導(dǎo)入server.cer也是可以的,但是后面如果又創(chuàng)建一個網(wǎng)站比如說www2.,,那么又不行了,。所以最好的辦法是直接導(dǎo)入CA根證書,,那么后續(xù)只要是用這個根證書簽發(fā)的證書,瀏覽器都會信任

導(dǎo)入前:



導(dǎo)入后:



再次訪問,,可以看到成功了,,瀏覽器不告警,并且URL欄前面打了一個綠勾



八,、配置雙向認(rèn)證

如果要配置服務(wù)器只允許合法的用戶訪問,,就需要配置雙向認(rèn)證

配置為雙向認(rèn)證之后,除了服務(wù)端要發(fā)證書給客戶端之外,,客戶端也要發(fā)客戶端證書到服務(wù)端,,服務(wù)端認(rèn)證通過,才允許訪問

Httpd代碼  收藏代碼
  1. SSLCACertificateFile "/usr/local/httpd/conf/ca.cer"  
  2. SSLVerifyClient require  
  3. SSLVerifyDepth  10  

在單項(xiàng)認(rèn)證的基礎(chǔ)上,,再配置以上3個參數(shù)

SSLCACertificateFile,,這個意思是當(dāng)客戶端發(fā)來客戶端證書的時(shí)候,httpd用哪個CA根證書校驗(yàn)它

配置好了,,還不能重啟,,因?yàn)楝F(xiàn)在客戶端證書還沒做好

這里要說明一下,客戶端證書是怎么來的

有2種方式:

第一種,,客戶端也自己CA,,然后簽發(fā)證書給自己。把客戶端的CA根證書發(fā)過來,,配置成SSLCACertificateFile,。這在互聯(lián)網(wǎng)應(yīng)用里基本是不可能的,安全和管理都是問題,。但是在企業(yè)應(yīng)用里,,還是比較常見的,雙方互相交換CA根證書

第二種,,就用剛才服務(wù)端的CA根證書,,簽發(fā)一個客戶端證書,發(fā)給用戶,,用戶每次用這個證書來發(fā)請求,,像銀行,支付寶等等,,用的是這種方式

當(dāng)然理論上其實(shí)還有一種辦法,,就是客戶自己去找權(quán)威CA簽證書,但是這個是不可能的,,因?yàn)楹苈闊?,找CA簽也非常貴

本文用的是第2種方法。其實(shí)都是一樣的,。關(guān)鍵還是在CA根證書上,,所以前面也說過了,,CA根證書非常重要

九、簽發(fā)客戶端證書

1,、創(chuàng)建客戶端私鑰
Openssl代碼  收藏代碼
  1. openssl genrsa -aes256 -out private/client.key.pem 2048  

2,、創(chuàng)建客戶端證書簽發(fā)請求
Openssl代碼  收藏代碼
  1. openssl req -new -key private/client.key.pem -out private/client.csr -subj "/C=CN/ST=SZ/L=SZ/O=kyfxbl/OU=kyfxbl/CN=kyfxbl"  

這里的不同在于,這里的CN不是*.,,也不是www.,,隨便填一個kyfxbl就好了,或者干脆叫user都沒問題,,反正是一個客戶端證書

3,、利用CA根證書,簽發(fā)客戶端證書
Openssl代碼  收藏代碼
  1. openssl x509 -req -days 3650 -sha1 -extensions v3_req -CA certificates/ca.cer -CAkey private/ca.key.pem -CAserial ca.srl -CAcreateserial -in private/client.csr -out certificates/client.cer  

這里和簽發(fā)server.cer基本是一樣的

4,、把客戶端證書轉(zhuǎn)換成p12格式
Openssl代碼  收藏代碼
  1. openssl pkcs12 -export -clcerts -inkey private/client.key.pem -in certificates/client.cer -out certificates/client.p12  

這步是必須的,,因?yàn)樯院缶托枰芽蛻舳俗C書導(dǎo)入到瀏覽器里,但是一般瀏覽器都不能直接使用PEM編碼的證書

十,、測試雙向認(rèn)證

把ca.cer拷貝到%HTTPD_HOME%/conf/目錄下,,重啟httpd

然后再次訪問https://www./,結(jié)果這次不是警告,,而是直接報(bào)錯:



接下來要把client.p12導(dǎo)入到瀏覽器里

導(dǎo)入前:



導(dǎo)入的時(shí)候會要求輸入密碼,,這是為了避免有人偷偷拷貝了別人的客戶端證書,偽裝成合法用戶:



導(dǎo)入后:



然后再次訪問,,瀏覽器會要求選擇證書,。這個步驟是通過雙向認(rèn)證訪問網(wǎng)站時(shí)必須的,但是平時(shí)訪問銀行,、支付寶的時(shí)候貌似沒有,,這是因?yàn)檫@些網(wǎng)站為了簡化用戶的操作,都會要求用戶安裝什么“安全控件”,,控件自動選擇了證書

   

點(diǎn)擊確定,,訪問成功!

十一,、JKS等

到這里,,用httpd配置雙向HTTPS認(rèn)證就完成了

本文說的是作為server的角色,要如何配置,。但是在JAVA環(huán)境下,,如果要以client的角色,通過雙向認(rèn)證發(fā)起請求,,則還有些不同

這里實(shí)際上是要充當(dāng)一個類似瀏覽器的角色,,需要校驗(yàn)server certificate,,還需要在發(fā)起請求的時(shí)候,,把client certificate發(fā)過去

在JAVA里,,是通過keystore和truststore來實(shí)現(xiàn)的,不在本文的討論范圍內(nèi),??梢钥匆幌缕渌膸灼┛停贖TTPS分類里

十二,、參考資料

http://httpd./docs/2.4/en/ssl/
http://linux./techdoc/net/2008/01/08/976172.shtml
《JAVA加密與解密的藝術(shù)》——作者梁棟   

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多