尝试使用智能卡对 Tomcat 进行身份验证

Posted

技术标签:

【中文标题】尝试使用智能卡对 Tomcat 进行身份验证【英文标题】:Trying to use a smartcard to authenticate to Tomcat 【发布时间】:2019-02-18 19:56:26 【问题描述】:

我的 server.xml 文件中有一个适用于我的 Tomcat 服务器的 SSL 配置:

<Connector port="58443" protocol="org.apache.coyote.http11.Http11NioProtocol"
    maxThreads="150" SSLEnabled="true" scheme="https" compression="2048" clientAuth="false"
    sslProtocol="TLSv1.2" URIEncoding="UTF-8" sslEnabledProtocols="TLSv1.2"
    keystoreFile="conf/keystore" keystorePass="changeit"
    ciphers="TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"
    maxSwallowSize="0"/>

我想要求使用智能卡来访问服务器。我找到了Enable Tomcat server for Smart card Authentication 并尝试根据我的情况调整说明。我使用 Windows certmgr 获取智能卡的证书并将它们安装在我的密钥库文件中:

keytool -importcert -file 'My SecureBadge Basic G2.cer' -keystore ./keystore -alias rootca
keytool -importcert -file 'My Hardware Root CA.cer' -keystore ./keystore -alias serverca

我的密钥库现在包含以下 3 个条目:

rootca, Feb 18, 2019, trustedCertEntry,
Certificate fingerprint (SHA1): 2D:70:FE:85:F9:C6:7F:E8:13:9A:73:A9:A1:2D:32:24:1A:EC:EC:5B
serverca, Feb 18, 2019, trustedCertEntry,
Certificate fingerprint (SHA1): 5B:E5:34:32:FB:2B:50:1E:FB:DE:CD:E9:C7:55:1F:08:2B:5D:5D:C6
mysslcert, Jan 16, 2019, PrivateKeyEntry,
Certificate fingerprint (SHA1): 2A:B4:24:7D:2F:E1:E4:E3:E0:7C:90:00:87:88:91:DD:15:39:EC:D8

然后我添加了第二个连接器进行测试:

<Connector port="59443" protocol="org.apache.coyote.http11.Http11NioProtocol"
    maxThreads="150" SSLEnabled="true" scheme="https" compression="2048" clientAuth="true"
    secure="true" SSLVerifyClient="require" SSLEngine="on"
    sslProtocol="TLSv1.2" URIEncoding="UTF-8" sslEnabledProtocols="TLSv1.2"
    keystoreFile="conf/keystore" keystorePass="changeit"
    truststoreFile="conf/keystore" truststorePass="changeit"
    ciphers="TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"
    maxSwallowSize="0"/>

当我尝试连接时,我得到一个弹出窗口:

Please enter the master password for the Oberthur ID One v7PIV PIV pro...

我不知道那个密码。尝试我的 PIN 不起作用。有任何想法吗?我想知道是否需要做更多的事情来告诉 Tomcat 我的根 CA。

【问题讨论】:

【参考方案1】:

我主要是将密钥存储分为两部分。实际的密钥库现在只包含 SSL 证书,另一个名为“piv-truststore”并且只包含智能卡证书。这似乎奏效了。我收到“输入主密码”的相同提示,但现在它接受了我的 PIN(当且仅当我的智能卡插入读卡器时)。

<Connector port="59443" protocol="org.apache.coyote.http11.Http11NioProtocol"
    maxThreads="150" SSLEnabled="true" scheme="https" compression="2048" clientAuth="true"
    secure="true" SSLVerifyClient="require" SSLEngine="on" 
    sslProtocol="TLSv1.2" URIEncoding="UTF-8" sslEnabledProtocols="TLSv1.2"
    keystoreFile="conf/keystore" keystorePass="changeit"
    truststoreFile="conf/piv-truststore" truststorePass="changeit"
    ciphers="TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"
    maxSwallowSize="0"/>

还有一个问题,就是仍然提示我使用密码登录。我怀疑我需要设置一个特殊领域或完成 AD 身份验证的东西。

[更新] 三个月过去了,进步很大。我找到了一个 Java 类,它可以让我使用智能卡并退回到表单。 https://github.com/samwyse/SSLWithFORMFallback8

【讨论】:

以上是关于尝试使用智能卡对 Tomcat 进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章

使用 JDBCRealm 通过 Shiro 对用户进行身份验证

在 Tomcat 上使用 Spring Boot 进行身份验证

“GSSException检测到缺陷令牌” - 尝试使用Kerberos对在Windows上运行的Tomcat进行身份验证时

禁用 cookie 时如何验证用户身份?

Kubernetes liveness 探针是不是支持使用 PKI 进行用户身份验证?

如何让 Tomcat 中的 JNDIRealm 使用 Kerberos 身份验证?