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

Sve*_*lav 3 authentication client-certificates ssl-certificate glassfish-4.1

几天来,我一直在尝试为基于证书的客户端身份验证设置开发环境,但这只是不起作用。我正在使用Glassfish 4文档(安全性指南),并根据它创建用于测试目的的自签名客户端证书,但由于无法完整描述整个过程,因此我不确定所缺少的内容。当我为Http-Listener启用客户端身份验证并且在服务器日志中没有收到任何错误消息时,但是当我尝试从浏览器进行连接时,我无法与服务器建立连接。没有此选项,我的Web应用程序将正常运行。在Chrome浏览器中,我看到以下消息:

无法访问该网站

127.0.0.1拒绝连接。

ERR_CONNECTION_REFUSED

在Firefox中:

页面加载时,与192.168.1.9:8181的连接被中断。

因此对我来说似乎正在发生某些事情(不幸的是,我无法确切理解是什么),但是无法建立连接。

由于设置非常复杂,因此我正在寻找具有逐步说明的教程或操作方法页面,但是对您的帮助和建议将不胜感激。

Sve*_*lav 5

好的,我终于明白了它是如何工作的:)我在带有GlassFish 4 Application Server的Java EE 7书中找到了很好的循序渐进指导,第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将其导入浏览器NB !:未导入证书时,浏览器不要求输入证书,而是返回连接错误消息,这对我来说是极具误导性的。

  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-导入-v -trustcacerts-别名myalias-文件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>
...
Run Code Online (Sandbox Code Playgroud)

第二个是在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>
...
Run Code Online (Sandbox Code Playgroud)

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

最后还有一件令我困惑的事情。通过管理界面,可以找到现有http-listenerSSL配置选项卡。您不必启用“ 客户端身份验证”选项!