我正在创建一个Vaadin Web应用程序,该应用程序要求用户通过登录名和密码进行身份验证,我想知道是否可以添加CAC身份验证作为另一种身份验证方法。

总而言之,我的目标是,如果用户已经通过其CAC身份验证,则允许访问该网站;如果未通过CAC身份验证,则需要标准登录名(名称/密码)

通过搜索和谷歌搜索,我发现了Java PKCS#11,但它看起来像是用于桌面集成的库。

我也看过thisthis帖子,它们看起来与我的情况相似,但实际上却不一样。第一个通过配置Web服务器来讨论整个Web应用程序的认证要求。第二篇介绍了Java PKCS#11作为桌面解决方案。

同样,我希望具有“并行”登录名,如果浏览器将CAC证书发送到服务器,则服务器不应要求标准登录名,否则是。可能吗?另外,如果将CAC证书发送到服务器,是否可以检索有关此CAC的数据,例如所有者名称?

最佳答案

在正确配置的servlet容器中,您可以使用它来读取客户端证书(如果存在)

String cipherSuite = (String) req.getAttribute("javax.servlet.request.cipher_suite");

if (cipherSuite != null) {
    X509Certificate certChain[] = (X509Certificate[]) req.getAttribute("javax.servlet.request.X509Certificate");
    if (certChain != null) {
        for (int i = 0; i < certChain.length; i++) {
            System.out.println ("Client Certificate [" + i + "] = "
                    + certChain[i].toString());
        }
    }
}

10-02 23:38