日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

在 Java 客戶端中使用 SSL 身份驗(yàn)證

 liuyang_inf 2014-07-24

本部分包含下列主題:

這些部分引用了可從 BEA 的 dev2dev 網(wǎng)站聯(lián)機(jī)獲得的示例代碼,WebLogic Server 分發(fā)的以下位置也包括了這些示例代碼:

SAMPLES_HOME\server\examples\src\examples\security\sslclient

sslclient 目錄包含 instructions.html 文件、ant 生成文件以及下列 Java 和 JavaServer 頁(yè) (.jsp) 文件:

  • MyListener.java
  • NulledHostnameVerifier.java
  • NulledTrustManager.java
  • SSLClient.java
  • SSLClientServlet.java
  • SSLSocketClient.java
  • SnoopServlet.jsp

閱讀以下各部分中的信息時(shí),需要查看示例。

 


JSSE 和 WebLogic Server

Java 安全套接口擴(kuò)展(Java Secure Socket Extension,簡(jiǎn)稱 JSSE)是一組支持和實(shí)現(xiàn) SSL 和 TLS v1 協(xié)議的包,可使得這些功能能夠通過(guò)編程方式使用。BEA WebLogic Server 支持使用安全套接口層(Secure Sockets Layer,簡(jiǎn)稱 SSL)加密 WebLogic Server 客戶端和服務(wù)器、Java 客戶端、Web 瀏覽器以及其他服務(wù)器之間傳輸?shù)臄?shù)據(jù)。

WebLogic Server 的 JSSE 實(shí)現(xiàn)可由 WebLogic 客戶端使用,但并不是必需的。其他 JSSE 實(shí)現(xiàn)也可用于它們?cè)诜?wù)器之外的客戶端代碼。

在 WebLogic 服務(wù)器端應(yīng)用程序使用 SSL 時(shí),適用下列限制:

  • 不支持使用其他(第三方)JSSE 實(shí)現(xiàn)開(kāi)發(fā) WebLogic Server 應(yīng)用程序。WebLogic Server 使用的 SSL 實(shí)現(xiàn)對(duì)服務(wù)器配置來(lái)說(shuō)是靜態(tài)的,不可用客戶應(yīng)用程序替換。
  • JSSE 的 WebLogic 實(shí)現(xiàn)確實(shí)支持 JCE 加密服務(wù)提供程序(Cryptographic Service Provider,簡(jiǎn)稱 CSP);但由于對(duì) JCE 的提供程序支持不一致,因此 BEA 無(wú)法保證未測(cè)試的提供程序?qū)⒓磿r(shí)工作。BEA 已使用下列提供程序測(cè)試了 WebLogic Server:
    • JDK 5.0 附帶的默認(rèn) JCE 提供程序(SunJCE 提供程序)。有關(guān) SunJCE 提供程序的信息,請(qǐng)參閱 http://java./j2se/1.5.0/docs/guide/security/jce/HowToImplAJCEProvider.html。
    • nCipher JCE 提供程序。
    • 其他提供程序可能與 WebLogic Server 一起使用,但未測(cè)試的提供程序不大可能即時(shí)工作。有關(guān)使用 WebLogic Server 支持的 JCE 提供程序的詳細(xì)信息,請(qǐng)參閱“確保 WebLogic Server 安全”中的配置 SSL。

WebLogic Server 為安全套接口層 (SSL) 加密的通信使用 HTTPS 端口,在此端口上僅可以使用 SSL。

注意: 為了在 WebLogic 客戶端實(shí)現(xiàn)安全性,必須在 Java 客戶端上安裝 WebLogic Server 軟件分發(fā)包。

 


使用 JNDI 身份驗(yàn)證

Java 客戶端使用 Java 命名和目錄接口 (JNDI) 將憑據(jù)傳送給 WebLogic Server。Java 客戶端通過(guò)獲取 JNDI InitialContext 來(lái)建立與 WebLogic Server 的連接。然后,Java 客戶端使用 InitialContext,在 WebLogic Server JNDI 樹(shù)中查找所需的資源。

注意: JAAS 是首選的身份驗(yàn)證方法;但是,此身份驗(yàn)證提供程序的 LoginModule 只支持用戶名和密碼身份驗(yàn)證。因此,對(duì)于客戶端證書(shū)身份驗(yàn)證(也稱作雙向 SSL 身份驗(yàn)證),應(yīng)該使用 JNDI。要使用 JAAS 進(jìn)行客戶端證書(shū)身份驗(yàn)證,必須編寫(xiě)自定義身份驗(yàn)證提供程序(其 LoginModule 能進(jìn)行證書(shū)身份驗(yàn)證)。

要指定用戶和用戶憑據(jù),請(qǐng)?jiān)O(shè)置表 5-1 中列出的 JNDI 屬性。

這些屬性存儲(chǔ)在傳遞給 InitialContext 構(gòu)造方法的散列表中。

清單 5-1 說(shuō)明了如何在 Java 客戶端使用單向 SSL 證書(shū)身份驗(yàn)證。有關(guān)雙向 SSL 身份驗(yàn)證代碼示例,請(qǐng)參閱清單 5-4, 使用 JNDI 的雙向 SSL 證書(shū)身份驗(yàn)證客戶端示例。

清單 5-1 使用 JNDI 的單向 SSL 身份驗(yàn)證示例
...
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
env.put(Context.PROVIDER_URL, "t3s://weblogic:7002");
env.put(Context.SECURITY_PRINCIPAL, "javaclient");
env.put(Context.SECURITY_CREDENTIALS, "javaclientpassword");
ctx = new InitialContext(env);
注意: 有關(guān) JNDI 上下文和線程以及如何避免潛在 JNDI 上下文問(wèn)題的信息,請(qǐng)參閱“WebLogic JNDI 編程”中的 JNDI 上下文和線程如何避免潛在的 JNDI 上下文問(wèn)題。

 


SSL 證書(shū)身份驗(yàn)證開(kāi)發(fā)環(huán)境

本部分包含下列主題:

SSL 身份驗(yàn)證 API

要實(shí)現(xiàn)在 WebLogic Server 上使用 SSL 身份驗(yàn)證的 Java 客戶端,請(qǐng)使用 Java JDK 5.0 應(yīng)用程序編程接口(Application Programming Interface,簡(jiǎn)稱 API)和 WebLogic API 的組合。

表 5-2 列出并描述了用于實(shí)現(xiàn)證書(shū)身份驗(yàn)證的 Java API 包。表 5-2 中的信息是從 Java API 文檔獲取的,并附帶批注,以添加 WebLogic Server 特定信息。有關(guān) Java API 的詳細(xì)信息,請(qǐng)參閱位于 http://java./j2se/1.5.0/docs/api/index.html 和 http://java./j2ee/1.4/docs/api/index.html 的 Javadoc。

表 5-3 列出并描述了用于實(shí)現(xiàn)證書(shū)身份驗(yàn)證的 WebLogic API 包。有關(guān)詳細(xì)信息,請(qǐng)參閱 Javadocs for WebLogic Classes。

