1. 程式人生 > >https雙向加密認證

https雙向加密認證

一、背景&概念

HTTPS:在http(超文字傳輸協議)基礎上提出的一種安全的http協議,因此可以稱為安全的超文字傳輸協議。 http協議直接放置在TCP協議之上,而https提出在http和TCP中間加上一層加密層。從傳送端看,這一層負責把http的內容加密後送到下層 的TCP,從接收方看,這一層負責將TCP送來的資料解密還原成http的內容。

SSL(Secure Socket Layer):是Netscape公司設計的主要用於WEB的安全傳輸協議。從名字就可以看出它在https協議棧中負責實現上面提到的加密層。因此,一個https協議棧大致是這樣的:

數字證書:一種檔案的名稱,好比一個機構或人的簽名,能夠證明這個機構或人的真實性。其中包含的資訊,用於實現上述功能。

加密和認證:加密是指通訊雙方為了防止銘感資訊在通道上被第三方竊聽而洩漏,將明文通過加密變成密文,如果第三方無法解密的話,就算他獲得密文也無能為力;認證是指通訊雙方為了確認對方是值得信任的訊息傳送或接受方,而不是使用假身份的非法者,採取的確認身份的方式。只有同時進行了加密和認證才能保證通訊的安全,因此在SSL通訊協議中這兩者都被應。早期一般是用對稱加密演算法,現在一般都是不對稱加密,最常見的演算法就是RSA。

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

訊息摘要的演算法主要有MD5和SHA,在證書領域,一般都是用SHA(安全雜湊演算法)。

數字證書、加密和認證、訊息摘要三個技術結合起來,就是在HTTPS中廣泛應用的證書(certificate),證書本身攜帶了加密/解密的資訊,並且可以標識自己的身份,也自帶訊息摘要。

HTTPS認證過程:

① 瀏覽器傳送一個連線請求給安全伺服器。

② 伺服器將自己的證書,以及同證書相關的資訊傳送給客戶瀏覽器。

③ 客戶瀏覽器檢查伺服器送過來的證書是否是由自己信賴的 CA 中心所簽發的。如果是,就繼續執行協議;如果不是,客戶瀏覽器就給客戶一個警告訊息:警告客戶這個證書不是可以信賴的,詢問客戶是否需要繼續。

④ 接著客戶瀏覽器比較證書裡的訊息,例如域名和公鑰,與伺服器剛剛傳送的相關訊息是否一致,如果是一致的,客戶瀏覽器認可這個伺服器的合法身份。

⑤ 伺服器要求客戶傳送客戶自己的證書。收到後,伺服器驗證客戶的證書,如果沒有通過驗證,拒絕連線;如果通過驗證,伺服器獲得使用者的公鑰。

⑥ 客戶瀏覽器告訴伺服器自己所能夠支援的通訊對稱密碼方案。

⑦ 伺服器從客戶傳送過來的密碼方案中,選擇一種加密程度最高的密碼方案,用客戶的公鑰加過密後通知瀏覽器。

⑧ 瀏覽器針對這個密碼方案,選擇一個通話金鑰,接著用伺服器的公鑰加過密後傳送給伺服器。

⑨ 伺服器接收到瀏覽器送過來的訊息,用自己的私鑰解密,獲得通話金鑰。

⑩ 伺服器、瀏覽器接下來的通訊都是用對稱密碼方案,對稱金鑰是加過密的。

上面所述的是雙向認證 SSL 協議的具體通訊過程,這種情況要求伺服器和使用者雙方都有證書。單向認證 SSL 協議不需要客戶擁有 CA 證書,具體的過程相對於上面的步驟,只需將伺服器端驗證客戶證書的過程去掉,以及在協商對稱密碼方案,對稱通話金鑰時,伺服器傳送給客戶的是沒有加過密的 (這並不影響 SSL 過程的安全性)密碼方案。這樣,雙方具體的通訊內容,就是加過密的資料,如果有第三方攻擊,獲得的只是加密的資料,第三方要獲得有用的資訊,就需要對加密 的資料進行解密,這時候的安全就依賴於密碼方案的安全。而幸運的是,目前所用的密碼方案,只要通訊金鑰長度足夠的長,就足夠的安全。這也是我們強調要求使用128 位加密通訊的原因。

二、環境準備

Oracle Linux Server release 6.5、JDK1.7.0_45、openssl-1.0.2d

三、單向認證

3.1 為伺服器生成證書

keytool -genkey -keyalg RSA -dname "cn=127.0.0.1,ou=inspur,o=none,l=shandong,st=jinan,c=cn" -alias server -keypass 111111 -keystore server.keystore -storepass 111111 -validity 3650

注:cn=127.0.0.1配置的是伺服器IP

3.2 生成csr

