我正在尝试编写一个简单的应用程序来了解基于客户端和服务器证书配置身份验证的基础知识。
我已经按照jave ee 5,java ee 6教程中的解释完成了所有操作http://docs.oracle.com/javaee/6/tutorial/doc/glien.html
- javaee 教程中打开的示例 hello basicauthorization(只是简单的 servlet,只能在身份验证后访问),然后为客户端证书而不是基本授权重新配置它
- 已配置的网络.xml
- 配置玻璃鱼网.xml
- 生成的客户端证书
- 导入客户端证书,以便服务器信任它。
问题:
当我部署我的应用程序并点击与应用程序对应的链接时,我从 glassfish 服务器 HTTP 状态 400 收到一条消息 - 此请求中没有客户端证书链"。
因此,客户端(浏览器)似乎不会随请求一起发送证书
我尝试将.cer证书添加到Chrome,Firefox,Internet Explorer,并添加了它们(未显示任何错误),但如您所见,这无济于事。
所以,问题是:
如何通过具有客户端.cer证书的 Web 浏览器访问我的应用程序?
您可以通过添加(在 Glassfish 中的某个位置)系统属性在服务器端调试 ssl:
-Djavax.net.debug=all
有关详细信息,请参阅此页面。
您还可以使用 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 颁发的证书。