在Web服务中调用getUserPrincipal()会返回ANONYMOUS

时间:2010-07-22 14:50:25

标签: java web-services authentication ssl glassfish

大家好我正在尝试在我的Web服务和客户端应用程序之间使用纯SSL。它们都在GlassFish 2.1.1中运行,并且每个都在单独的域中。客户端应用程序本身就是Web应用程序,我添加了JVM选项-Dcom.sun.enterprise.security.httpsOutboundKeyAlias = s1as,以便将它的证书发送到Web服务。

我已经完成了将证书导入到其他信任商店的工作。问题是我需要在Web Service中使用客户端证书做一些事情,但调用我之前声明的WebServiceContext的getUserPrincipal方法总是返回ANONYMOUS。

为什么要这样做,如何找回证书中的内容。

编辑: 我想我应该提一下,我创建了一个CA并创建了新的私钥和证书,这些私钥和证书由CA为WS和客户端签名。我使用相同的S1AS默认名称和新签名证书以及CA证书将私钥添加到其密钥库中。

我使用web.xml中的以下规则保护WS:

<security-constraint>
    <display-name>Constraint1</display-name>
    <web-resource-collection>
        <web-resource-name>Customer</web-resource-name>
        <description/>
        <url-pattern>/basecustomer*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <description/>
        <role-name>WSClient</role-name>
    </auth-constraint>
    <user-data-constraint>
        <description/>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>
<login-config>
    <auth-method>CLIENT-CERT</auth-method>
    <realm-name>certificate</realm-name>
</login-config>
<security-role>
    <description/>
    <role-name>WSClient</role-name>
</security-role>

以下是我的sun-web.xml:

<security-role-mapping>
    <role-name>WSClient</role-name>
    <group-name>WSClient</group-name>
</security-role-mapping>

最后在配置下的GlassFish中 - &gt;安全 - &gt;领域 - &gt;证书我告诉它分配组:WSClient

3 个答案:

答案 0 :(得分:0)

看起来您没有为身份验证声明用户名,因此ANONYMOUS是正确答案。

getUserPrincipal()不读取证书来确定用户名。

如果您需要获取证书以根据其内容执行操作,则需要采用不同的方式。

您可能需要仔细阅读此article about client-cert authentication以获取更多信息和提示。这篇文章相当陈旧,但概念和机制并未发生太大变化。

答案 1 :(得分:0)

哇,我不得不仔细检查一下我没有偶然发现my own question

也许我错了,但我的印象是,由于您的身份验证是在Web服务器级别完成的,因此Web服务级别无法访问它?无论如何,我的方法是解决我自己的问题here。也许它会有所帮助。

答案 2 :(得分:0)

在无法解决此问题之后,我将等待GlassFish 3.1,它将更多身份验证选项添加到证书领域,如Kumar Jayanti所述: http://weblogs.java.net/blog/kumarjayanti/archive/2010/03/25/custom-authentication-client-certificate-mutual-ssl-scenarios-g

我希望有了这个,我可以解决这个问题。一旦我在最终的GlassFish 3.1版本上试用了它,我会发布更新。