我正在创建一个使用相互身份验证的Web服务(和测试客户端)。我已经用过
this guide
为了创建CA和密钥/信任存储,而不是为客户机创建.p12文件,我使用“设置Web服务器”部分为每个需要进行身份验证的客户机创建一个密钥存储。
服务器端代码很简单,
应该
返回已验证用户的名称:
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());
web.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>
为了以防万一,我将部署到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
记录的消息看起来很好(另外,如果我将客户机指向另一个密钥库,它就会崩溃)。有什么想法吗?