首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Java的公共访问卡(CAC)身份验证

使用Java的公共访问卡(CAC)身份验证
EN

Stack Overflow用户
提问于 2009-02-12 23:39:55
回答 3查看 38.3K关注 0票数 29

我正在寻找一个可以开始学习如何使用java与政府CAC卡接口的地方。

最终,我的目标是了解如何使用CAC卡身份验证(按密码)授权访问使用Tomcat/J2EE服务器.托管的网站。

但我需要找个地方开始。因此,我想我应该从编写一个小的java程序开始,简单地从CAC卡中读取CAC卡的信息,然后插入到我键盘上的读卡器中(数字键盘上方带有CAC阅读器的戴尔键盘)。

通过搜索google,我找到了 java项目(https://cacard.dev.java.net/),该项目被OpenSSO项目所取代。但是,我似乎找不到如何使用它连接到卡片、从卡片中读取的示例代码。

有人知道我在哪里可以找到一些示例代码,这样我就可以开始学习如何使用java与CAC卡进行交互了吗?

谢谢

编辑:

在进行了更多的研究之后,我在想,我是否能够在clientAuth="true"文件中的连接器元素中设置server.xml

http://tomcat.apache.org/tomcat-6.0-doc/ssl-howto.html

clientAuth:如果您希望Tomcat要求所有socket提供客户端证书以使用此套接字,则将此值设置为true。

EN

回答 3

Stack Overflow用户

发布于 2009-02-13 00:31:44

您是在创建web应用程序,还是试图编写在客户端运行的软件(有点像您自己的web浏览器)?

如果您正在创建一个web应用程序,那么它几乎只是标准的客户端认证。证书来自硬件令牌这一事实对于服务器来说变化不大;如果您只想接受CAC证书,则可以在服务器验证客户端证书时指定一组可接受的证书策略。(政策验证是PKIX验证的标准部分。)如果此应用程序是针对政府客户的,则需要与他们的安全团队密切合作,以确保您的解决方案满足他们的要求,这是非常严格的。如果这是您的方案,请让我知道,我将更新我的回答与一些问题,我们遇到的。

如果您正在编写一个客户机,并且需要访问物理读取器,您可能可以使用Sun PKCS #11提供程序,因为Java1.5。我已经尝试过这个提供程序,您可以在另一个答案。中更多地了解它

在服务器上,您应该检查证书是否被撤销。然而,其中一些CRL是巨大的-我们有超过100 Mb的CRL文件,并且内置的Sun吊销检查器不能很好地缩放到这个大小。

您还需要确保Tomcat的“信任”密钥存储中有正确的根CA证书(政府根CA证书很难找到,因为他们希望确保用户正确地验证它们)。我们还发现,除非用户手动将中间证书导入浏览器,否则Firefox不会发送整个证书链。

票数 16
EN

Stack Overflow用户

发布于 2009-10-27 18:48:53

您需要创建一个名为card.config的文件,并在其中包含以下行:

代码语言:javascript
复制
name = myConfig
library = /path/to/library/that/implements/cac/card/reader 

然后试试这个:

代码语言:javascript
复制
import java.io.*;
import java.util.*;

import java.security.cert.CertificateException;
import java.security.KeyStoreException;
import java.security.cert.X509Certificate;

import java.security.KeyStore;
import java.security.Provider;
import java.security.SecureRandom;
import java.security.Security;

import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;

public class Test  
{
   public static void  main(String arg[]) throws Exception
   {
       try
       {   
         //Create our certificates from our CAC Card
         String configName = "card.config";
         Provider p = new sun.security.pkcs11.SunPKCS11(configName);
         Security.addProvider(p);

         //Get the pin from user entered data
         Console c = System.console();
         char[] pin = c.readPassword("Enter your PIN: ");
         KeyStore cac = null;

         cac = KeyStore.getInstance("PKCS11");
         cac.load(null, pin);

         showInfoAboutCAC(cac);

      }
      catch(Exception ex)
      {
         //System.out.println("*" + ex.getMessage());
         ex.printStackTrace();
         System.exit(0);
      }
   }

   public static void showInfoAboutCAC(KeyStore ks) throws KeyStoreException, CertificateException
   {
      Enumeration<String> aliases = ks.aliases();

      while (aliases.hasMoreElements()) 
      {
         String alias = aliases.nextElement();
         X509Certificate[] cchain = (X509Certificate[]) ks.getCertificateChain(alias);

         System.out.println("Certificate Chain for : " + alias);
         for (int i = 0; i < cchain.length; i ++)
         {
            System.out.println(i + " SubjectDN: " + cchain[i].getSubjectDN());
            System.out.println(i + " IssuerDN:  " + cchain[i].getIssuerDN());
         }
      }
   }
}

此时,您可以使用keystore创建ssl套接字来与https web服务器对话。

票数 9
EN

Stack Overflow用户

发布于 2009-07-08 22:08:19

考虑使用SSO类型的应用程序(如OpenSSOJOSSO )使用证书身份验证。代理应该更容易嵌入,而且它们已经实现了大部分细节。如果您需要自己动手,他们也有许多与所需步骤相关的文档,如:数字证书设置

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/544056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档