表 5-2 Java 證書(shū) API 
Java 證書(shū) API
描述
此包提供了用于加密操作的類和接口。此包中定義的加密操作包括加密、密鑰生成和密鑰協(xié)議,以及消息身份驗(yàn)證代碼(Message Authentication Code,簡(jiǎn)稱 MAC)生成。
支持包括對(duì)稱、非對(duì)稱、塊和流密碼在內(nèi)的加密。此包還支持安全流及封裝的對(duì)象。
此包中提供的許多類都基于提供程序(請(qǐng)參閱 java.security.Provider 類)。類自身會(huì)定義可以將應(yīng)用程序?qū)懭肫渲械木幊探涌?。然后,?shí)現(xiàn)自身可由獨(dú)立的第三方供應(yīng)商編寫(xiě)并根據(jù)需要無(wú)縫插入。因此,應(yīng)用程序開(kāi)發(fā)人員可以利用任意數(shù)量的基于提供程序的實(shí)現(xiàn),而無(wú)需添加或重寫(xiě)代碼。
此包為網(wǎng)絡(luò)應(yīng)用程序提供了類。這些類包括用于創(chuàng)建套接口的工廠。使用套接口工廠,可以封裝套接口創(chuàng)建和配置行為。
盡管此包中的類和接口受 WebLogic Server 的支持,但 BEA 建議在 WebLogic Server 中使用 SSL 時(shí),使用 weblogic.security.SSL 包。
此包提供了用于解析和管理證書(shū)、證書(shū)撤銷列表(Certificate Revocation List,簡(jiǎn)稱 CRL)和證書(shū)路徑的類和接口。它包含對(duì) X.509 v3 證書(shū)和 X.509 v2 CRL 的支持。
此類表示內(nèi)存中的密鑰和證書(shū)集合。它用于管理兩種類型的密鑰庫(kù)條目:
  • 密鑰條目
  • 此類型的密鑰庫(kù)條目擁有加密密鑰信息,此信息以受保護(hù)的格式存儲(chǔ),以便阻止未經(jīng)授權(quán)的訪問(wèn)。

    此類型條目中存儲(chǔ)的密鑰通常是機(jī)密密鑰,或相應(yīng)公鑰的證書(shū)鏈附帶的私鑰。

    給定實(shí)體使用私鑰和證書(shū)鏈進(jìn)行自身身份驗(yàn)證。此身份驗(yàn)證的應(yīng)用程序中包括對(duì) JAR 文件進(jìn)行簽名的軟件分發(fā)組織,作為發(fā)布和/或授權(quán)軟件的一部分。

  • 可信證書(shū)條目
  • 此類型條目包含屬于其他方的一個(gè)公鑰證書(shū)。之所以稱其為可信證書(shū),是因?yàn)槊荑€庫(kù)所有者相信,證書(shū)中的公鑰確實(shí)屬于由證書(shū)主題(所有者)識(shí)別的標(biāo)識(shí)。

    此類型條目可用于對(duì)其他方進(jìn)行身份驗(yàn)證。

一個(gè)私鑰。此接口不包含任何方法或常量。它僅用于對(duì)所有私鑰接口進(jìn)行分組(并為其提供類型安全)。

注意: 專用私鑰接口擴(kuò)展了此接口。例如,請(qǐng)參閱 java.security.interfaces 中的 DSAPrivateKey 接口。
此類表示 Java 安全 API 的“加密服務(wù)提供程序”,其中的提供程序可實(shí)現(xiàn)某些或所有 Java 安全部分,包括:
  • 算法(如 DSA、RSA、MD5 或 SHA-1)。
  • 密鑰生成、轉(zhuǎn)換和管理工具(例如用于算法特定的密鑰)。
每個(gè)提供程序都具有名稱和版本號(hào),并在安裝它的每個(gè)運(yùn)行時(shí)進(jìn)行配置。
為了提供加密服務(wù)的實(shí)現(xiàn),開(kāi)發(fā)人員團(tuán)隊(duì)或第三方供應(yīng)商編寫(xiě)了實(shí)現(xiàn)代碼,并創(chuàng)建了 Provider 類的子類。
此接口擴(kuò)展了 ServletRequest 接口,以為 HTTP Servlet 提供請(qǐng)求信息。
Servlet 容器可創(chuàng)建 HttpServletRequest 對(duì)象,并將其作為參數(shù)傳遞給 Servlet 的服務(wù)方法(doGet、doPost,等等)。
此接口擴(kuò)展了 ServletResponse 接口,以在發(fā)送響應(yīng)時(shí)提供 HTTP 特定的功能。例如,它具有訪問(wèn) HTTP 頭和 cookie 的方法。
Servlet 容器可創(chuàng)建 HttpServletRequest 對(duì)象,并將其作為參數(shù)傳送給 Servlet 的服務(wù)方法(doGet、doPost,等等)。
此類提供了用于將二進(jìn)制數(shù)據(jù)發(fā)送給客戶端的輸出流。通常通過(guò) ServletResponse.getOutputStream() 方法檢索 ServletOutputStream 對(duì)象。
這是由 Servlet 容器實(shí)現(xiàn)的抽象類。此類的子類必須實(shí)現(xiàn) java.io.OutputStream.write(int) 方法。
此類定義了用于協(xié)助 Servlet 將響應(yīng)發(fā)送給客戶端的對(duì)象。Servlet 容器可創(chuàng)建 ServletResponse 對(duì)象,并將其作為參數(shù)傳遞給 Servlet 的服務(wù)方法(doGet、doPost,等等)。

表 5-3 WebLogic 證書(shū) API 
WebLogic 證書(shū) API
描述
此類用于表示到遠(yuǎn)程對(duì)象的 HTTP with SSL (HTTPS) 連接。使用此類可進(jìn)行從充當(dāng)客戶端的 WebLogic Server 到另一個(gè) WebLogic Server 的出站 SSL 連接。
在 SSL 握手期間,主機(jī)名驗(yàn)證可確定 URL 中的主機(jī)名是否與服務(wù)器標(biāo)識(shí)中的主機(jī)名相匹配;需要進(jìn)行此驗(yàn)證以防止中間人攻擊。
WebLogic Server 提供了基于證書(shū)的 HostnameVerifier 實(shí)現(xiàn),默認(rèn)情況下使用該實(shí)現(xiàn),它用于驗(yàn)證 URL 主機(jī)名是否與服務(wù)器證書(shū)的 CN 字段值相匹配。
您可以使用管理控制臺(tái)“SSL”選項(xiàng)卡之下的“高級(jí)選項(xiàng)”窗格,用自定義主機(jī)名驗(yàn)證器替換此默認(rèn)的主機(jī)名驗(yàn)證器;這將影響在使用 WebLogic SSL API 的服務(wù)器上運(yùn)行的 SSL 客戶端的默認(rèn)值。另外,通過(guò)諸如 HttpsURLConnectionSSLContext 的 WebLogic SSL API,可以顯式設(shè)置自定義 HostnameVerifier。
通過(guò)此接口,用戶可替換對(duì)等方證書(shū)鏈中的某些驗(yàn)證錯(cuò)誤,并使握手繼續(xù)。通過(guò)此接口,用戶還可以在對(duì)等方證書(shū)鏈上執(zhí)行其他驗(yàn)證,并根據(jù)需要中斷握手。
此類利用配置的 CertPathValidation 提供程序來(lái)執(zhí)行附加驗(yàn)證,例如吊銷檢查。
默認(rèn)情況下將安裝 CertPathTrustManager,但配置為不調(diào)用 CertPathValidator(由 SSLMBean 屬性 InboundCertificateValidation 和 OutboundCertificateValidation 控制)。
安裝自定義 TrustManager 的應(yīng)用程序?qū)⑻鎿Q CertPathTrustManager。要使用自定義 TrustManager 且同時(shí)要調(diào)用 CertPathProvider 的應(yīng)用程序,可通過(guò)其自定義 TrustManager 委托給 CertPathTrustManager。
此類用于存放在此上下文中創(chuàng)建的所有套接口所共享的所有狀態(tài)信息。
此類提供了用于創(chuàng)建 SSL 套接口的 API。
此類可定義上下文元素名。SSL 在調(diào)用一個(gè)或多個(gè) CertPathValidator 對(duì)象執(zhí)行其他驗(yàn)證前,會(huì)執(zhí)行某些內(nèi)置驗(yàn)證。通過(guò)發(fā)現(xiàn)已完成的驗(yàn)證,驗(yàn)證器可以可以減少其必須完成的驗(yàn)證量。

