如何验证配置相互身份验证(客户端证书,服务器证书)Java EE的正确性?

时间:2012-04-12 08:27:05

标签: java security authentication

我正在尝试编写一个简单的应用程序来了解基于客户端和服务器证书配置身份验证的基础知识。

我已经完成了所有内容,因为它在jave ee 5,java ee 6教程中进行了解释 http://docs.oracle.com/javaee/6/tutorial/doc/glien.html

  1. 从javaee教程中打开示例hello basicauthorization(只是简单的servlet,只能在身份验证后访问)然后重新配置它以获取客户端证书而不是基本授权
  2. 已配置的web.xml
  3. 已配置glassfish-web.xml
  4. 生成的客户端证书
  5. 导入的客户端证书,以便服务器信任它。
  6. 问题:

    当我部署我的应用程序并按照与应用程序对应的链接时,我从glassfish服务器HTTP状态400收到消息 - 此请求中没有客户端证书链“。

    因此,似乎客户端(浏览器)不会发送带有请求的证书

    我尝试将.cer证书添加到Chrome,Firefox,Internet Explorer并添加它们(没有显示错误),但正如您所看到的那样无效。

    所以,问题是:

    如何通过具有客户端.cer证书的Web浏览器访问我的应用程序?

1 个答案:

答案 0 :(得分:1)

您可以通过添加(在Glassfish中的某个位置)系统属性来调试服务器端的ssl:

-Djavax.net.debug=all

有关详细信息,请参阅this page

您还可以使用openssl工具从客户端角度进行调试:

openssl s_client -connect host:port -debug -msg
你应该看到这样的事情:

...
Acceptable client certificate CA names
/C=PL/O=company/OU=xx/CN=host/emailAddress=email@example.com
/C=PL/O=company/OU=xx/CN=ca/emailAddress=email@example.com
---
SSL handshake has read 2536 bytes and written 116 bytes
...

您的问题可能与服务器端的错误信任库配置有关 - 服务器发送一些可接受的客户端证书CA名称(或根本没有),但浏览器没有提供任何东西 - 没有任何私钥+由可接受的ca 颁发的证书。