我正在寻找一个地方开始学习如何使用java与政府CAC卡接口.
最终,我的目标是找出如何使用CAC卡身份验证(通过PIN号码)授权访问使用Tomcat/J2EE服务器托管的网站.
但我需要从某个地方开始.所以我想我开始编写一个小的java程序来简单地从CAC卡读取CAC卡信息,CAC卡插入键盘上的读卡器(DELL键盘上带有CAC阅读器,位于数字键盘上方).
通过搜索谷歌,我发现了由OpenSSO项目取代的cacard java项目(https://cacard.dev.java.net/).但我似乎无法找到如何使用它连接到卡,从卡读取等的示例代码.
有谁知道我在哪里可以找到一些示例代码,以便我可以开始学习如何使用java与CAC卡进行交互?
谢谢
编辑:
在研究了更多之后,我在想,我能够只clientAuth="true"在server.xml文件中的连接器元素中设置吗?
http://tomcat.apache.org/tomcat-6.0-doc/ssl-howto.html
clientAuth:如果希望Tomcat要求所有SSL客户端提供客户端证书以使用此套接字,请将此值设置为true.
eri*_*son 15
您是在创建Web应用程序,还是尝试编写在客户端运行的软件(有点像您自己的Web浏览器)?
如果您正在创建Web应用程序,那么它几乎只是标准的客户端认证身份验证.证书来自硬件令牌的事实对服务器来说没有太大变化; 如果你想接受只 CAC证书,可以在服务器验证客户端证书指定设定可接受的证书策略.(策略验证是PKIX验证的标准部分.)如果此应用程序适用于政府客户,则需要与其安全团队密切合作,以确保您的解决方案满足其要求,这些要求可能非常严格.如果这是你的情况,请告诉我,我会用我们遇到的一些问题更新我的答案.
如果您正在编写客户端,并且需要访问物理读取器,那么从Java 1.5开始,您就可以使用Sun PKCS#11提供程序.我已经尝试过这个提供程序,你可以在另一个答案中阅读更多相关内容.
在服务器上,您应该检查证书是否未被撤销.但是,其中一些CRL是巨大的 -我们有超过100 Mb的CRL文件,并且内置的Sun撤销检查程序不能很好地扩展到这个大小.
您还需要确保在Tomcat的"trust"密钥存储区中拥有正确的根CA证书(政府根CA证书很难找到,因为他们希望确保用户正确验证它们).我们还发现Firefox不会发送整个证书链,除非用户手动将中间证书导入其浏览器.
小智 9
您需要创建一个名为的文件,card.config并在其中包含以下行:
name = myConfig
library = /path/to/library/that/implements/cac/card/reader
Run Code Online (Sandbox Code Playgroud)
然后尝试这个:
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());
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
此时,您有一个密钥库,可用于创建ssl套接字以与https Web服务器通信.
| 归档时间: |
|
| 查看次数: |
35155 次 |
| 最近记录: |