生成csr檔案用於提交CA認證生成證書使用。

keytool -certReq -alias server -keystore server.keystore -file ca.csr

3.3 生成cer

這個ca.cer是為了解決不信任時要匯入的

keytool -export -alias server -keystore server.keystore -file ca.cer -storepass 111111

3.4 tomcat配置ssl

clientAuth="false"代表單向認證,配置如下:

<Connector SSLEnabled="true" clientAuth="false"

        maxThreads="150" port="8443"

        protocol="org.apache.coyote.http11.Http11Protocol"或者HTTP/1.1

        scheme="https" secure="true" sslProtocol="TLS"

        keystoreFile="D:/server.keystore" keystorePass="111111"/>

注: Http11Protocol支援HTTP/1.1協議,是http1.1協議的ProtocolHandler實現。

3.5 解決不信任

啟動tomcat,輸入 https://127.0.0.1:8443/

這時提示框顯示:伺服器的證書不受信任。在瀏覽器內顯示以下提示:

此伺服器無法證明它是127.0.0.1;您計算機的作業系統不信任其安全證書。出現此問題的原因可能是配置有誤或您的連線被攔截了。

選擇“繼續前往(不安全)”,也能訪問,但是此時就是以普通的HTTP方式進行資訊傳輸了。

 

選擇安裝步驟3.3生成的ca.cer檔案,將證書儲存在“受信任的證書頒發機構”,就可以通過HTTPS正常訪問了。

 

3.6 解決程式訪問異常

這時候如果用程式去訪問可能還會拋證書不信任的異常sun.security.validator.ValidatorException: PKIX path building failed...

需要將生成的證書(ca.cer ) 匯入到jdk中

執行以下命令:

keytool -import -alias tomcatsso -file "ca.cer" -keystore "D:\java\jdk1.6.0_11\jre\lib\security\cacerts" -storepass changeit

其中changeit是jre預設的密碼。

如果拋 No subject alternative names present,請在生成keystore 注意CN必須要為域名(或機器名稱)例如localhost 不能為IP 。

如果拋 No name matching localhost found,表示你生成keystore CN的名稱和你訪問的名稱不一致。

四、雙向認證

4.1 目錄建立

Linux環境下,在home下建立out32dll目錄,在此目錄下建立ca、client、server三個資料夾。以下命令均在out32dll目錄下執行。

4.2 生成CA證書

  1. 建立私鑰 :

openssl genrsa -out ca/ca-key.pem 1024

  1. 建立證書請求 :

openssl req -new -out ca/ca-req.csr -key ca/ca-key.pem

-----

Country Name (2 letter code) [AU]:cn 
State or Province Name (full name) [Some-State]:beijing
Locality Name (eg, city) []:fengtai
Organization Name (eg, company) [Internet Widgits Pty Ltd]:DKY 
Organizational Unit Name (eg, section) []:0953
Common Name (eg, YOUR name) []:CA
Email Address []:[email protected]

彈出密碼輸入選項,Enter預設即可

  1. 自簽署證書 :

openssl x509 -req -in ca/ca-req.csr -out ca/ca-cert.pem -signkey ca/ca-key.pem -days 3650

  1. 將證書匯出成瀏覽器支援的.p12格式 :

openssl pkcs12 -export -clcerts -in ca/ca-cert.pem -inkey ca/ca-key.pem -out ca/ca.p12

密碼:111111

4.3 生成Server證書

一.   1.建立私鑰 : 
openssl genrsa -out server/server-key.pem 1024 
2.建立證書請求 : 
openssl req -new -out server/server-req.csr -key server/server-key.pem 
----- 
Country Name (2 letter code) [AU]:cn 
State or Province Name (full name) [Some-State]:beijing 
Locality Name (eg, city) []:fengtai
Organization Name (eg, company) [Internet Widgits Pty Ltd]:DKY 
Organizational Unit Name (eg, section) []:0953
Common Name (eg, YOUR name) []:222.28.129.224   注意:一定要寫伺服器所在的ip地址 
Email Address []:[email protected]

彈出密碼輸入選項,Enter預設即可

3.自簽署證書 : 
openssl x509 -req -in server/server-req.csr -out server/server-cert.pem -signkey server/server-key.pem -CA ca/ca-cert.pem -CAkey ca/ca-key.pem -CAcreateserial -days 3650 
4.將證書匯出成瀏覽器支援的.p12格式 : 
openssl pkcs12 -export -clcerts -in server/server-cert.pem -inkey server/server-key.pem -out server/server.p12 
密碼:111111

4.4 生成Clinet證書

  1. 建立私鑰 :

openssl genrsa -out client/client-key.pem 1024

  1. 建立證書請求 :openssl req -new -out client/client-req.csr -key client/client-key.pem

