2010-06-21 20 views
1

我正在創建使用相互身份驗證的Web服務(和測試客戶端)。我已經使用this guide來創建CA和密鑰/信任存儲,但不是爲客戶創建.p12文件,而是使用「設置您的WEB服務器」部分爲我需要驗證的每個客戶端創建一個密鑰存儲。WebServiceContext.getUserPrincipal在使用相互身份驗證時返回「ANONYMOUS」

服務器端代碼是瑣碎和應該返回認證用戶名:

import javax.annotation.Resource; 
import javax.jws.WebMethod; 
import javax.jws.WebService; 
import javax.xml.ws.WebServiceContext; 

@WebService() 
public class ListProducts { 

    @Resource WebServiceContext context; 

    @WebMethod(operationName = "listProducts") 
    public String listProducts() { 
    return context.getUserPrincipal().toString(); 
    } 
} 

雖然客戶端代碼如下所示:我的網站的

System.getProperties().setProperty("javax.net.trustStore", "C:\\NetBeansProjects\\security-client\\client.jks"); 
    System.getProperties().setProperty("javax.net.trustStorePassword", "changeit"); 
    System.getProperties().setProperty("javax.net.keyStore", "C:\\NetBeansProjects\\security-client\\client.jks"); 
    System.getProperties().setProperty("javax.net.keyStorePassword", "changeit"); 

    ListProductsService lps = new ListProductsService(); 
    ListProducts lp = lps.getListProductsPort(); 

    System.out.println(lp.listProducts()); 

安全部分.xml文件如下所示:

<security-constraint> 
    <display-name>HTTPS</display-name> 
    <web-resource-collection> 
     <web-resource-name>All</web-resource-name> 
     <description/> 
     <url-pattern>/*</url-pattern> 
    </web-resource-collection> 
    <user-data-constraint> 
     <description>Force HTTPS</description> 
     <transport-guarantee>CONFIDENTIAL</transport-guarantee> 
    </user-data-constraint> 
</security-constraint> 
<login-config> 
    <auth-method>CLIENT-CERT</auth-method> 
</login-config> 

Just i這有助於我的部署,我正在部署到GlassFish,並且我使用管理控制檯將SSL網絡偵聽器設置爲使用SSL3,TLS和客戶端身份驗證,並填充相關的密鑰存儲和信任存儲,並將PKIX設置爲信任算法。

問題是客戶端的輸出是ANONYMOUS。我真正想要的是打印在證書中的用戶信息(例如CN=Joe Bloggs, OU=Some Org Unit, O=Some Org, L=AnyTown, ST=AnyState, C=US

通過MessageContext查看也返回的對象,其他字段似乎正確填充,所以我想知道爲什麼安全信息不是'被捕獲。我相信SSL握手還在繼續,因爲當我使用-Djavax.net.debug=ssl,handshake時,記錄的消息看起來很不錯(如果我將客戶端指向另一個密鑰存儲庫,它會下降)。有任何想法嗎?

回答

0

我採取了不同的方法,並得到了一切工作(最後)。您可以在this answer中查看詳細信息。簡而言之,我在問題中使用的身份驗證對於Java能夠在Web服務級別訪問它來說太高級別。

相關問題