Java安全教程–创建SSL连接和证书的分步指南
在有關(guān)應(yīng)用JEE安全性的系列文章中,我們?yōu)槟峁┝肆硪粋€(gè)有關(guān)如何在Java EE應(yīng)用程序中創(chuàng)建SSL連接和創(chuàng)建證書的詳細(xì)教程。 如我們之前的文章中所述, 安全套接字層(SSL)/傳輸層安全性(TLS)將啟用客戶端和Web服務(wù)器之間的安全連接。 客戶端將使用HTTPS連接來使用Web資源。 Java提供了各種基于安全性的API,可以幫助與客戶端建立安全連接并以加密格式發(fā)送/接收消息:
- Java密碼體系結(jié)構(gòu)(JCA)
- Java密碼擴(kuò)展(JCE)
- Java安全套接字?jǐn)U展(JSSE)
為了啟用SSL連接,Web服務(wù)器需要具有數(shù)字證書 ,該數(shù)字證書將允許客戶端信任Web應(yīng)用程序的真實(shí)性。 想要發(fā)送加密消息的應(yīng)用程序向證書頒發(fā)機(jī)構(gòu)(CA)申請數(shù)字證書。 CA驗(yàn)證應(yīng)用程序所有者詳細(xì)信息和其他標(biāo)識詳細(xì)信息,并頒發(fā)數(shù)字證書。
在公鑰基礎(chǔ)結(jié)構(gòu)(PKI)方案中,數(shù)字證書由CA頒發(fā),其中包含專有名稱(DN)/所有者的名稱/主題,用于唯一標(biāo)識證書的序列號,所有者的公鑰,發(fā)行日期,有效期,專有CA的名稱,頒發(fā)機(jī)構(gòu)(CA)的數(shù)字簽名,用于創(chuàng)建簽名的簽名算法 。 CA頒發(fā)的數(shù)字證書可以保存在注冊表中,以便進(jìn)行身份驗(yàn)證的用戶可以使用所有者的公共密鑰。
瀏覽器如何使用證書識別應(yīng)用程序或網(wǎng)站的真實(shí)性?
所有商業(yè)CA與主要的Web瀏覽器都有關(guān)系,因此其根證書將嵌入在其瀏覽器中。 可以通過證書存儲檢查瀏覽器的SSL兼容性,該證書存儲提供有關(guān)存儲在瀏覽器存儲中的CA證書的信息。 另外,CA網(wǎng)站還提供有關(guān)瀏覽器的SSL兼容性的信息。
下圖顯示了示例網(wǎng)站http://abcgen.uk的證書詳細(xì)信息。 下面的證書向客戶保證所有者的真實(shí)性已得到驗(yàn)證,并且數(shù)字證書已頒發(fā)給ABCGen Idiotechie plc,其通用名稱為www.abcgen.uk。
注意:出于安全原因,我們未對實(shí)時(shí)網(wǎng)站進(jìn)行任何引用。 本文中使用的示例僅用于說明和學(xué)習(xí)目的。 此示例顯示證書由Verisign頒發(fā)為Class 3,這表示Verisign已對所有者進(jìn)行了獨(dú)立的驗(yàn)證和確認(rèn)。 這不是指定的PKI標(biāo)準(zhǔn)。 下一個(gè)字段表示此證書的有效性。 指紋表示公鑰,但采用編碼格式。 使用密碼散列函數(shù)SHA1和MD5對數(shù)據(jù)進(jìn)行散列。
樣本證書詳細(xì)信息
下圖顯示了證書層次結(jié)構(gòu)。 第一項(xiàng)表示根證書,第二項(xiàng)表示擴(kuò)展的驗(yàn)證。 證書頒發(fā)機(jī)構(gòu)(CA)提供稱為擴(kuò)展驗(yàn)證的更高安全性證書。 所有主要的Web瀏覽器的密鑰庫都將包含有關(guān)根和擴(kuò)展驗(yàn)證的信息,這將使它們能夠驗(yàn)證特定應(yīng)用程序的真實(shí)性。
證書層次結(jié)構(gòu)
希望大家都明白了。 現(xiàn)在讓我們嘗試一些編碼。
使用的產(chǎn)品:
- IDE: Netbeans 7.2
- Java開發(fā)套件(JDK):版本6
- Glassfish服務(wù)器: 3.1
- 身份驗(yàn)證機(jī)制:基于表單的身份驗(yàn)證
- 驗(yàn)證服務(wù)器: LDAP OpenDS v2.2
目的:
在Web服務(wù)器和客戶端之間創(chuàng)建SSL連接。
步驟1:
在Glassfish服務(wù)器中創(chuàng)建服務(wù)器證書
在Windows中打開命令提示符->轉(zhuǎn)到{domain_dir} / config目錄,其中{domain_dir}表示Glassfish域路徑。
例如C:\ NetBeans \ 7.2 \ config \ GF3 \ domain1 \ config>
第2步:
我們將使用keytool命令生成證書。 Keytool是Java SE 6提供的密鑰和證書管理實(shí)用程序。
運(yùn)行keytool命令,如下所示:
第三步:
將生成的證書導(dǎo)出到server.cer文件。
>keytool -export -alias server-alias -storepass changeit -file server.cer -keystore keysto re.jks Certificate stored in file <server.cer>第四步:
將證書添加到信任存儲文件
>keytool -import -v -trustcacerts -alias server-alias -file server.cer -keystore cacerts.j ks -keypass changeit -storepass changeit Owner: CN=localhost, OU=idiotechie, O=idiotechie, L=edinburgh, ST=EDN, C=GB Issuer: CN=localhost, OU=idiotechie, O=idiotechie, L=edinburgh, ST=EDN, C=GB Serial number: 519e7165 Valid from: Thu May 23 20:43:33 BST 2013 until: Wed Aug 21 20:43:33 BST 2013 Certificate fingerprints: MD5:? 34:B7:71:CD:C9:56:9A:EA:0C:F2:91:50:EA:7F:4B:64 SHA1: AA:DE:EC:1B:27:8E:BC:3A:7A:82:8C:B7:FA:C3:AA:11:2F:97:1F:2C Signature algorithm name: SHA1withRSA Version: 3 Trust this certificate? [no]:? YES Certificate was added to keystore [Storing cacerts.jks]步驟5:
驗(yàn)證證書是否已成功添加到密鑰庫中。
>keytool -list -v -keystore keystore.jks Enter keystore password: Alias name: server-alias Creation date: 23-May-2013 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=localhost, OU=idiotechie, O=idiotechie, L=edinburgh, ST=EDN, C=GB Issuer: CN=localhost, OU=idiotechie, O=idiotechie, L=edinburgh, ST=EDN, C=GB Serial number: 519e7165 Valid from: Thu May 23 20:43:33 BST 2013 until: Wed Aug 21 20:43:33 BST 2013 Certificate fingerprints: MD5:? 34:B7:71:CD:C9:56:9A:EA:0C:F2:91:50:EA:7F:4B:64 SHA1: AA:DE:EC:1B:27:8E:BC:3A:7A:82:8C:B7:FA:C3:AA:11:2F:97:1F:2C Signature algorithm name: SHA1withRSA Version: 3步驟6:
驗(yàn)證證書是否已成功添加到信任存儲中。
>keytool -list -keystore cacerts.jks Enter keystore password:server-alias, 23-May-2013, trustedCertEntry, Certificate fingerprint (MD5): 34:B7:71:CD:C9:56:9A:EA:0C:F2:91:50:EA:7F:4B:64 因此,現(xiàn)在證書在密鑰庫和信任庫中都可用。 密鑰庫包含服務(wù)器的私鑰,而信任庫僅包含CA證書或公用密鑰。 這是對證書和密鑰的更清晰的劃分,其中可以將私鑰保存在密鑰庫中更安全的環(huán)境中,而將公鑰保留在信任庫中的更易訪問的選項(xiàng)中。
但是,在此示例中,由于我們沒有CA證書,因此服務(wù)器證書存儲在受信任的存儲區(qū)中。
步驟7:
從服務(wù)器配置的角度來看,讓我們轉(zhuǎn)到服務(wù)器管理控制臺。
然后單擊配置->服務(wù)器配置-> HTTP服務(wù)-> http-listeners-2。
Http-Listeners-2表示安全的HTTPS端口8181。 單擊SSL選項(xiàng)卡,然后根據(jù)我們上面創(chuàng)建的證書將“證書昵稱”修改為“服務(wù)器別名”。
應(yīng)用程序服務(wù)器SSL設(shè)置
步驟8:
重新啟動服務(wù)器。
至此,所有與服務(wù)器相關(guān)的配置都已完成。
讓我們進(jìn)入應(yīng)用程序代碼。
我們將使用與http://idiotechie.com/secure-web-application-in-java-ee6-using-ldap/相同的應(yīng)用程序代碼。
唯一需要的更改是在web.xml中 ,其中的傳輸保證將從無更改為機(jī)密。
<user-data-constraint> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint>當(dāng)應(yīng)用程序希望阻止其他實(shí)體查看傳輸內(nèi)容時(shí),將使用機(jī)密保護(hù)模式。
生成,部署和運(yùn)行應(yīng)用程序。
現(xiàn)在,即使您嘗試鍵入U(xiǎn)RL http:// localhost:9999 / SampleWebApp / index.jsp ,服務(wù)器也會通過https:// localhost:8181 / SampleWebApp / index.jsp將用戶重定向到安全的HTTPS連接。 由于服務(wù)器生成的證書是自簽名證書,而不是來自CA的證書,因此瀏覽器會發(fā)出警告消息,通知您無法信任網(wǎng)站的安全證書。 這是因?yàn)闉g覽器的信任庫不包含這些證書。
安全的應(yīng)用程序
我們可以將證書添加到瀏覽器的例外列表中,以避免將來出現(xiàn)警告。 現(xiàn)在,讓我們嘗試從Mozilla Firefox瀏覽器檢查示例應(yīng)用程序的證書詳細(xì)信息:
Localhost證書詳細(xì)信息
希望我的讀者能夠理解如何創(chuàng)建數(shù)字證書和保護(hù)Web應(yīng)用程序。 如果您喜歡本文,請?jiān)谏缃痪W(wǎng)站上分享,并幫助我們成長。
在下面下載示例代碼:
翻譯自: https://www.javacodegeeks.com/2013/06/java-security-tutorial-step-by-step-guide-to-create-ssl-connection-and-certificates.html
總結(jié)
以上是生活随笔為你收集整理的Java安全教程–创建SSL连接和证书的分步指南的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 携程最新财报:二季度净营收112亿元 同
- 下一篇: Java EE CDI程序化依赖关系消歧