Java 使用Vaadin应用程序的公共访问卡(CAC)身份验证

Java 使用Vaadin应用程序的公共访问卡(CAC)身份验证,java,authentication,cac,Java,Authentication,Cac,我正在创建一个需要用户通过登录和密码进行身份验证的Vaadin web应用程序,我想知道是否可以添加CAC身份验证作为另一种身份验证手段 总之,我的目标是,如果用户已通过其CAC认证,则允许访问网站;如果用户未通过CAC认证,则需要标准登录(名称/密码) 通过搜索和谷歌搜索,我找到了,但它看起来像是一个用于桌面集成的库 我也看到过一些和我的情况相似的帖子,但事实并非如此。第一部分通过配置一个web服务器来讨论整个web应用程序的认证需求。第二个方案将JavaPKCS#11作为桌面解决方案 同样,

我正在创建一个需要用户通过登录和密码进行身份验证的Vaadin web应用程序,我想知道是否可以添加CAC身份验证作为另一种身份验证手段

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

通过搜索和谷歌搜索,我找到了,但它看起来像是一个用于桌面集成的库

我也看到过一些和我的情况相似的帖子,但事实并非如此。第一部分通过配置一个web服务器来讨论整个web应用程序的认证需求。第二个方案将JavaPKCS#11作为桌面解决方案


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

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

String cipherSuite=(String)req.getAttribute(“javax.servlet.request.cipher_套件”);
if(cipherSuite!=null){
X509CertificateCertchain[]=(X509Certificate[])req.getAttribute(“javax.servlet.request.X509Certificate”);
如果(certChain!=null){
对于(int i=0;i
这不是特定于vaadin的,它只是一个普通的servlet容器。您需要检查浏览器是否发送了客户端证书,如果该证书是validOk,我只需要知道如何执行这个过程,检查浏览器是否从servlet发送了客户端证书。然后我将删除Vaadin标记。您使用的servlet容器是什么?我正在使用Eclipse Jetty。我尝试过这个,但是
cipherSuite
始终为空。我用于此测试的CAC卡已连接,并列在我的证书下。我应该先配置Jetty吗?您的Jetty是否请求客户端证书?如果没有,那么客户就不可能向您发送oneNo,它不会。我还没有在Jetty上配置SSL。您是否有任何关于如何进行此操作的信息?您的jetty是接受https连接的jetty,还是前面有apache/nginx或其他服务器?设置请求客户端身份验证的嵌入式jetty服务器非常容易:只需添加语句SslContextFactory.setNeedClientAuth(true);配置服务器时,将ssl上下文连接到。任何在服务器的信任库中拥有证书的客户端都将能够建立到服务器的TLS连接。但缺点是在信任库中有正确的密钥。。。
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());
        }
    }
}