SSL 客戶端應(yīng)用程序組件

SSL 客戶端應(yīng)用程序至少包含下列組件:

  • Java 客戶端
  • 通常,Java 客戶端可執(zhí)行下列功能:

    • 使用客戶端標(biāo)識(shí)、信任、HostnameVerifierTrustManager 初始化 SSLContext。
    • 加載密鑰庫(kù),并檢索私鑰和證書(shū)鏈
    • 使用 SSLSocketFactory
    • 使用 HTTPS 連接到 WebLogic Server 實(shí)例所服務(wù)的 JSP
  • HostnameVerifier
  • HostnameVerifier 可實(shí)現(xiàn) weblogic.security.SSL.HostnameVerifier 接口。

  • HandshakeCompletedListener
  • HandshakeCompletedListener 可實(shí)現(xiàn) javax.net.ssl.HandshakeCompletedListener 接口。SSL 客戶端用它來(lái)接收有關(guān)在給定 SSL 連接上完成 SSL 握手的通知。

  • TrustManager
  • TrustManager 可實(shí)現(xiàn) weblogic.security.SSL.TrustManager 接口。

有關(guān)可實(shí)現(xiàn)上述組件的完整工作 SSL 身份驗(yàn)證客戶端,請(qǐng)參閱與 WebLogic Server 一同提供的 SSLClient 示例應(yīng)用程序(位于 SAMPLES_HOME\server\examples\src\examples\security\sslclient 目錄下)。此示例也可從 BEA 的 dev2dev 站點(diǎn)聯(lián)機(jī)獲得

有關(guān) JSSE 身份驗(yàn)證的詳細(xì)信息,請(qǐng)參閱 Sun 的“Java Secure Socket Extension (JSSE) Reference Guide”,可在以下位置找到:http://java./j2se/1.5.0/docs/guide/security/jsse/JSSERefGuide.html。

 


編寫(xiě)使用 SSL 的應(yīng)用程序

本部分包含下列主題:

從某個(gè) WebLogic Server 到其他 WebLogic Server 安全地通信

可以使用 URL 對(duì)象執(zhí)行從充當(dāng)客戶端的 WebLogic Server 實(shí)例到另一個(gè) WebLogic Server 實(shí)例的出站 SSL 連接。weblogic.net.http.HttpsURLConnection 類為客戶端提供了指定安全上下文信息(包括客戶端的數(shù)字證書(shū)和私鑰)的方法。

weblogic.net.http.HttpsURLConnection 類提供了一些用于實(shí)現(xiàn)下列功能的方法:確定協(xié)商的密碼組、獲取/設(shè)置主機(jī)名驗(yàn)證器、獲取服務(wù)器的證書(shū)鏈以及獲取/設(shè)置 SSLSocketFactory 以便新建 SSL 套接口。

SSLClient 代碼示例使用 weblogic.net.http.HttpsURLConnection 類執(zhí)行出站 SSL 連接。SSLClient 代碼示例可從 SAMPLES_HOME\server\examples\src\examples\security\sslclient 目錄下的 examples.security.sslclient 包獲取。

編寫(xiě) SSL 客戶端

此部分使用這些示例說(shuō)明了如何編寫(xiě)各種類型的 SSL 客戶端。提供了下列類型的 SSL 客戶端示例:

SSL 客戶端許可要求:任何使用 WebLogic SSL 類 (weblogic.security.SSL) 來(lái)調(diào)用 Enterprise JavaBean (EJB) 的獨(dú)立 Java 客戶端必須使用 BEA 許可文件。在運(yùn)行客戶端應(yīng)用程序時(shí),請(qǐng)?jiān)O(shè)置下列系統(tǒng)屬性:

  • 如果將許可保存在 bea.home 之外的位置,則請(qǐng)將該目錄添加到 WebLogic CLASSPATH。
  • 在命令行上,設(shè)置 java.protocol.handler.pkgs=com.certicom.net.ssl

以下是一個(gè)運(yùn)行使用許可文件默認(rèn)位置 (c:\bea) 的命令的示例:

java -Dbea.home=c:\bea \
-Djava.protocol.handler.pkgs=weblogic.net my_app

SSLClient 示例

SSLClient 示例說(shuō)明了如何使用 WebLogic SSL 庫(kù)通過(guò)使用 URLURLConnection 對(duì)象執(zhí)行傳出 SSL 連接。它顯示如何從獨(dú)立應(yīng)用程序以及 WebLogic Server 中的Servlet 執(zhí)行此連接。

注意: 充當(dāng) SSL 客戶端的 WebLogic Server 為傳出 SSL 連接使用服務(wù)器的標(biāo)識(shí)證書(shū)。默認(rèn)情況下,在 WebLogic Server 上運(yùn)行并使用先前描述的 SSL API 的應(yīng)用程序不會(huì)共享服務(wù)器的標(biāo)識(shí)證書(shū),僅是信任。

清單 5-2 顯示了 SSLClient 示例的代碼片段,完整的示例位于 SAMPLES_HOME\server\examples\src\examples\security\sslclient 目錄下的 SSLClient.java 文件中。

清單 5-2 SSLClient 示例代碼片斷
package examples.security.sslclient;

