Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java WebServiceContext.getUserPrincipal返回;“匿名”;使用相互身份验证时_Java_Web Services_Ssl - Fatal编程技术网

Java WebServiceContext.getUserPrincipal返回;“匿名”;使用相互身份验证时

Java WebServiceContext.getUserPrincipal返回;“匿名”;使用相互身份验证时,java,web-services,ssl,Java,Web Services,Ssl,我正在创建一个使用相互身份验证的web服务(和测试客户端)。我曾经创建过CA和密钥/信任存储区,但我没有为客户端创建.p12文件,而是使用“设置WEB服务器”部分为需要验证的每个客户端创建密钥库 服务器端代码很简单,应该返回经过身份验证的用户的名称: import javax.annotation.Resource; import javax.jws.WebMethod; import javax.jws.WebService; import javax.xml.ws.WebServiceCon

我正在创建一个使用相互身份验证的web服务(和测试客户端)。我曾经创建过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());
my 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>

HTTPS
全部的
/*
强制HTTPS
保密的
客户端证书
为了以防万一,我将部署到GlassFish,并使用管理控制台将SSL网络侦听器设置为使用SSL3、TLS和客户端身份验证,并填写相关的密钥存储和信任存储,并将PKIX设置为信任算法

问题是客户端的输出是匿名的。我真正想要的是打印在证书中的用户信息(例如,
CN=Joe Bloggs,OU=Some Org Unit,O=Some Org,L=AnyTown,ST=AnyState,C=US


查看同样返回的
MessageContext
对象,其他字段似乎填充正确,因此我想知道为什么没有捕获安全信息。我确信SSL握手正在进行,因为当我使用
-Djavax.net.debug=SSL时,握手
记录的消息似乎很好(另外,如果我将客户端指向另一个密钥库,它就会掉下来)。有什么想法吗?

我采取了一种不同的方法,让一切都开始工作了(最后)。您可以在中看到详细信息。简而言之,我在问题中使用的身份验证级别太高,Java无法在Web服务级别访问它