基于 Glassfish 4 证书的客户端身份验证

Glassfish 4 certificate based client authentication

这几天我一直在尝试为基于证书的客户端身份验证设置我的开发环境,但它就是不想工作。我正在使用 Glassfish 4 文档(安全指南)并根据它创建用于测试目的的自签名客户端证书,但我不确定我遗漏了什么,因为没有对整个过程的完整描述。当我为我的 Http-Listener 启用客户端身份验证时,服务器日志中没有收到任何错误消息,但是当我尝试从浏览器连接时,我无法与服务器建立连接。没有这个选项,我的网络应用程序工作得很好。在 chrome 中,我看到以下消息:

This site can’t be reached

127.0.0.1 refused to connect.

ERR_CONNECTION_REFUSED

在 Firefox 中:

The connection to 192.168.1.9:8181 was interrupted while the page was loading.

所以对我来说似乎发生了什么(不幸的是我无法理解到底是什么),但无法建立连接。

由于设置非常复杂,我正在寻找包含分步说明的教程或操作方法页面,但我们将不胜感激任何帮助和建议。

好的,我终于明白了它是如何工作的:) 我在 Java EE 7 with GlassFish 4 Application Server 一书中找到了很好的分步说明,第 9 章,证书领域(第 247 页) 基本上必须执行以下 3 个步骤:

  1. 创建客户端证书 1.1 生成自签名证书:

keytool -genkey -v -alias myalias -keyalg RSA -storetype PKCS12 -keystore clientCert_1.p12 -storepass wonttellyou -keypass wonttellyou

1.2 在浏览器中导入 注意!:当未导入证书时,浏览器不会要求它,而是 returns 一条连接错误消息,这对我来说非常具有误导性。

  1. 将步骤 1 中的证书导出为 Glassfish 可以理解的格式

keytool -export -alias myalias -keystore clientCert_1.p12 -storetype PKCS12 -storepass wonttellyou -rfc -file clientCert_1.cer

结果 => 文件中存储的证书 clientCert_1.cer

  1. 由于我们颁发了自签名证书,为了让 GlassFish 接受我们的证书,我们需要将其导入到 cacerts 密钥库中。

keytool -import -v -trustcacerts -alias myalias -file clientCert_1.cer -keystore ../cacerts.jks -keypass changeit -storepass changeit

备注

  • 部分:-import -v -trustcacerts书中没有,但没有 keytool 可能会崩溃并抛出异常。
  • changeit 是默认的 glassfish 密码

最后需要为基于证书的客户端身份验证设置应用程序服务器,它分为两部分。第一个是将登录配置添加到 web.xml:

...
<login-config>
   <auth-method>CLIENT-CERT</auth-method>
   <realm-name>certificate</realm-name>
</login-config>
...

第二个是在glassfish-web.xml中配置角色映射,让你的应用程序有一个相应的角色来登录。它看起来像这样:

 ... 
 <security-role-mapping>
    <role-name>YOUR_ROLE</role-name>
    <group-name>YOUR_GROUP</group-name>
    <principal-name>CN=Test User, OU=n/a, O=Test User, L=Cologne, ST=NRW, C=DE</principal-name>
 </security-role-mapping>
...

有关密钥生成和设置 glassfish 的更多详细信息,请参阅本书。

最后还有一件事让我感到困惑。在管理界面上,可以找到现有 http-listenerSSL 配置选项卡。您不必启用客户端身份验证选项!