import java.io.*;
import java.net.URL;
import java.security.Provider;
import javax.servlet.ServletOutputStream;
...
  /*
* 使用 WebLogic SSL 客戶端類,
* 此方法包含如何使用 URL 和 URLConnection 對(duì)象
* 創(chuàng)建新 SSL 連接的示例。
*/
  public void wlsURLConnect(String host, String port,
String sport, String query,
OutputStream out)
throws Exception {
...
      URL wlsUrl = null;
try {
wlsUrl = new URL("http", host, Integer.valueOf(port).intValue(),
                               query);
weblogic.net.http.HttpURLConnection connection =
new weblogic.net.http.HttpURLConnection(wlsUrl);
tryConnection(connection, out);
}
...
      wlsUrl = new URL("https", host, Integer.valueOf(sport).intValue(),
                             query);
weblogic.net.http.HttpsURLConnection sconnection =
new weblogic.net.http.HttpsURLConnection(wlsUrl);
...

SSLSocketClient 示例

SSLSocketClient 示例說(shuō)明了如何使用 SSL 套接口直接轉(zhuǎn)至安全端口,以連接到 WebLogic Server 實(shí)例服務(wù)的 JSP,并顯示該連接的結(jié)果。它顯示了如何實(shí)現(xiàn)下列功能:

  • 使用客戶端標(biāo)識(shí)、HostnameVerifierTrustManager 初始化 SSLContext
  • 加載密鑰庫(kù),并檢索私鑰和證書(shū)鏈
  • 使用 SSLSocketFactory
  • 使用 HTTPS 連接到 WebLogic Server 所服務(wù)的 JSP
  • 實(shí)現(xiàn) javax.net.ssl.HandshakeCompletedListener 接口
  • 創(chuàng)建 weblogic.security.SSL.HostnameVerifier 類的虛擬實(shí)現(xiàn),以驗(yàn)證此示例連接到的服務(wù)器是否在所需的主機(jī)上運(yùn)行

清單 5-3 顯示了 SSLSocketClient 示例的代碼片段,完整的示例位于 SAMPLES_HOME\server\examples\src\examples\security\sslclient 目錄下的 SSLSocketClient.java 文件中。(sslclient 目錄中的 SSLClientServlet 示例是一個(gè)簡(jiǎn)單的 SSLClient 的 Servlet 包裝示例。)

清單 5-3 SSLSocketClient 示例代碼片斷
package examples.security.sslclient;

import java.io.*;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.cert.Certificate;
import javax.net.ssl.HandshakeCompletedListener;
import javax.net.ssl.SSLSocket;
import weblogic.security.SSL.HostnameVerifier;
import weblogic.security.SSL.SSLContext;
import weblogic.security.SSL.SSLSocketFactory;
import weblogic.security.SSL.TrustManager;
...
      SSLContext sslCtx = SSLContext.getInstance("https");
File KeyStoreFile = new File ("mykeystore");
...
    // 打開(kāi)密鑰庫(kù)、檢索私鑰和證書(shū)鏈
KeyStore ks = KeyStore.getInstance("jks");
ks.load(new FileInputStream("mykeystore"), null);
PrivateKey key = (PrivateKey)ks.getKey("mykey",
                            "testkey".toCharArray());
Certificate [] certChain = ks.getCertificateChain("mykey");
sslCtx.loadLocalIdentity(certChain, key);
      HostnameVerifier hVerifier = null;
if (argv.length < 3)
 hVerifier = new NulledHostnameVerifier();
else
 hVerifier = (HostnameVerifier)
                        Class.forName(argv[2]).newInstance();

sslCtx.setHostnameVerifier(hVerifier);
TrustManager tManager = new NulledTrustManager();
sslCtx.setTrustManager(tManager);
 System.out.println(" Creating new SSLSocketFactory with SSLContext");
SSLSocketFactory sslSF = (SSLSocketFactory)
                                      sslCtx.getSocketFactory();
System.out.println(" Creating and opening new SSLSocket with
SSLSocketFactory");
      // 使用 createSocket(String hostname, int port)
SSLSocket sslSock = (SSLSocket) sslSF.createSocket(argv[0],
new Integer(argv[1]).intValue());
System.out.println(" SSLSocket created");
       HandshakeCompletedListener mListener = null;
        mListener = new MyListener();
       sslSock.addHandshakeCompletedListener(new MyListener());
...

使用雙向 SSL 身份驗(yàn)證

在使用證書(shū)身份驗(yàn)證時(shí),WebLogic Server 會(huì)將數(shù)字證書(shū)發(fā)送到請(qǐng)求客戶端??蛻舳藢z查數(shù)字證書(shū),以確保其可信、未過(guò)期,并且與提供它的 WebLogic Server 實(shí)例相匹配。

使用雙向 SSL 身份驗(yàn)證(一種相互身份驗(yàn)證的方式)時(shí),請(qǐng)求客戶端也需要向 WebLogic Server 提供數(shù)字證書(shū)。如果將 WebLogic Server 的實(shí)例配置為雙向 SSL 身份驗(yàn)證,則請(qǐng)求客戶端需要提供來(lái)自指定的一組證書(shū)頒發(fā)機(jī)構(gòu)的數(shù)字證書(shū)。WebLogic Server 只接受由可信證書(shū)頒發(fā)機(jī)構(gòu)簽名的數(shù)字證書(shū)。

有關(guān)如何配置雙向 SSL 身份驗(yàn)證的 WebLogic Server 的信息,請(qǐng)參閱“確保 WebLogic Server 安全”中的配置 SSL。

下列部分描述了可在 WebLogic Server 中實(shí)現(xiàn)的幾種不同的雙向 SSL 身份驗(yàn)證方式。

使用 JNDI 的雙向 SSL 身份驗(yàn)證

在 Java 客戶端中使用 JNDI 進(jìn)行雙向 SSL 身份驗(yàn)證時(shí),請(qǐng)使用 WebLogic JNDI Environment 類的 setSSLClientCertificate() 方法。此方法可為客戶端身份驗(yàn)證設(shè)置私鑰和 X.509 數(shù)字證書(shū)鏈。

要將數(shù)字證書(shū)傳送到 JNDI,請(qǐng)創(chuàng)建在包含 DER 編碼數(shù)字證書(shū)的文件上打開(kāi)的 InputStreams 數(shù)組,并在 JNDI 散列表中設(shè)置該數(shù)組。數(shù)組中的第一個(gè)元素必須包含在 Java 客戶端的私鑰文件上打開(kāi)的 InputStream。第二個(gè)元素必須包含在 Java 客戶端的數(shù)字證書(shū)文件上打開(kāi)的 InputStream。 (此文件包含 Java 客戶端的公鑰。)其他元素可能包含根證書(shū)頒發(fā)機(jī)構(gòu)的數(shù)字證書(shū),以及證書(shū)鏈中任何數(shù)字證書(shū)的簽名者。如果某個(gè)數(shù)字證書(shū)不是直接由服務(wù)器的可信證書(shū)頒發(fā)機(jī)構(gòu)發(fā) 行的,則 WebLogic Server 可通過(guò)證書(shū)鏈對(duì) Java 客戶端的數(shù)字證書(shū)進(jìn)行身份驗(yàn)證。

可以使用 weblogic.security.PEMInputStream 類讀取存儲(chǔ)在增強(qiáng)型私人郵件(Privacy Enhanced Mail,簡(jiǎn)稱 PEM)文件中的數(shù)字證書(shū)。此類提供了可通過(guò) PEM 文件對(duì) Base64 編碼證書(shū)進(jìn)行解碼的篩選器。

清單 5-4 說(shuō)明了如何在 Java 客戶端中使用雙向 SSL 身份驗(yàn)證。

清單 5-4 使用 JNDI 的雙向 SSL 身份驗(yàn)證客戶端示例
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import weblogic.jndi.Environment;
import weblogic.security.PEMInputStream;
import java.io.InputStream;
import java.io.FileInputStream;
public class SSLJNDIClient 
{
public static void main(String[] args) throws Exception
{
Context context = null;
try {
Environment env = new Environment();
      // 設(shè)置連接參數(shù)
env.setProviderUrl("t3s://localhost:7002");
// 如果您正在使用 UserNameMapper 接口,
// 那么下兩個(gè)設(shè)置方法是可選的。
env.setSecurityPrincipal("system");
env.setSecurityCredentials("weblogic");
      InputStream key = new FileInputStream("certs/demokey.pem");
InputStream cert = new FileInputStream("certs/democert.pem");
      // 如果 key/cert 在文件中,那么包裝輸入流
key = new PEMInputStream(key);
cert = new PEMInputStream(cert);
      env.setSSLClientCertificate(new InputStream[] { key, cert});
             env.setInitialContextFactory(Environment.DEFAULT_INITIAL_CONTEXT_FACTORY); 
context = env.getInitialContext();
      Object myEJB = (Object) context.lookup("myEJB");
}
finally {
if (context != null) context.close();
}
}
}

調(diào)用 JNDI getInitialContext() 方法時(shí),Java 客戶端和 WebLogic Server 將執(zhí)行相互身份驗(yàn)證,其方式與 Web 瀏覽器執(zhí)行相互身份驗(yàn)證以獲取安全 Web 服務(wù)器連接相同。如果不能驗(yàn)證數(shù)字證書(shū),或不能在默認(rèn)(活動(dòng))安全領(lǐng)域中對(duì) Java 客戶端的數(shù)字證書(shū)進(jìn)行身份驗(yàn)證,將引發(fā)異常。通過(guò)身份驗(yàn)證的用戶對(duì)象存儲(chǔ)在 Java 客戶端的服務(wù)器線程上,并用于檢查可控制 Java 客戶端訪問(wèn)任何受保護(hù) WebLogic 資源的權(quán)限。

在使用 WebLogic JNDI Environment 類時(shí),必須為對(duì) getInitialContext() 方法的每個(gè)調(diào)用新建一個(gè) Environment 對(duì)象。指定 User 對(duì)象和安全憑據(jù)后,用戶及其關(guān)聯(lián)憑據(jù)都將保持 Environment 對(duì)象中的設(shè)置。如果嘗試重新設(shè)置它們,然后調(diào)用 JNDI getInitialContext() 方法,則將使用初始的用戶和憑據(jù)。

在 Java 客戶端中使用雙向 SSL 身份驗(yàn)證時(shí),WebLogic Server 將獲取每個(gè)客戶端 JVM 的唯一 Java 虛擬機(jī) (JVM) ID,以便 Java 客戶端和 WebLogic Server 之間的連接始終不變。除非連接由于沒(méi)有活動(dòng)而超時(shí),只要 Java 客戶端的 JVM 繼續(xù)執(zhí)行,連接就會(huì)持續(xù)存在。Java 客戶端能夠可靠地協(xié)商新 SSL 連接的惟一方法是停止其 JVM,并運(yùn)行 JVM 的其他實(shí)例。

清單 5-4, 使用 JNDI 的雙向身份驗(yàn)證客戶端示例 中的代碼可生成對(duì)實(shí)現(xiàn) weblogic.security.providers.authentication.UserNameMapper 接口的 WebLogic 標(biāo)識(shí)聲明提供程序的調(diào)用。如果數(shù)字證書(shū)有效,則實(shí)現(xiàn) UserNameMapper 接口的類將返回用戶對(duì)象。WebLogic Server 將此通過(guò)身份驗(yàn)證的用戶對(duì)象存儲(chǔ)在 WebLogic Server 中 Java 客戶端的線程上,在線程嘗試使用受默認(rèn)(活動(dòng))安全領(lǐng)域保護(hù)的 WebLogic 資源時(shí),此用戶對(duì)象將用于后續(xù)授權(quán)請(qǐng)求。

注意: CLASSPATH 必須指定 weblogic.security.providers.authentication.UserNameMapper 接口的實(shí)現(xiàn)。

如果您尚未配置可執(zhí)行基于證書(shū)的身份驗(yàn)證的標(biāo)識(shí)聲明提供程序,則通過(guò)新建 JNDI InitialContext,并在 JNDI SECURITY_PRINCIPALSECURITY_CREDENTIALS 屬性中提供新用戶名和密碼,在具有 SSL 連接的 JVM 中運(yùn)行的 Java 客戶端便可更改 WebLogic Server 用戶標(biāo)識(shí)。在進(jìn)行 SSL 連接后,不使用由 Java 客戶端傳遞的任何數(shù)據(jù)證書(shū)。新 WebLogic Server 用戶可繼續(xù)使用與初始用戶的數(shù)字證書(shū)協(xié)商的 SSL 連接。

如果您已經(jīng)配置了執(zhí)行基于證書(shū)的身份驗(yàn)證的標(biāo)識(shí)聲明提供程序,WebLogic Server 將把數(shù)據(jù)證書(shū)從 Java 客戶端傳遞到實(shí)現(xiàn) UserNameMapper 接口的類,UserNameMapper 類可將數(shù)字證書(shū)映射到 WebLogic Server 用戶名。因此,如果要在使用基于證書(shū)的標(biāo)識(shí)聲明時(shí)設(shè)置新用戶標(biāo)識(shí),將無(wú)法更改標(biāo)識(shí)。這是因?yàn)閷?duì)于每個(gè) Environment,只在 JVM 發(fā)出第一個(gè)連接請(qǐng)求時(shí)處理數(shù)字證書(shū)。

