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

分享

自簽名證書的WEB服務安全應用

 dddTTLee 2011-07-01
自簽名證書的WEB服務安全應用
2008-07-01 11:20

    Java編程語言的一個杰出之處就在于開源社區(qū)可以以較低的成本或者甚至是免費地提供優(yōu)秀的應用程序,。其中一個例子就是Apache Tomcat,,它為使用servlet或JSP技術的開發(fā)提供了一個健壯的Web服務器。現(xiàn)在Web服務技術正日趨成熟,,所以有些應用程序就有可能利用 Swing特性豐富的前端瘦客戶端結合Web或ejb層已經開發(fā)出來的數據驗證和業(yè)務邏輯,。此類應用程序只有在受到保護的情況下才能正常運行,,不過,,安全 性不一定意味著昂貴的成本。本文的目的就是要演示Web服務客戶端如何通過安全的HTTPS協(xié)議使用自簽名的安全證書,。

使用自簽名證書的問題

  HTTPS 通??梢詿o縫地與不安全的HTTP協(xié)議一起使用,而不中斷用戶的體驗,。這是由于SSL被設計為由可信的第三方進行驗證和簽名,。Verisign是一家流行 的認證機構。如果您的Web應用程序要求安全的通信,,那么您就可以付錢給Verisign來簽名您的SSL證書,。經過Verisign簽名之后,您的 Web站點上的用戶就可以不中斷地在HTTP與HTTPS之間進行切換,,因為所有主流Web瀏覽器都信任由Verisign簽名的證書,。但是 Verisign并不是獲得簽名證書的惟一選擇。為了節(jié)省運作成本,,或者為了個人使用方便,,您也可以自簽名自己的證書。但是,,自簽名證書會中斷Web站點 用戶的體驗,。通常Web瀏覽器會顯示一個對話框,詢問您是否希望信任一個自簽名證書,。

  Web瀏覽 器的這一特性很好,,因為當其獲得一個由未知認證機構簽名的證書時,還有機會進行處理,。在開發(fā)用于通過HTTPS進行通信的Web服務客戶端時,,這就沒那么 容易了。在運行Java代碼時,,不會出現(xiàn)詢問是否信任一個不可信的認證機構的對話框,。JRE會拋出一個異常,說明試圖通過HTTPS連接到一個具有不可信 證書的Web站點:

  Caused by:sun.security.validator.ValidatorException:No trusted certificate found

  無法捕獲此異常并繼續(xù)。要讓Web服務使用自簽名證書,,JRE必須以某種方式將您當作認證機構信任,。

解決方案概述

  為演示此問題的解決方案,我將執(zhí)行以下步驟:

  • 生成并自簽名我自己的證書,;
  • 為Tomcat配置SSL,,使其使用該證書;
  • 創(chuàng)建一個示例Web服務,,以便通過HTTPS調用,;
  • 從WSDL生成Web服務客戶端代碼;
  • 使用定制的密鑰庫解決方案演示客戶端,;

生成自簽名證書

  JDK附帶 了一個工具,,keytool.exe,用于管理SSL公鑰/私鑰,。密鑰在文件系統(tǒng)的一個二進制文件中進行添加和刪除,。默認的密鑰庫文件是 JAVA_HOME\jre\lib\security\cacerts。該文件包含了JRE所信任的認證機構的列表,。一個知名可信公司(比如 Verisign)的列表已經存在于密鑰庫中了,。要查看該列表,可使用口令changeit執(zhí)行以下代碼:

  D:\>keytool -list -rfc -keystore JAVA_HOME\jre\lib\security\cacerts

  Keytool應用程序可用于編輯此文件,。但是,,為了防止出錯,最好還是創(chuàng)建一個新文件,。如果不告知keytool使用哪個文件,,它就會默認地創(chuàng)建HOME/.keystore。

  要生成自己的自簽名證書,,可執(zhí)行:

  D:\>keytool.exe -genkey -alias Tomcat -keyalg RSA -storepass bigsecret -keypass bigsecret -dname "cn=localhost"

  執(zhí)行完該命令后,,就會在HOME目錄下生成一個.keystore文件。下面是各種切換命令的含義:

  • genkey:告訴keytool應用程序生成新的公鑰/私鑰對,。
  • alias:用于引用密鑰的名稱,。記住,.keystore文件可包含多個密鑰,。
  • Keyalg:使用RSA算法生成公鑰/私鑰對,。
  • Storepass:訪問.keystore文件所需的口令。
  • Keypass:管理密鑰所需的口令,。
  • dname:該值非常重要,。.我使用了localhost,因為該示例被設計為本地運行,。如果一個Web應用程序被注冊為http://www.,,那么該值就必須是www.,。如果名稱不匹配,證書就會自動被拒絕,。

  一旦keytool應用程序創(chuàng)建了一個新的公鑰/私鑰對,,它就自動自簽名該密鑰。我們剛剛生成了自己的自簽名證書,,它可用于HTTPS通信,。只需提取出自簽名公鑰。后面我將展示如何做,。

