91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

httpd設置HTTPS雙向認證

發布時間:2020-07-16 00:37:21 來源:網絡 閱讀:824 作者:yzy121403725 欄目:開發技術

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

一、環境 

httpd: 2.4.4 
openssl:1.0.1 
os:ubuntu 12.04 LTS 

二、場景 

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

一般來說,互聯網站不會去配置雙向認證,因為客戶端證書的分發和管理會比較麻煩,會把用戶擋在門外,所以一般是不能這么做的。當然,像銀行等對安全要求很高的網站,也會采用雙向認證,比如U盾、安全控件什么的,其實就是固化的客戶端證書 

但是對于企業應用來說,客戶一般是固定的,比如兩個已知的系統對接、內部系統集成等。所以在企業應用領域,雙向認證還是比較常見的 

三、背景知識 

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

為了網絡傳輸的安全,有很多種技術,最主要的是以下3種: 

1、加密/解密 

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

2、消息摘要 

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

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

3、數字簽名 

數字簽名是為了驗證雙方的身份,避免身份偽造 

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

四、在httpd中配置單向HTTPS 

首先在%HTTPD_HOME%/conf/目錄下,修改httpd.conf文件,加載必要的模塊 

Httpd代碼  httpd設置HTTPS雙向認證

  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的時候,已經編譯了ssl模塊。這個步驟看另一篇文檔: 
http://kyfxbl.iteye.com/blog/1902299 

然后再導入默認的SSL配置文件,當然也可以選擇不導入,在httpd.conf直接配置。但是導入默認的可以節省很多時間,并且默認的文件是用vhost配置的,不會跟main server沖突,可以算是一種最佳實踐 

Httpd代碼  httpd設置HTTPS雙向認證

  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代碼  httpd設置HTTPS雙向認證

  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認證就配置好了。后面3個目前先注釋掉,是后面雙向認證才用到 

然后重啟一下httpd,會發現報錯: 

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 

這是因為httpd需要一個服務端的私鑰(.key.pem),和一個服務端證書(.cer)。前面已經配置了這2個文件的路徑,但是還沒有創建。下一步就要創建這些文件 

五、創建CA(Certificate Authority) 

這個CA,也叫“根證書” 

服務端做了一個證書,但是這是沒有法律效力的,誰都可以自己做證書,就根本達不到安全的目的。所以就要有一個機構,負責來確認服務端的身份,然后統一的簽發證書。這樣才能有權威性 

當瀏覽器通過HTTPS協議訪問一個網站,網站首先會發過來一個自己的證書(certificate)。接下來瀏覽器就會到權威機構(CA),去驗證一下這個證書是不是它簽發的。如果是的話,就信任這個網站的證書,繼續訪問;如果不是的話,要怎么處理就依賴于實現了。一般的瀏覽器會彈出一個警告,讓用戶自己決定要不要繼續訪問。當然直接拒絕也是可以的 

現在國際上有3大CA機構,如果是要自己做一個網站的話,如上所述,一般是需要請這些權威機構幫忙簽發證書的。現在所有的主流瀏覽器,默認都安裝了這些CA的根證書,所以如果網站的證書是這些權威機構簽發的,瀏覽器就不會發出警告了。比如支付寶,它的證書是由VeriSign簽發的,所以訪問支付寶,瀏覽器不會發出警告 

httpd設置HTTPS雙向認證

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

引用

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).



如果是企業應用,那完全可以自己給自己當CA,因為可以要求目標用戶(系統)安裝自己的CA根證書,效果是一樣的,還可以省下請權威CA簽發證書的費用(互聯網應用分發自己的CA到無數的互聯網用戶上,難度很大) 

下面就介紹如何創建自己的CA 

1、準備工作 

先在隨便一個目錄,創建以下幾個子目錄: 
/private 
/certificates 

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

2、創建CA私鑰 

Openssl代碼  httpd設置HTTPS雙向認證

  1. openssl genrsa -aes256 -out private/ca.key.pem 2048  


最后的參數是RSA密鑰的長度,默認是512。2048其實長了一點,老的瀏覽器稍后會不支持,不過現在的主流瀏覽器都是支持的,所以問題不大 

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

用這個命令,可以看一下剛才創建的這個私鑰的信息 

Openssl代碼  httpd設置HTTPS雙向認證

  1. openssl rsa -noout -text -in private/ca.key.pem  


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

引用


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擴展名,是表示該私鑰用PEM編碼。實際上私鑰和證書都是用PEM編碼的,PEM只是一種編碼格式,不需要太在意。httpd可以直接處理這種編碼格式,但是瀏覽器和JAVA都不行,所以在需要的時候,會把編碼從PEM改成PKCS,后面會介紹。只要知道證書和私鑰都有編碼,只是編碼是PEM還是PKCS的區別而已。就像"你好"可以用UTF-8編碼,也可以用GBK編碼一樣,內容是不變的 

3、創建CA簽名請求 

Openssl代碼  httpd設置HTTPS雙向認證

  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=*.kyfxbl.net"  


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

生成的簽名請求文件,是ca.csr 

Openssl代碼  httpd設置HTTPS雙向認證

  1. openssl req -noout -text -in private/ca.csr  


同上,看不懂 

4、自己簽發CA根證書 

Openssl代碼  httpd設置HTTPS雙向認證

  1. openssl x509 -req -days 3650 -sha1 -extensions v3_ca -signkey private/ca.key.pem -in private/ca.csr -out certificates/ca.cer  


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