警告: 限制:在使用雙向 SSL 和 JNDI 時(shí),不支持多個(gè)并發(fā)用戶從單一客戶端 JVM 登錄到 WebLogic Server。如果多個(gè)登錄在不同線程上執(zhí)行,結(jié)果將無(wú)法確定,并可能導(dǎo)致一個(gè)用戶的請(qǐng)求在其他用戶的登錄上執(zhí)行,從而使某個(gè)用戶可以訪問(wèn)其他用戶的數(shù) 據(jù)。WebLogic Server 不支持來(lái)自單一客戶端 JVM 的多個(gè)基于證書(shū)的并發(fā)登錄。有關(guān) JNDI 上下文和線程,以及如何避免潛在的 JNDI 上下文問(wèn)題的信息,請(qǐng)參閱“WebLogic JNDI 編程”中的 JNDI 上下文和線程如何避免潛在的 JNDI 上下文問(wèn)題。

編寫(xiě)用戶名映射器

在使用雙向 SSL 時(shí),WebLogic Server 在建立 SSL 連接時(shí)可驗(yàn)證 Web 瀏覽器或 Java 客戶端的數(shù)字證書(shū)。但是,數(shù)字證書(shū)不會(huì)將 Web 瀏覽器或 Java 客戶端標(biāo)識(shí)為 WebLogic Server 安全領(lǐng)域中的用戶。如果 Web 瀏覽器或 Java 客戶端請(qǐng)求受安全策略保護(hù)的 WebLogic Server 資源,則 WebLogic Server 需要 Web 瀏覽器或 Java 客戶端具有標(biāo)識(shí)。為了處理此要求,WebLogic 標(biāo)識(shí)聲明提供程序允許啟用用戶名映射器,此映射器可將 Web 瀏覽器或 Java 客戶端的數(shù)字證書(shū)映射到 WebLogic Server 安全領(lǐng)域中的用戶。用戶名映射器必須是 weblogic.security.providers.authentication.UserNameMapper 接口的實(shí)現(xiàn)。

可以選擇使用 weblogic.security.providers.authentication.UserNameMapper 接口的默認(rèn)實(shí)現(xiàn) DefaultUserNameMapperImpl,或開(kāi)發(fā)自己的實(shí)現(xiàn)。

WebLogic 標(biāo)識(shí)聲明提供程序可為下列類型的標(biāo)識(shí)聲明標(biāo)記類型調(diào)用 UserNameMapper 接口的實(shí)現(xiàn):

  • 通過(guò) SSL 握手傳遞的 X.509 數(shù)字證書(shū)
  • 通過(guò) CSIv2 傳遞的 X.509 數(shù)字證書(shū)
  • 通過(guò) CSIv2 傳遞的 X.501 識(shí)別名

如果您需要映射不同類型的證書(shū),請(qǐng)編寫(xiě)自己的 UserNameMapper 接口實(shí)現(xiàn)。

要實(shí)現(xiàn)可將數(shù)字證書(shū)映射到用戶名的 UserNameMapper 接口,請(qǐng)編寫(xiě)可執(zhí)行下列操作的 UserNameMapper 類:

  1. 實(shí)例化 UserNameMapper 實(shí)現(xiàn)類。
  2. 創(chuàng)建 UserNameMapper 接口實(shí)現(xiàn)。
  3. 使用 mapCertificateToUserName() 方法,根據(jù)客戶端提供的證書(shū)鏈,將證書(shū)映射到用戶名。
  4. 將字符串特性類型映射到相應(yīng)的 Attribute Value Assertion 字段類型。

在 WebLogic Server 實(shí)例之間使用雙向 SSL 身份驗(yàn)證

可以在服務(wù)器到服務(wù)器通信中使用雙向 SSL 身份驗(yàn)證,在此通信中其中一個(gè) WebLogic Server 實(shí)例充當(dāng)另一個(gè) WebLogic Server 實(shí)例的客戶端。通過(guò)在服務(wù)器到服務(wù)器通信中使用雙向 SSL 身份驗(yàn)證,即使沒(méi)有更常用的客戶端/服務(wù)器環(huán)境,您也可以擁有可靠的、高度安全的連接。

清單 5-5 顯示了如何建立從在某個(gè) WebLogic Server 實(shí)例中運(yùn)行的 servlet,到第二個(gè)稱為 server2.weblogic.com 的 WebLogic Server 實(shí)例的安全連接示例。

清單 5-5 建立到另一個(gè) WebLogic Server 實(shí)例的安全連接
FileInputStream [] f = new FileInputStream[3]; 
f[0]= new FileInputStream("demokey.pem");
f[1]= new FileInputStream("democert.pem");
f[2]= new FileInputStream("ca.pem");
Environment e = new Environment ();
e.setProviderURL("t3s://server2.weblogic.com:443");
e.setSSLClientCertificate(f);
e.setSSLServerName("server2.weblogic.com");
e.setSSLRootCAFingerprints("ac45e2d1ce492252acc27ee5c345ef26");

