java - 使用相互身份验证时,WebServiceContext.getUserPrincipal 返回 "ANONYMOUS"

标签 java web-services ssl

我正在创建一个使用相互身份验证的 Web 服务(和测试客户端)。我用过 this guide创建 CA 和 key /信任库,但我没有为客户端创建 .p12 文件,而是使用“设置您的 Web 服务器”部分为我需要验证的每个客户端创建一个 keystore 。

服务器端代码很简单,应该返回经过身份验证的用户的名称:

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 和客户端身份验证,并填写了相关的 keystore 和信任库,并设置了 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 时,记录的消息看起来很好(另外,如果我将客户端指向另一个 keystore 摔倒)。有什么想法吗?

最佳答案

我采用了不同的方法并使一切正常(最终)。您可以在this answer中查看详细信息.简而言之,我在问题中使用的身份验证级别太高,Java 无法在 Web 服务级别访问它。

关于java - 使用相互身份验证时,WebServiceContext.getUserPrincipal 返回 "ANONYMOUS",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3082633/

相关文章:

java - 我的 do while 循环在一次迭代后停止。我该如何继续下去?

c# - 我应该使用哪个 header ? XMLHTTPRequest header 还是 SOAP header ?

python - 使用 Python ftplib 完成 FTPS 传输后出错

javascript - SSL 站点不会从其他域加载非 SSL 脚本

java - 部署java webservice时出错

python - 在 Windows : CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://conda. anaconda.org/anaconda/win-64 上安装 python 库的问题

java - vlcj 在尝试创建服务器流时出错

html - Java:通过 eclipse 生成的 jar 文件无法运行。可能是什么问题?

java - 带有 Java 和 gradle 的控制台应用程序

框架 4.5 中的 c# ReadAsJsonAsync