為Tomcat配置SSL

  現(xiàn)在必須配置Tomcat,,使其使用自簽名證書。我使用的是Tomcat 5.0.30,。編輯TOMCAT/conf/server.xml文件,。在文件中搜索“8443”,并取消綁定到該端口的<Connector.../>注釋,。然后必須向<Connector.../>添加下屬屬性:

  keystorePass="bigsecret"

  當JRE啟動時,,它將自動找到HOME/.keystore文件,,并且Tomcat會試著使用口令“bigsecret”訪問它,。在Tomcat啟動時,控制臺應該有如下輸出:

  Feb 4, 2006 3:11:23 PM org.apache.coyote.http11.Http11Protocol start

  INFO:Starting Coyote HTTP/1.1 on http-8443

  這意味 著<Connector.../>成功地讀取了.keystore文件,,現(xiàn)在可以通過8443端口進行安全的HTTPS連接了,。打開Web瀏 覽器,并在地址欄輸入https://localhost:8443/,。因為該證書是自簽名的,,所以Web瀏覽器將顯示一個對話框,詢問是否信任該連接,。 如果接受,,則所有的通信都將通過HTTPS進行,從而成為安全的,。

創(chuàng)建Web服務

  我將使用Apache Axis項目創(chuàng)建一個非常簡單的Web服務,。該Web服務將模擬檢查新的電子郵件消息。Web服務客戶端傳遞一個惟一地識別一個用戶的令牌,。Web服務返回一個新電子郵件消息的列表(參見清單1),。

清單1

 

import java.util.*;
public class Email {
public List
getNewMessages(String id)
{
List l = new ArrayList(3);
l.add("1");
l.add("2");
l.add("3");
return l;
}
}

  要獲取已部署的Web服務,執(zhí)行以下步驟:

  • 從清單1剪切并粘貼代碼到Webapp的根目錄下的Email.jws文件,。
  • 編輯Web.xml文件,,添加Axis servlet以及一個*.jws映射(清單2)。
  • 將Axis jar文件放入WEB-INF/lib,。請參見文章末尾的“參考資料”部分,,獲取Axis項目URL,。

清單2

 

<servlet>
<servlet-name>
AxisServlet
</servlet-name>
<display-name>
Apache-Axis Servlet
</display-name>
<servlet-class>
org.apache.axis.transport.http.AxisServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>
AxisServlet
</servlet-name>
<url-pattern>
*.jws
</url-pattern>
</servlet-mapping>

  在部署了本文所附帶的WAR文件(并為Tomcat配置SSL)之后,Web就可以安全地通過HTTPS使用下面的URL來訪問了:

  https://localhost:8443/JDJArticleWebService/Email.jws

使用WSDL2Java

  Axis項目提供了一個名為WSDL2Java的工具,,它獲取一個Web服務WSDL并自動創(chuàng)建使用該Web服務所需的Java源代碼,。參見清單3中用于生成Email.jws Web服務代碼的命令行。

清單3

java
-classpath
.;axis.jar;log4j-1.2.8.jar
;commons-logging-1.0.4.jar
;commons-discovery-0.2.jar
;jaxrpc.jar;saaj.jar
;wsdl4j-1.5.1.jar
org.apache.axis.wsdl.WSDL2Java
-p jdj.wsclient.shared
http://localhost:8080/JDJArticle/Email.jws?wsdl

  注意清單3 中用于訪問WSDL的URL,。它在8080端口使用了不安全的HTTP協(xié)議,。為什么不在8443端口使用HTTPS呢?這是因為自簽名證 書,,WSDL2Java工具將遇到與本文所試圖解決的證書問題完全相同的問題,。所以現(xiàn)在必須使用使用不安全的協(xié)議。這意味著生成的代碼必須有一點改變,,使 用“https”和“8443”替換“http”和“8080”引用,。本文所附帶的客戶端zip文件包含了更改后的代碼。