e.setInitialContextFactory
("weblogic.jndi.WLInitialContextFactory");
Context ctx = new InitialContext(e.getProperties())

清單 5-5 中,WebLogic JNDI Environment 類創(chuàng)建的散列表用于存儲(chǔ)下列參數(shù):

  • setProviderURL - 指定充當(dāng) SSL 服務(wù)器的 WebLogic Server 實(shí)例的 URL。WebLogic Server 實(shí)例充當(dāng) SSL 客戶端來(lái)調(diào)用此方法。URL 用于指定為在 SSL 協(xié)議上構(gòu)建的 WebLogic Server 專用協(xié)議的 t3 協(xié)議。SSL 協(xié)議可保護(hù)兩個(gè) WebLogic Server 實(shí)例之間的連接和通信。
  • setSSLClientCertificate - 指定用于 SSL 連接的私鑰和證書(shū)鏈。使用此方法可指定一個(gè)輸入流數(shù)組,此數(shù)組由私鑰(數(shù)組中的第一個(gè)輸入流)以及 X.509 證書(shū)鏈(這構(gòu)成了數(shù)組的剩余輸入流)組成。證書(shū)鏈中的每份證書(shū)是鏈中位于它前面的證書(shū)的發(fā)行方。
  • setSSLServerName - 指定充當(dāng) SSL 服務(wù)器的 WebLogic Server 實(shí)例的名稱。在 SSL 服務(wù)器將其數(shù)字證書(shū)提供給充當(dāng) SSL 客戶端的 WebLogic Server 時(shí),會(huì)將使用 setSSLServerName 方法指定的名稱與此數(shù)字證書(shū)中的公用名稱字段進(jìn)行比較。為使主機(jī)名驗(yàn)證獲得成功,這兩個(gè)名稱必須相匹配。此參數(shù)用于防止中間人攻擊。
  • setSSLRootCAFingerprint - 指定可表示一組可信證書(shū)頒發(fā)機(jī)構(gòu)的數(shù)字代碼,從而基于可信證書(shū)指紋指定信任。從充當(dāng) SSL 服務(wù)器的 WebLogic Server 實(shí)例接收的證書(shū)鏈的根證書(shū),必須與使用此方法指定的指紋之一匹配,才能達(dá)到可信的目的。此參數(shù)用于防止中間人攻擊。它提供了附加的默認(rèn)信任級(jí)別,此級(jí)別對(duì) 于在 WebLogic Server 上運(yùn)行的客戶端而言,是由 WebLogic Server 信任配置指定的。
注意: 有關(guān) JNDI 上下文和線程,以及如何避免潛在的 JNDI 上下文問(wèn)題的信息,請(qǐng)參閱“WebLogic JNDI 編程”中的 JNDI 上下文和線程如何避免潛在的 JNDI 上下文問(wèn)題。

使用帶有 Servlet 的雙向 SSL 身份驗(yàn)證

要在某個(gè) Servlet(或其他任何服務(wù)器端 Java 類)中對(duì) Java 客戶端進(jìn)行身份驗(yàn)證,必須檢查客戶端是否提供一份數(shù)字證書(shū),如果是,檢查此證書(shū)是否由可信的證書(shū)頒發(fā)機(jī)構(gòu)發(fā)行。Servlet 開(kāi)發(fā)人員負(fù)責(zé)詢問(wèn) Java 客戶端是否擁有有效的數(shù)字證書(shū)。在使用 WebLogic Servlet API 開(kāi)發(fā) Servlet 時(shí),必須通過(guò) HTTPServletRequest 對(duì)象的 getAttribute() 方法訪問(wèn)有關(guān) SSL 連接的信息。

WebLogic Server Servlet 中支持下列特性:

  • javax.servlet.request.X509Certificate
    java.security.cert.X509Certificate []
    - 可返回一組 X.509 證書(shū)。
  • javax.servlet.request.cipher_suite - 可返回 HTTPS 使用的表示密碼組的字符串。
  • javax.servlet.request.key_size - 可返回一個(gè)整數(shù)(0、40、56、128、168),此整數(shù)表示對(duì)稱(批量加密)密鑰算法的位大小。
  • weblogic.servlet.request.SSLSession
    javax.net.ssl.SSLSession -可返回 SSL 會(huì)話對(duì)象,此對(duì)象包含創(chuàng)建和最后使用對(duì)象的密碼組和日期。

您有權(quán)訪問(wèn)數(shù)字證書(shū)中定義的用戶信息。在您獲取 javax.servlet.request.X509Certificate 特性時(shí),它是 java.security.cert.X509Certificate 類型的數(shù)組。您只需將數(shù)組轉(zhuǎn)換為此類型,并檢查證書(shū)。

數(shù)據(jù)證書(shū)包括的信息如下所示:

  • 主題名稱(持有者、所有者)以及驗(yàn)證主題的唯一標(biāo)識(shí)所需的其他標(biāo)識(shí)信息。
  • 主題的公鑰
  • 發(fā)布數(shù)字證書(shū)的證書(shū)頒發(fā)機(jī)構(gòu)的名稱
  • 序列號(hào)
  • 數(shù)字證書(shū)的有效期(或生命周期),由開(kāi)始日期和終止日期定義

使用自定義主機(jī)名驗(yàn)證器

主機(jī)名驗(yàn)證器可驗(yàn)證進(jìn)行 SSL 連接的主機(jī)是預(yù)定方還是授權(quán)方。如果 WebLogic 客戶端或 WebLogic Server 實(shí)例充當(dāng)另一個(gè)應(yīng)用服務(wù)器的 SSL 客戶端,則主機(jī)名驗(yàn)證器非常有用。它幫助防止中間人攻擊。

注意: 示范數(shù)字證書(shū)是在安裝期間生成的,以便其包含安裝 WebLogic Server 軟件的系統(tǒng)的主機(jī)名。因此,在使用示范證書(shū)進(jìn)行開(kāi)發(fā)和測(cè)試時(shí)應(yīng)保留主機(jī)名驗(yàn)證。

在默認(rèn)情況下,作為 SSL 握手的一項(xiàng)功能,WebLogic Server 會(huì)將 SSL 服務(wù)器證書(shū)主題 DN 的 CN 字段與用于連接到服務(wù)器的 URL 中的主機(jī)名進(jìn)行比較。如果這些名稱不匹配,則刪除此 SSL 連接。

刪除 SSL 連接是由 SSL 客戶端引起的,此客戶端可根據(jù)服務(wù)器的數(shù)字證書(shū)對(duì)服務(wù)器的主機(jī)名進(jìn)行驗(yàn)證。如果需要除默認(rèn)行為之外的行為,可以關(guān)閉主機(jī)名驗(yàn)證,或注冊(cè)自定義主機(jī)名驗(yàn)證器。關(guān)閉主機(jī)名驗(yàn)證將使 SSL 連接容易受到中間人的攻擊。

可以使用下列方式關(guān)閉主機(jī)名驗(yàn)證:

  • 在管理控制臺(tái)中,將位于服務(wù)器(例如 myserver)的“SSL”選項(xiàng)卡下“高級(jí)選項(xiàng)”窗格上的“主機(jī)名驗(yàn)證”字段指定為“無(wú)”。
  • 在 SSL 客戶端的命令行上輸入下列參數(shù):
  • -Dweblogic.security.SSL.ignoreHostnameVerification=true

