代码之家  ›  专栏  ›  技术社区  ›  Catchwa

使用相互身份验证时,WebServiceContext.GetUserPrincipal返回“anonymous”

  •  1
  • Catchwa  · 技术社区  · 14 年前

    我正在创建一个使用相互身份验证的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 记录的消息看起来很好(另外,如果我将客户机指向另一个密钥库,它就会崩溃)。有什么想法吗?

    1 回复  |  直到 14 年前
        1
  •  0
  •   Community CDub    7 年前

    我采取了一种不同的方法,使一切都开始工作(最后)。您可以在中看到详细信息 this answer . 简短的故事是,我在这个问题中使用的认证太高,Java无法在Web服务级别访问它。