- 發布時間: 2015/07/30 15:27
- 閱讀: 4177
- 收藏: 178
- 點贊: 6
- 評論: 3
一、背景&概念
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證書
-
創建私鑰 :
openssl genrsa -out ca/ca-key.pem 1024
-
創建證書請求 :
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 []:20095335@mail.besti.edu.cn
彈出密碼輸入選項,Enter默認即可
-
自簽署證書 :
openssl x509 -req -in ca/ca-req.csr -out ca/ca-cert.pem -signkey ca/ca-key.pem -days 3650
-
將證書導出成瀏覽器支持的.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 []:20095335@mail.besti.edu.cn
彈出密碼輸入選項,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證書
-
創建私鑰 :
openssl genrsa -out client/client-key.pem 1024
-
創建證書請求 :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 []:20095335@mail.besti.edu.cn
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
參考資料:
http://my.oschina.net/nearzk/blog/485652
http://seanlook.com/2015/05/28/nginx-ssl/