2013-03-27 125 views
0

我正嘗試使用GlassFish 3.1.2.2 w/Metro JAX-WS連接到合作伙伴Web服務,並且出現HTTP錯誤403.7 - 禁止:需要SSL客戶端證書。GlassFish Metro客戶端證書出站web服務調用失敗

我已經導入我們的合作伙伴提供到GlassFish的密鑰存儲私鑰:

$ keytool -importkeystore -srckeystore XXX.pfx -srcstoretype pkcs12 -destkeystore keystore.jks 
$ keytool -changealias -alias "le-75e085d7-0ceb-4734-ac52-0e64646924c8" -destalias "XXX" -keystore keystore.jks 
$ keytool -keypasswd -alias XXX -keystore keystore.jks 

我則在GlassFish的domain.xml中httpsOutboundKeyAlias屬性設置爲這個新的關鍵:

然後,當我做一個WS電話:

[#|2013-03-26T17:58:30.888-0700|INFO|glassfish3.1.2|javax.enterprise.system.std.com.sun.enterprise.server.logging|_ThreadID=137;_ThreadName=Thread-2;|#.: ---[HTTP request - https://XXX]--- 
Accept: text/xml, multipart/related 
Content-Type: text/xml; charset=utf-8 
SOAPAction: "http://XXX" 
User-Agent: Metro/2.2.0-1 (tags/2.2.0u1-7139; 2012-06-02T10:55:19+0000) JAXWS-RI/2.2.6-2 JAXWS/2.2 svn-revision#unknown 
<?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body>[...]</S:Body></S:Envelope>-------------------- 
|#] 

[#|2013-03-26T17:58:31.847-0700|INFO|glassfish3.1.2|javax.enterprise.system.std.com.sun.enterprise.server.logging|_ThreadID=137;_ThreadName=Thread-2;|#.: ---[HTTP response - https://XXX - 403]--- 
null: HTTP/1.1 403 Forbidden 
Content-Length: 1913 
Content-Type: text/html 
Date: Wed, 27 Mar 2013 00:58:31 GMT 
Server: Microsoft-IIS/6.0 
X-Powered-By: ASP.NET 
[...] 
<h2>HTTP Error 403.7 - Forbidden: SSL client certificate is required.<br>Internet Information Services (IIS)</h2> 

我有這個配置工作o其他webservices,但不是由於某種原因這個...不知道IIS的行爲是不同的?

我似乎能夠精細連接使用curl呈現使用OpenSSL的來自合作伙伴的PFX文件轉換成一個PEM客戶端證書:

$ openssl pkcs12 -in XXX.pfx -out XXX.pem -nodes 
$ curl -vk -E XXX.pem -H "Accept: text/xml, multipart/related" -H "Content-Type: text/xml; charset=utf-8" -H "SOAPAction: \"http://XXX\"" -d @req.xml https://XXX 

所以不知道爲什麼的GlassFish /地鐵未在提交客戶端證書預計時尚。

關於我可能缺少什麼或如何排除故障的任何想法/建議?

我試着設置-Djavax.net.debug = ssl,但字節在GlassFish日誌中顯示爲單獨的日誌條目,所以它很難讀。 我也嘗試從容器外的獨立Java程序運行它,但後來碰到classpath issues

謝謝

+0

當跟蹤javax.net。debug = ssl我可以清楚地看到***證書請求,但Glassfish在***證書鏈之後不提供任何證書,因爲它與其他實例連接到其他服務器。 – TheArchitect 2013-03-28 01:36:57

+0

我還驗證了客戶端證書鏈中的頂級CA與握手過程中服務器提供的證書頒發機構(1)之一相匹配,以及(2)GlassFish cacerts.jks信任庫中的證書,因此我不知道爲什麼GlassFish是不出示客戶證書... – TheArchitect 2013-03-28 01:38:43

回答

0

好了,在後人的情況下它可以幫助別人,將來別人: 我們把範圍縮小到GlassFish中的錯誤。

我們得到了使用javax.net.ssl庫的連接,因此無論出於何種原因GlassFish拒絕爲該特定服務器提供配置的httpsOutboundKeyAlias。不清楚具體原因,因爲它適用於其他人,但從ssl日誌看來,它可能是因爲IIS服務器爲客戶端證書提供了一長串Accepted CAs?有可能列表比預期長,或者GlassFish在將客戶端證書CA與提供的列表相匹配時遇到問題?歡迎GlassFish開發者直接跟蹤我,如果他們關心解決這個問題。

總之,在此期間,這裏的代碼,使其工作:

首先,使用所提供的客戶端證書密鑰存儲創建一個自定義的SSL套接字工廠:

KeyStore ebKeyStore = KeyStore.getInstance("PKCS12"); 
    try (InputStream clientCertKeyInput = new FileInputStream(pfxFilePath)) { 
     ebKeyStore.load(clientCertKeyInput, passwdChars); 
    } 
    KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
    keyManagerFactory.init(ebKeyStore, passwdChars); 

    SSLContext sslCtx = SSLContext.getInstance("TLS"); 
    sslCtx.init(keyManagerFactory.getKeyManagers(), 
       null, // default javax.net.ssl.trustStore 
       new SecureRandom()); 

    sslSocketFactory = sslCtx.getSocketFactory(); 

然後使SOAP堆棧在港口的RequestContext使用的SSLSocketFactory通過屬性:

Map<String, Object> ctxt = ((BindingProvider) port).getRequestContext(); 
    ctxt.put(JAXWSProperties.SSL_SOCKET_FACTORY, sslSocketFactory); 

一線希望是GlassFish中的這種方法來提供客戶端證書未如果您需要連接到多個對外方,那麼至少可以解決這個問題。 :)

相關問題