您可以編寫(xiě)自定義主機(jī)名驗(yàn)證器。weblogic.security.SSL.HostnameVerifier 接口提供了回調(diào)機(jī)制,以便此接口的實(shí)施者能夠提供是否允許連接到 URL 的主機(jī)名的策略。此策略可以基于證書(shū),也可以取決于其他身份驗(yàn)證方案。

要使用自定義主機(jī)名驗(yàn)證器,請(qǐng)創(chuàng)建可實(shí)現(xiàn) weblogic.security.SSL.HostnameVerifier 接口的類,并定義可捕獲服務(wù)器安全標(biāo)識(shí)信息的方法。

注意: 此接口采用新樣式證書(shū)并將替換已不再使用的 weblogic.security.SSL.HostnameVerifierJSSE 接口。

在可以使用自定義主機(jī)名驗(yàn)證器之前,需要使用下列方式實(shí)現(xiàn)指定實(shí)現(xiàn)的類:

  • 在管理控制臺(tái)中,將“服務(wù)器配置”下“SSL”選項(xiàng)卡上的“自定義主機(jī)名驗(yàn)證器”字段設(shè)置為實(shí)現(xiàn)此接口的類的名稱。指定的類必須擁有公共的 no-arg 構(gòu)造方法。
  • 在命令行上輸入下列參數(shù):
  • -Dweblogic.security.SSL.hostnameVerifier=hostnameverifier

    hostnameverifier 的值是實(shí)現(xiàn)自定義主機(jī)名驗(yàn)證器的類的名稱。

清單 5-6 顯示了 NulledHostnameVerifier 示例的代碼片斷;完整的示例位于 SAMPLES_HOME\server\examples\src\examples\security\sslclient 目錄下的 NulledHostnameVerifier.java 文件中。此代碼示例包含始終返回比較結(jié)果為 true 的 NulledHostnameVerifier 類。通過(guò)此示例,WebLogic SSL 客戶端可以連接到任何 SSL 服務(wù)器,無(wú)論服務(wù)器的主機(jī)名和數(shù)字證書(shū) SubjectDN 的比較結(jié)果如何。

清單 5-6 主機(jī)名驗(yàn)證器示例代碼片斷
public class NulledHostnameVerifier implements
weblogic.security.SSL.HostnameVerifier {
public boolean verify(String urlHostname, javax.net.ssl.SSLSession session) {
return true;
}
}

使用信任管理器

weblogic.security.SSL.TrustManager 接口提供執(zhí)行以下功能:

  • 忽略特定的證書(shū)驗(yàn)證錯(cuò)誤
  • 對(duì)對(duì)等方證書(shū)鏈執(zhí)行其他驗(yàn)證
注意: 此接口采用新樣式證書(shū)并將替換已不再使用的 weblogic.security.SSL.TrustManagerJSSE 接口。

當(dāng) SSL 客戶端連接到 WebLogic Server 實(shí)例時(shí),服務(wù)器會(huì)將其數(shù)字證書(shū)鏈提供給客戶端以進(jìn)行身份驗(yàn)證此鏈可能包含無(wú)效的數(shù)字證書(shū)。SSL 規(guī)范中規(guī)定在發(fā)現(xiàn)無(wú)效證書(shū)時(shí),客戶端應(yīng)該刪除 SSL 連接。可以使用 TrustManager 接口的自定義實(shí)現(xiàn),來(lái)控制何時(shí)繼續(xù)或中斷 SSL 握手。使用信任管理器可以忽略某些驗(yàn)證錯(cuò)誤,還可以根據(jù)需要執(zhí)行驗(yàn)證檢查,然后決定是否繼續(xù)握手。

可使用 weblogic.security.SSL.TrustManager 接口創(chuàng)建信任管理器。此接口包含一組證書(shū)驗(yàn)證的錯(cuò)誤代碼。也可以對(duì)對(duì)等方證書(shū)執(zhí)行其他驗(yàn)證,并根據(jù)需要中斷 SSL 握手。在驗(yàn)證數(shù)字證書(shū)后,weblogic.security.SSL.TrustManager 接口將使用回調(diào)功能替換數(shù)字證書(shū)的驗(yàn)證結(jié)果??梢酝ㄟ^(guò) setTrustManager() 方法將信任管理器的實(shí)例與 SSL 上下文相關(guān)聯(lián)。

您只能以編程方式設(shè)置信任管理器;不能通過(guò)管理控制臺(tái)或在命令行上定義其用法。

注意: 使用信任管理器可能會(huì)影響性能,具體取決于所執(zhí)行的檢查。

清單 5-7 顯示了 NulledTrustManager 示例的代碼片斷;完整的示例位于 SAMPLES_HOME\server\examples\src\examples\security\sslclient 目錄下的 NulledTrustManager.java 文件。SSLSocketClient 示例使用自定義信任管理器。SSLSocketClient 顯示了如何通過(guò)使用帶信任管理器的 SSL 上下文設(shè)置新的 SSL 連接。

清單 5-7 NulledTrustManager 示例代碼片斷
package examples.security.sslclient;

import weblogic.security.SSL.TrustManager;
import java.security.cert.X509Certificate;
...
public class NulledTrustManager implements TrustManager{
  public boolean certificateCallback(X509Certificate[] o, int validateErr) {
System.out.println(" --- Do Not Use In Production ---\n" +
                          " By using this NulledTrustManager, the trust in" +
                            " the server's identity is completely lost.\n" +                           " --------------------------------");
for (int i=0; i<o.length; i++)
System.out.println(" certificate " + i + " -- " + o[i].toString());
return true;
}
}

使用證書(shū)路徑信任管理器

CertPathTrustManager weblogic.security.SSL.CertPathTrustManager 利用默認(rèn)安全領(lǐng)域的已配置證書(shū)路徑驗(yàn)證提供程序執(zhí)行附加驗(yàn)證(例如撤銷檢查)。

默認(rèn)情況下,服務(wù)器中使用出站 SSL 的應(yīng)用程序代碼只能訪問(wèn)內(nèi)置的 SSL 證書(shū)驗(yàn)證。但是,應(yīng)用程序代碼可以指定 CertPathTrustManager,以便訪問(wèn)管理員已經(jīng)為服務(wù)器配置的任何其他證書(shū)驗(yàn)證。如果想要應(yīng)用程序代碼也能運(yùn)行證書(shū)路徑驗(yàn)證器,則應(yīng)用程 序代碼應(yīng)使用 CertPathTrustManager。

有三種使用此類的方法:

  • 僅當(dāng)管理器已經(jīng)在 SSLMBean 上設(shè)置了切換,指明出站 SSL 應(yīng)該使用驗(yàn)證器時(shí),信任管理器才會(huì)調(diào)用已配置的證書(shū)路徑驗(yàn)證器。即應(yīng)用程序?qū)Ⅱ?yàn)證完全委托給管理員所配置的所有內(nèi)容??墒褂?setUseConfiguredSSLValidation() 方法來(lái)達(dá)到此目的。此項(xiàng)為默認(rèn)設(shè)置。
  • 信任管理始終調(diào)用任何已配置的證書(shū)路徑驗(yàn)證器??墒褂?setBuiltinSSLValidationAndCertPathValidators() 方法來(lái)達(dá)到此目的。
  • 信任管理從不調(diào)用任何已配置的證書(shū)路徑驗(yàn)證器??墒褂?setBuiltinSSLValidationOnly() 方法來(lái)達(dá)到此目的。

使用握手完成監(jiān)聽(tīng)器

javax.net.ssl.HandshakeCompletedListener 接口定義了 SSL 客戶端接收有關(guān)給定 SSL 連接上 SSL 協(xié)議握手完成的通知的方式。清單 5-8 顯示了 MyListener 示例的代碼片斷;完整的示例位于 SAMPLES_HOME\server\examples\src\examples\security\sslclient 目錄下的 MyListener.java 文件。