生成的ca.cer,就是最終的根證書了!這個文件非常重要,因為后續的服務端證書、客戶端證書,都是用這個CA簽發的,也要把它分發給客戶,讓他們導入到自己的瀏覽器或者系統中 

查看的命令是: 

Openssl代碼  httpd設置HTTPS雙向認證

  1. openssl x509 -noout -text -in certificates/ca.cer  



5、把根證書從PEM編碼轉為PKCS編碼 

這步其實不是必選的,但是前面說過,JAVA環境是不能直接用PEM編碼的證書的,很多瀏覽器也不行,所以有時候也需要轉一下編碼 

Openssl代碼  httpd設置HTTPS雙向認證

  1. openssl pkcs12 -export -cacerts -inkey private/ca.key.pem -in certificates/ca.cer -out certificates/ca.p12  


得到的ca.p12就是轉碼后的CA根證書,在不能直接用ca.cer的時候,就用ca.p12代替 

六、簽發服務端證書 

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

1、創建服務端私鑰 

Openssl代碼  httpd設置HTTPS雙向認證

  1. openssl genrsa -aes256 -out private/server.key.pem 2048  


2、創建服務端證書簽發請求 

Openssl代碼  httpd設置HTTPS雙向認證

  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.kyfxbl.net"  


和ca.csr的區別在于,這里的CN不是*.kyfxbl.net,而是www.kyfxbl.net,因為我現在是在為www.kyfxbl.net申請證書

3、利用CA根證書,簽發服務端證書 

Openssl代碼  httpd設置HTTPS雙向認證

  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  


這里和前面自己簽發CA證書時,參數區別就比較大了,最后得到的server.cer,就是服務端證書 

七、測試單向認證 

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

httpd設置HTTPS雙向認證

然后訪問http://localhost:443/,會報400錯誤: 

httpd設置HTTPS雙向認證 

接下來用https://localhost:443來訪問,瀏覽器報警: 

httpd設置HTTPS雙向認證

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

127.0.0.1       localhost 
192.168.1.102   www.kyfxbl.net 

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

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

httpd設置HTTPS雙向認證

證書信息如下: 

httpd設置HTTPS雙向認證 

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

導入前: 

httpd設置HTTPS雙向認證

導入后: 

httpd設置HTTPS雙向認證 

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

httpd設置HTTPS雙向認證

八、配置雙向認證 

如果要配置服務器只允許合法的用戶訪問,就需要配置雙向認證 

配置為雙向認證之后,除了服務端要發證書給客戶端之外,客戶端也要發客戶端證書到服務端,服務端認證通過,才允許訪問 

Httpd代碼  httpd設置HTTPS雙向認證

  1. SSLCACertificateFile "/usr/local/httpd/conf/ca.cer"  

  2. SSLVerifyClient require  

  3. SSLVerifyDepth  10  


在單項認證的基礎上,再配置以上3個參數 

SSLCACertificateFile,這個意思是當客戶端發來客戶端證書的時候,httpd用哪個CA根證書校驗它 

配置好了,還不能重啟,因為現在客戶端證書還沒做好 

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

有2種方式: 

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

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

當然理論上其實還有一種辦法,就是客戶自己去找權威CA簽證書,但是這個是不可能的,因為很麻煩,找CA簽也非常貴 

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

九、簽發客戶端證書 

1、創建客戶端私鑰 

Openssl代碼  httpd設置HTTPS雙向認證

  1. openssl genrsa -aes256 -out private/client.key.pem 2048  


2、創建客戶端證書簽發請求 

Openssl代碼  httpd設置HTTPS雙向認證

  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不是*.kyfxbl.net,也不是www.kyfxbl.net,隨便填一個kyfxbl就好了,或者干脆叫user都沒問題,反正是一個客戶端證書 

3、利用CA根證書,簽發客戶端證書 

Openssl代碼  httpd設置HTTPS雙向認證

  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  


這里和簽發server.cer基本是一樣的 

4、把客戶端證書轉換成p12格式 

Openssl代碼  httpd設置HTTPS雙向認證

  1. openssl pkcs12 -export -clcerts -inkey private/client.key.pem -in certificates/client.cer -out certificates/client.p12  


這步是必須的,因為稍后就需要把客戶端證書導入到瀏覽器里,但是一般瀏覽器都不能直接使用PEM編碼的證書 

十、測試雙向認證 

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

然后再次訪問https://www.kyfxbl.net/,結果這次不是警告,而是直接報錯: 

httpd設置HTTPS雙向認證

接下來要把client.p12導入到瀏覽器里 

導入前: 

httpd設置HTTPS雙向認證 

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

httpd設置HTTPS雙向認證

導入后: 

httpd設置HTTPS雙向認證

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

httpd設置HTTPS雙向認證

點擊確定,訪問成功! 

十一、JKS等 

到這里,用httpd配置雙向HTTPS認證就完成了 

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

這里實際上是要充當一個類似瀏覽器的角色,需要校驗server certificate,還需要在發起請求的時候,把client certificate發過去 


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永春县| 韶山市| 嘉峪关市| 宜都市| 贵阳市| 太仆寺旗| 彰武县| 景谷| 观塘区| 炎陵县| 鱼台县| 乐安县| 奇台县| 竹溪县| 邯郸县| 宁都县| 和田县| 徐汇区| 锦屏县| 深泽县| 平江县| 岑巩县| 平凉市| 万全县| 嘉荫县| 盐山县| 乌兰浩特市| 蒲江县| 吴旗县| 宁南县| 洞口县| 阜阳市| 武强县| 拉孜县| 嘉禾县| 宝清县| 武乡县| 什邡市| 池州市| 都兰县| 河池市|