-----

Country Name (2 letter code) [AU]:cn

State or Province Name (full name) [Some-State]:Beijing

Locality Name (eg, city) []:fengtai
Organization Name (eg, company) [Internet Widgits Pty Ltd]:DKY

Organizational Unit Name (eg, section) []:0953

Common Name (eg, YOUR name) []:Client

Email Address []:[email protected]      

Please enter the following 'extra' attributes to be sent with your certificate request 
A challenge password []:123456 
An optional company name []:tsing 
3.自簽署證書 :

openssl x509 -req -in client/client-req.csr -out client/client-cert.pem -signkey client/client-key.pem -CA ca/ca-cert.pem -CAkey ca/ca-key.pem -CAcreateserial -days 3650 
4.將證書匯出成瀏覽器支援的.p12格式 : 
openssl pkcs12 -export -clcerts -in client/client-cert.pem -inkey client/client-key.pem -out client/client.p12 
密碼:111111

4.5 根據CA證書生成jks檔案

keytool -keystore truststore.jks -keypass 222222 -storepass 222222 -alias ca -import -trustcacerts -file /home/out32dll/ca/ca-cert.pem

4.6 tomcat配置ssl

tomcat6.0的配置:修改conf/server.xml。 將keystoreFile、truststoreFile的路徑填寫為正確的放置路徑。如下圖:

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"

                maxThreads="150" scheme="https" secure="true"

                clientAuth="true" sslProtocol="TLS"

                keystoreFile="server.p12" keystorePass="111111"  keystoreType="PKCS12"

                truststoreFile="truststore.jks" truststorePass="222222" truststoreType="JKS"/>

4.7 匯入證書

將ca.p12,client.p12分別匯入到IE中去(開啟IE->Internet選項->內容->證書)。 ca.p12匯入至 受信任的根證書頒發機構,client.p12匯入至個人。

五、瀏覽器驗證

驗證ssl配置是否正確訪問你的應用https://伺服器ip:8443/,如果配置正確的話,

單向認證方式會直接跳轉到地址,並且https顯示綠色。

雙向認證方式會出現請求你數字證書的對話方塊,選擇確定,再跳轉到地址,並且https顯示綠色。

六、幫助

6.1 Tomcat—server.xml—Connector屬性

屬性

說明

clientAuth

設定是否雙向驗證,預設為false,設定為true代表雙向驗證

keystoreFile

伺服器證書檔案路徑

keystorePass

伺服器證書密碼

truststoreFile

用來驗證客戶端證書的根證書,此例中就是伺服器證書

truststorePass

根證書密碼

 

6.2 keytool

Keytool是一個Java資料證書的管理工具,Keytool將金鑰和證書存在一個稱為keystore的檔案中。常用命令屬性如下:

命令屬性

說明

-genkey

在使用者主目錄中建立一個預設檔案".keystore",還會產生一個mykey的別名,mykey中包含使用者的公鑰、私鑰和證書

-alias

別名,每個keystore都關聯一個唯一的alias,通常不區分大小寫

-keystore

指定金鑰庫的名稱(產生的各類資訊將不在.keystore檔案中)

-keyalg

指定金鑰的演算法(如 RSA  DSA(如果不指定預設採用DSA)

-validity

指定建立的證書有效期多少天

-keysize

指定金鑰長度

-storepass

指定金鑰庫的密碼(獲取keystore資訊所需的密碼)

-keypass

指定別名條目的密碼(私鑰的密碼)

-dname

指定證書擁有者資訊。例如:"CN=名字與姓氏,OU=組織單位名稱,O=組織名稱,L=城市或區域名稱,ST=省份名稱,C=單位的兩字母國家程式碼"

-list

顯示金鑰庫中的證書資訊

-v

顯示金鑰庫中的證書詳細資訊

-export

將別名指定的證書匯出到檔案,例:

keytool   -export -alias 需要匯出的別名 -keystore 指定keystore -file 指定匯出的證書位置及證書名稱 -storepass 密碼

-file

引數指定匯出到檔案的檔名

-delete

刪除金鑰庫中某條目,例:

keytool -delete -alias 指定需刪除的別名 -keystore 指定keystore  -storepass 密碼

-printcert

檢視匯出的證書資訊,例:keytool   -printcert -file yushan.crt

-keypasswd

修改金鑰庫中指定條目口令,例:

keytool -keypasswd -alias 需修改的別名 -keypass 舊密碼 -new  新密碼  -storepass keystore密碼  -keystore

-import

將已簽名數字證書匯入金鑰庫,例:

keytool -import -alias 指定匯入條目的別名 -keystore 指定keystore -file 需匯入的證書

6.3 openssl

http://www.openssl.org/docs/apps/openssl.html