我正在創建使用相互身份驗證的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
時,記錄的消息看起來很不錯(如果我將客戶端指向另一個密鑰存儲庫,它會下降)。有任何想法嗎?