具有定制密鑰庫的客戶端

  JRE的默 認密鑰庫是JAVA_HOME\jre\lib\security\cacerts,。只要出現(xiàn)自簽名證書,,Java應用程序就會拋出異常,因為該證書不在 密鑰庫中,。因此,,在開發(fā)客戶端時有兩種選擇。第一種選擇是將自簽名證書放入該JRE的默認密鑰庫中,。雖然這種方法有效,,但是它并不是一個好的解決方案,因 為需要在每個客戶端機器上進行定制化,。第二種選擇是生成一個定制的密鑰庫,,將自簽名證書放入其中,并將定制密鑰庫作為應用程序的一部分分發(fā)(通常在一個 jar文件中),。

  要為客戶端創(chuàng)建定制密鑰庫,,需要執(zhí)行以下步驟:

  • 從HOME/.keystore導出自簽名公鑰。
  • 將自簽名公鑰導入到為客戶端創(chuàng)建的新密鑰庫中,。

  要從HOME/.keystore導出自簽名公鑰,,可執(zhí)行以下代碼:

  D:\>keytool.exe -genkey -alias Tomcat -keyalg RSA -storepass bigsecret -keypass bigsecret -dname "cn=localhost"

  現(xiàn)在通過導入Tomcat.cer,為客戶端創(chuàng)建定制密鑰庫:

  D:>keytool.exe -import -noprompt -trustcacerts -alias Tomcat -file Tomcat.cer -keystore CustomKeystore -storepass littlesecret

  使用 “-keystore CustomKeystore”,,將會在當前工作目錄中創(chuàng)建一個名為CustomKeystore的新密鑰庫文件,。可以在本文的客戶端zip文件的 /classpath/resources/keystore目錄下找到CustomKeystore文件,。使用剛剛生成的文件替換該文件,。

  現(xiàn)在只剩下創(chuàng)建一個使用該定制密鑰庫的客戶端了。.我將演示兩種實現(xiàn)方法,。

  第一種方法 是使用Java系統(tǒng)屬性javax.net.ssl.trustStore和javax.net.ssl.trustStorePassword來指向 CustomKeystore文件,,并提供訪問該文件的口令,。jdj.wsclient.truststore包中的示例Web服務客戶端使用的就是這種 方法(參見清單4)。

清單4

public static
void main(String[] args)
throws Exception
{
System.setProperty(
"javax.net.ssl.trustStore",
"classpath/resources/keystore/CustomKeystore");
System.setProperty(
"javax.net.ssl.trustStorePassword",
"littlesecret");
EmailServiceLocator wsl =
new EmailServiceLocator();
Email_PortType ews =
wsl.getEmail();
Object [] objects =
ews.getNewMessages("12345");
out("Msg Count: " + objects.length);
}

main()方法設置系統(tǒng)屬性,,然后創(chuàng)建使用該Web服務的對象,。當JRE需要訪問密鑰庫時,它就在文件系統(tǒng)中尋找 classpath/resources/keystore/CustomKeystore文件,。雖然這只是一個簡單的解決方案,,但它還是存在問題,因為 密鑰庫文件必須放在文件系統(tǒng)中,,而客戶端代碼也必須知道在哪里找到它,。

  第二種解決 方案具有更好的可移植性,它將資源放在jar文件中,,從而避免了文件系統(tǒng)問題,。客戶端代碼負責讀取CustomKeystore文件,,并以某種方式使用它 創(chuàng)建到服務器的安全連接,。jdj.wsclient.socketfactory包中的示例Web服務客戶端使用的就是這種方法(參見清單5)。

清單5

public MySocketFactory(Hashtable table)
throws Exception
{
out("Created!");
KeyStore ks =
KeyStore.getInstance(
KeyStore.getDefaultType()
);
char [] password =
"littlesecret".toCharArray();
String keystore =
"/resources/keystore/CustomKeystore";
Class tclass =
this.getClass();
InputStream is =
tclass.getResourceAsStream(
keystore
);
ks.load(is, password);
KeyManagerFactory kmf =
KeyManagerFactory.getInstance("SunX509");
kmf.init(ks,password);
TrustManagerFactory tmf =
TrustManagerFactory.getInstance("SunX509");
tmf.init(ks);
SSLContext context =
SSLContext.getInstance("SSL");
context.init(
kmf.getKeyManagers(),
tmf.getTrustManagers(),
new SecureRandom()
);
factory =
context.getSocketFactory();
}

  清單5顯示了如何將CustomKeystore文件作為資源讀取,,并使用它來創(chuàng)建javax.net.ssl.SSLSocketFactory,。配置Axis可插入架構,然后可使用MySocketFactory類從該工廠創(chuàng)建安全的Socket對象,。

結束語

  本文以一個 簡單的問題開始:我希望使用自簽名的證書保護通過HTTPS的Web服務通信,。默認情況下,JRE會拒絕應用程序的自簽名證書,,因為它不是來自于可信的認 證機構。要讓安全的通信可運行,,必須讓Web服務客戶端JRE信任自簽名證書,。為此,我使用keytool應用程序生成一個新的公鑰/私鑰對,,提取出自簽 名公鑰,,然后創(chuàng)建一個新的密鑰庫,并導入該自簽名證書,。然后我創(chuàng)建一個不需要任何客戶端配置的,、完全自包含的Web服務客戶端。

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多