我正在创建一个使用相互身份验证的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
时,记录的消息看起来很好(另外,如果我将客户端指向另一个密钥库,它会崩溃)。有什么想法吗?
答案 0 :(得分:0)
我采取了不同的方法,并使一切工作(最后)。您可以在this answer中查看详细信息。简而言之,我在问题中使用的身份验证对于Java来说太高级别,无法在Web服务级别访问它。