我正在为BlackBerry使用BlackBerry智能卡读卡器编写应用程序.没有太多关于这个主题的文档,所以我真的很想,如果有人能给我开始的例子.
基本上,卡上有一个RSA私钥和一个证书(用于配对的公钥).我希望能够加密/解密数据并对其进行签名.最终目标是使用智能卡上包含的客户端证书建立相互认证的SSL连接.
这是我到目前为止设法提出的代码:
SmartCardReader btReader = null;
SmartCardReader[] readers = SmartCardReaderFactory.getInstalledReaders();
for (int i = 0; i < readers.length; i++) {
SmartCardReader reader = readers[i];
if (reader.getType().equalsIgnoreCase("bluetooth")) {
btReader = reader;
break;
}
}
SmartCardReaderSession readerSession = reader.openSession();
CryptoSmartCard card = (CryptoSmartCard) readerSession.getSmartCard();
RSACryptoToken token = (RSACryptoToken) card.getCryptoToken("RSA");
Run Code Online (Sandbox Code Playgroud)
这token看起来很有希望 - 有一些很好的方法,但有"神秘"的论点.接下来做什么?
从通用浏览器(通过http(s)连接到服务器),最好是从Javascript访问本地智能卡的可能的客户端架构有哪些,最终用户的安装麻烦最少?服务器需要能够至少向卡发出其选择的APDU(或者可能将其中的一部分委托给它生成的客户端代码).我假设在工作PC/SC堆栈的客户端可用,配有智能卡读卡器.自XP,现代OS X和Unix以来,至少在Windows上这是一个合理的假设.
到目前为止,我已确定了以下选项:
javax.smartcardio.从功能的角度来看,这很好,有充分的记录,我可以忍受一些已知的错误,但我害怕在接受Java-as-a-browser-extension时不可抗拒的向下螺旋.还有其他想法吗?
另外:是否有某种方法可以防止浏览器滥用浏览器所拥有的任何PC/SC接口(例如,提供3个错误的PIN来阻止卡片,只是为了它的肮脏;或者制造一些更邪恶的东西).
我正在寻找一个地方开始学习如何使用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.
我的读者哪个文档几乎与此一样:http://www.jinmuyu.com/download/JMY680A_EN.pdf 主要区别在于,我的读者声称它也支持TYPE B卡.
我有三张ISO 14443卡,我连续测试,并遵循以下代码:
byte[] rs = null;
Thread.Sleep(500);
// Set module Idle
Random r = new Random();
byte rInt = (byte) r.Next(0, 255);
rs = send(new byte[] { 0x12, rInt });
if (rs[1] == 0xED)
throw new Exception("Failed set idle");
Thread.Sleep(500);
//// Request B
//rs = send(new byte[] { 0x60, 0x00, 0x00 });
//if (rs[1] == 0x9F)
// throw new Exception("Failed card requestB");
// RequestA
rs = send(new byte[] { 0x20, 0x00 });
if (rs[1] …Run Code Online (Sandbox Code Playgroud) 是否可以从运行在同一台机器上的Web浏览器访问连接到计算机的智能卡读卡器,即从ActionScript,JavaScript或其中运行的任何脚本?
例如,我flash.external.ExternalInterface在ActionScript中阅读了有关该类的内容.它可以用于访问智能卡读卡器还是Sandbox难以穿透?
javascript browser actionscript-3 smartcard smartcard-reader
我正在尝试使用javax.smartcardio API加载智能卡终端,代码如下:
public CardTerminal getReadyCardTerminal() throws CardException {
TerminalFactory factory = TerminalFactory.getDefault();
CardTerminals terminals = factory.terminals();
List<CardTerminal> list = terminals.list(State.CARD_PRESENT);
while (list.isEmpty()) {
terminals.waitForChange(1000);
list = terminals.list(State.CARD_PRESENT);
}
CardTerminal cardTerminal = list.get(0);
return cardTerminal;
}
Run Code Online (Sandbox Code Playgroud)
...而且我总是得到以下异常:
java.lang.IllegalStateException: no terminals
at javax.smartcardio.TerminalFactory$NoneCardTerminals.waitForChange(TerminalFactory.java:145)
Run Code Online (Sandbox Code Playgroud)
在Windows Vista/7上一切正常,但我不能让它在Linux上运行.我正在使用Ubuntu 12.04 64位.
我使用以下命令安装了pcscd服务:
sudo apt-get install libccid pcscd libpcsclite-dev libpcsclite1
sudo service pcscd start
Run Code Online (Sandbox Code Playgroud)
pcsc_scan命令打印出来:
PC/SC device scanner
V 1.4.18 (c) 2001-2011, Ludovic Rousseau <ludovic.rousseau@free.fr>
Compiled with PC/SC lite version: 1.7.4
Using reader plug'n play mechanism
Scanning …Run Code Online (Sandbox Code Playgroud) 我正在使用读写器acr38f,我的智能卡是SLE4418.如何读取和写入智能卡的文本?
例如: Hello World!
apdu = [0XFF,0X20,0x00,0x00,0x02,0x00,0x00]
响应,sw1,sw2 = cardservice.connection.transmit(apdu)
Run Code Online (Sandbox Code Playgroud)apdu = [0XFF,0xA4,0x00,0x00,0x01,0x05] response, sw1, sw2 = cardservice.connection.transmit( apdu ) apdu = [0XFF,0XB2,0X00,0xA7,0X09] response, sw1, sw2 = cardservice.connection.transmit( apdu ) print response apdu = [0XFF, 0XD0,0x00,0xA7,0x09,0xA7,0x02,0xA7,0x02,0xA7,0x02,0xA7,0x02,0xA7] response, sw1, sw2 = cardservice.connection.transmit( apdu )
卡响应:
connecting to ACS CCID USB Reader 0
ATR 3B 04 92 23 10 91
> FF 20 00 00 02 00 00
< 00 00 00 90 0
> FF A4 00 00 01 05
< …Run Code Online (Sandbox Code Playgroud) 如何开始使用智能卡编程?我在这里问他需要的所有工具包才能入门:书籍,教程,硬件等.
我打算和几个智能卡程序员一起玩,我对这个领域很陌生.
编辑:我最感兴趣的是那些与类Unix操作系统兼容的程序员.此外,我不确定这是如何工作的...但我想用C/C++编程
我有一个使用智能卡读卡器的应用程序允许用户访问系统的各个部分.在一个地方我没有问题.但是另一种具有不同类型的卡制造商的问题存在很多问题.它不断获得零回报.然后查看事件日志,我看到了这个:
这是代码:
card.Connect(reader, SHARE.Shared, PROTOCOL.T0orT1);
var apduGetID = new APDUCommand(0xFF, 0xCA, 0, 0, null, 4);
var apduRespGetID = card.Transmit(apduGetID);
long cardId = BitConverter.ToUInt32(apduRespGetID.Data.Reverse().ToArray(), 0);
Run Code Online (Sandbox Code Playgroud)
第二个问题是,然后尝试调试代码,它工作完美,只有删除断点,我可以看到问题,但不是在哪里.有人可以帮帮我吗?
PS我找到了这个帖子,但它不起作用:https://superuser.com/questions/715688/smart-card-errors
更新:这是Transmit类
public override APDUResponse Transmit(APDUCommand ApduCmd)
{
var RecvLength = (uint)(ApduCmd.Le + APDUResponse.SW_LENGTH);
byte[] ApduBuffer;
var ApduResponse = new byte[ApduCmd.Le + APDUResponse.SW_LENGTH];
var ioRequest = new SCard_IO_Request
{
m_dwProtocol = m_nProtocol,
m_cbPciLength = 8
};
// Build the command APDU
if (ApduCmd.Data == null)
{
ApduBuffer = new byte[APDUCommand.APDU_MIN_LENGTH + ((ApduCmd.Le …Run Code Online (Sandbox Code Playgroud) 我正在开发一个使用SUNMSCAPI访问智能卡(电子ID)并检索一些证书的应用程序.
一段时间之前,我可以创建密钥库并签署文件列表,而无需重新创建密钥库,但现在我只能一次签署一个文件.
签署文件列表时,第一个文件正确签名; 在签署第二个文件时,我得到一个"插入智能卡"对话框,正在使用的智能卡是灰色的.
有没有人见过这种行为?
smartcard ×10
java ×3
c# ×2
cryptography ×2
pcsc ×2
.net ×1
api ×1
blackberry ×1
browser ×1
c ×1
c++ ×1
cac ×1
javascript ×1
python ×1
rsa ×1
serial-port ×1
unix ×1
windows ×1