清單 5-8 MyListener (HandshakeCompletedListener) 示例代碼片斷
package examples.security.sslclient;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.FileInputStream;
import javax.net.ssl.HandshakeCompletedListener;
import java.util.Hashtable;
import javax.net.ssl.SSLSession;
...
  public class MyListener implements HandshakeCompletedListener
{
public void handshakeCompleted(javax.net.ssl.HandshakeCompletedEvent
                                          event)
{
SSLSession session = event.getSession();
System.out.println("Handshake Completed with peer " +
                               session.getPeerHost());
System.out.println(" cipher: " + session.getCipherSuite());
Certificate[] certs = null;
try
{
certs = session.getPeerCertificates();
}
catch (SSLPeerUnverifiedException puv)
{
certs = null;
}
if (certs != null)
{
System.out.println(" peer certificates:");
for (int z=0; z<certs.length; z++)
                 System.out.println(" certs["+z+"]: " + certs[z]);
}
else
{
System.out.println("No peer certificates presented");
}
}
}

使用 SSLContext

SSLContext 類用于以編程方式配置 SSL,并保留 SSL 會(huì)話信息。每個(gè)實(shí)例都可以使用將用于執(zhí)行身份驗(yàn)證的密鑰、證書(shū)鏈和可信 CA 證書(shū)進(jìn)行配置。使用同一 SSLContext 創(chuàng)建,并用于連接到同一 SSL 服務(wù)器的 SSL 套接口可能重用 SSL 會(huì)話信息。是否實(shí)際重用會(huì)話信息取決于 SSL 服務(wù)器。

有關(guān)會(huì)話緩存的詳細(xì)信息,請(qǐng)參閱“確保 WebLogic Server 安全”中的 SSL 會(huì)話行為。要將信任管理器類的實(shí)例與其 SSL 上下文相關(guān)聯(lián),請(qǐng)使用 weblogic.security.SSL.SSLContext.setTrustManager() 方法。

只能以編程方式設(shè)置 SSL 上下文;不能使用管理控制臺(tái)或命令行進(jìn)行設(shè)置。Java new 表達(dá)式或 SSLContext 類的 getInstance() 方法可以創(chuàng)建 SSLContext 對(duì)象。getInstance() 方法是靜態(tài)的,它可生成實(shí)現(xiàn)指定的安全套接口協(xié)議的新 SSLContext 對(duì)象。 SAMPLES_HOME\server\examples\src\examples\security\sslclient 目錄中的 SSLSocketClient.java 示例提供了使用 SSLContext 類的示例。SSLSocketClient 示例顯示了如何新建將使用 SSLContext 新建 SSL 套接口的 SSL 套接口工廠。

清單 5-9 顯示了使用 getInstance() 方法進(jìn)行實(shí)例化的示例。

清單 5-9 SSL 上下文代碼示例
import weblogic.security.SSL.SSLContext;
  SSLcontext sslctx = SSLContext.getInstance ("https")

使用 URL 執(zhí)行出站 SSL 連接

可以使用 URL 對(duì)象執(zhí)行從充當(dāng)客戶端的某個(gè) WebLogic Server 實(shí)例到另一個(gè) WebLogic Server 實(shí)例的出站 SSL 連接。WebLogic Server 支持出站 SSL 連接的單向和雙向 SSL 身份驗(yàn)證。

對(duì)于單向 SSL 身份驗(yàn)證,可使用 java.net.URL, java.net.URLConnectionjava.net.HTTPURLConnection 類通過(guò)使用 URL 對(duì)象進(jìn)行出站 SSL 連接。清單 5-10 顯示了同時(shí)支持 HTTP 和 HTTPS URL 且僅使用這些 Java 類(即不需要 WebLogic 類) simpleURL 的類。要在 WebLogic Server 上為單向 SSL 身份驗(yàn)證 (HTTPS) 使用 simpleURL 類,只需在系統(tǒng)屬性中為 java.protocols.handler.pkgs 定義“weblogic.net”即可。

注意: 因?yàn)?a href="http://edocs./wls/docs92/security/SSL_client.html#wp1056328">清單 5-10 中顯示的 simpleURL 示例默認(rèn)會(huì)執(zhí)行信任和主機(jī)名檢查,所以此示例需要連接到默認(rèn)情況下可信并且會(huì)傳遞主機(jī)名檢查的真正 Web 服務(wù)器。否則,必須在命令行上替換信任和主機(jī)名檢查。
清單 5-10 僅使用 Java 類的單向 SSL 身份驗(yàn)證 URL 出站 SSL 連接類
import java.net.URL;
import java.net.URLConnection;
import java.net.HttpURLConnection;
import java.io.IOException;
public class simpleURL
{
public static void main (String [] argv)
{
if (argv.length != 1)
{
System.out.println("Please provide a URL to connect to");
System.exit(-1);
}
setupHandler();
connectToURL(argv[0]);
}
   private static void setupHandler()
{
java.util.Properties p = System.getProperties();
String s = p.getProperty("java.protocol.handler.pkgs");
if (s == null)
s = "weblogic.net";
else if (s.indexOf("weblogic.net") == -1)
s += "|weblogic.net";
p.put("java.protocol.handler.pkgs", s);
System.setProperties(p);
}
   private static void connectToURL(String theURLSpec)
{
try
{
URL theURL = new URL(theURLSpec);
URLConnection urlConnection = theURL.openConnection();
HttpURLConnection connection = null;
if (!(urlConnection instanceof HttpURLConnection))
{
System.out.println("The URL is not using HTTP/HTTPS: " +
theURLSpec);
return;
}
connection = (HttpURLConnection) urlConnection;
connection.connect();
String responseStr = "\t\t" +
connection.getResponseCode() + " -- " +
connection.getResponseMessage() + "\n\t\t" +
connection.getContent().getClass().getName() + "\n";
connection.disconnect();
System.out.println(responseStr);
}
catch (IOException ioe)
{
System.out.println("Failure processing URL: " + theURLSpec);
ioe.printStackTrace();
}
}
}

對(duì)于雙向 SSL 身份驗(yàn)證,weblogic.net.http.HttpsURLConnection 類為客戶端提供了一種指定安全上下文信息(包括客戶端的數(shù)字證書(shū)和私鑰)的方法。此類的實(shí)例表示到遠(yuǎn)程對(duì)象的 HTTPS 連接。

SSLClient 示例代碼演示了使用 WebLogic URL 對(duì)象執(zhí)行出站 SSL 連接(請(qǐng)參閱清單 5-11)。清單 5-11 中顯示的代碼示例摘自 SAMPLES_HOME\server\examples\src\examples\security\sslclient 目錄中的 SSLClient.java 文件。

清單 5-11 WebLogic 雙向 SSL 身份驗(yàn)證 URL 出站 SSL 連接代碼示例
wlsUrl = new URL("https", host, Integer.valueOf(sport).intValue(),
query);
weblogic.net.http.HttpsURLConnection sconnection =
new weblogic.net.http.HttpsURLConnection(wlsUrl);
...
InputStream [] ins = new InputStream[2];
ins[0] = new FileInputStream("clientkey.pem");
ins[1] = new FileInputStream("client2certs.pem");
String pwd = "clientkey";
sconnection.loadLocalIdentity(ins[0], ins[1], pwd.toCharArray());

 


SSL 客戶端代碼示例

完整工作的 SSL 身份驗(yàn)證示例與 WebLogic Server 產(chǎn)品一起提供。此示例位于 SAMPLES_HOME\server\examples\src\examples\security\sslclient 目錄。有關(guān)此示例的描述,以及如何生成、配置和運(yùn)行此示例的說(shuō)明,請(qǐng)參閱示例目錄中的 package.html 文件??梢孕薷拇舜a示例,然后重新使用。

http://edocs./wls/docs92/security/SSL_client.html

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多