从通用浏览器(通过http(s)连接到服务器),最好是从Javascript访问本地智能卡的可能的客户端架构有哪些,最终用户的安装麻烦最少?服务器需要能够至少向卡发出其选择的APDU(或者可能将其中的一部分委托给它生成的客户端代码).我假设在工作PC/SC堆栈的客户端可用,配有智能卡读卡器.自XP,现代OS X和Unix以来,至少在Windows上这是一个合理的假设.
到目前为止,我已确定了以下选项:
javax.smartcardio.从功能的角度来看,这很好,有充分的记录,我可以忍受一些已知的错误,但我害怕在接受Java-as-a-browser-extension时不可抗拒的向下螺旋.还有其他想法吗?
另外:是否有某种方法可以防止浏览器滥用浏览器所拥有的任何PC/SC接口(例如,提供3个错误的PIN来阻止卡片,只是为了它的肮脏;或者制造一些更邪恶的东西).
我正在尝试使用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) 我在Electron里面有一个Angular2应用程序.现在,我想使用该@pokusew/pcsclite库来使用NFC功能.该库使用本机Node.js模块.
当我尝试在我的component.ts中要求库时,如下所示:
declare var pcsclite: any;
var pcsclite = require('../../../node_modules/@pokusew/pcsclite/');
Run Code Online (Sandbox Code Playgroud)
我得到并且错误说:
错误TS6143:模块'../ ..'被解析为'../../lib/pcsclite.js',但未设置' - allowJs'.
另一方面,如果我尝试通过index.html中的<\ script> -Tag导入库,我会收到一条错误消息:
ZoneAwareError错误:找不到绑定文件.尝试:...
最后,如果我var pcsclite = require('@pokusew/pcsclite');在main.js,那么它可以工作,但是我无法从我的Angular应用程序中访问它.
我们已经购买了用于NFC测试的ACR122 USB SDK.我们想为ACR122U-A2 NFC读卡器构建测试桌面应用程序.我们正在Microsoft Windows 7平台上用Java开发它.
我们希望为了使用Winscard.dll中的PC/SC,我们需要进行JNI调用.为了做到这一点,应该准备用于JNI调用的C/C++包装器库.
我认为这应该是SDK的一部分,因为示例应用程序引用了JNI包装器Jacspcsc.dll,但是库不存在.有没有类似的经历?Winscard.dll是否有可用的JNI包装器?
谢谢STeN
我正在开发一个smartcardio用于处理智能卡的Java应用程序.必须有一个可以移除其USB读卡器,然后再次插入它而无需再次启动小程序.
我正在使用terminals()和waitForChange()方法来检测终端更改,它在Linux,MacOS和Win7上运行良好.
但是在Windows 8(仅限Windows 8)上,删除最后一个终端后,这些方法抛出一个SCARD_E_NO_SERVICE CardException,并且不再检测到任何更改.
我不确定它所说的"服务"是什么.但是当我打电话TerminalFactory.getDefault()给一个TerminalFactory单身人士时,我认为这是在我的主题中启动的.而且我认为这个单例可能有办法管理底层服务,这就是被打破的.
有没有人smartcardio在Windows 8 上如何管理终端断开?
我正在尝试向智能卡发送命令.我使用Gemalto IDBridge CT30(PC TWIN阅读器)和通过USB连接到Android设备的IDBridge K30.
我尝试通过USB发送SELECT APDU命令:
boolean claim = openedConnection.claimInterface(usbInterface, true);
byte[] data = new byte[]{
(byte) 0x00, (byte) 0xA4, (byte) 0x04, (byte) 0x0C,
(byte) 0x07, (byte) 0xA0, (byte) 0x00, (byte) 0x00,
(byte) 0x01, (byte) 0x18, (byte) 0x45, (byte) 0x4E};
Run Code Online (Sandbox Code Playgroud)
之后我收到了答案:
final int dataTransferred = this.openedConnection.bulkTransfer(endPointOut, data, data.length, TIMEOUT_MS);
if(!(dataTransferred == 0 || dataTransferred == data.length)) {
throw new Exception("Error durring sending command [" + dataTransferred + " ; " + data.length + "]"); //$NON-NLS-1$ …Run Code Online (Sandbox Code Playgroud) 我已经检查了MIFARE Ultralight和TOPAZ/Jewel IC标签的编程接口.API很好地描述了如何在卡上保存字节,如何寻址存储器块,如何进行所有操作,如读取,读取,使用OTP(一次性可编程)功能,如何读取ROM字节,如何从空闲切换到就绪状态(REQA,WUPA命令),它表示命令是否受CRC保护,如何访问标签UID等.
当我开始编程NFC阅读器(ACR122U或SCL010)时,我发现PCD(阅读器)和PICC(标签)之间的所有通信都是从ATR(应答复位)命令开始的,这是在Internet上所描述的命令PCD发送给PICC用于识别目的.
但是没有一个标签文档提到ATR命令 - 所有与标签通信时的通信(PQR)都以REQA,WUPA命令开始,以便将卡切换到就绪模式.
我的理解是ATR是由PC/SC基于读卡器与之通信的NFC卡构建的.一旦读者检测到基于它的标签是什么类型的技术,就会创建ATR.另外根据文档,针对不同NFC读取器的ATR对于相同的NFC标签是不同的.
我对吗?PC/SC是否构建了ATR?
BR STeN
如果读卡器中没有卡,我在获取PCSC阅读器序列号时遇到问题.我正在使用winscard.dll和c ++.
以下代码仅适用于读卡器中存在卡的情况.否则,不会检索SCardHandle.我还没有找到任何其他方法来获得SCardHandle.
SCARDHANDLE hCardHandle;
SCARDCONTEXT hSC;
WCHAR pCardReaderName[256];
LONG lReturn;
lReturn = SCardEstablishContext(SCARD_SCOPE_USER, 0, 0, &hSC);
if (lReturn != SCARD_S_SUCCESS)
{
Console::WriteLine("SCardEstablishContext() failed\n");
return;
}
my_select_reader(hSC, pCardReaderName); // just shows reader names in console and requires you to pick one
// connect to smart card
DWORD dwAP;
lReturn = SCardConnect( hSC,
(LPCWSTR)pCardReaderName,
SCARD_SHARE_SHARED,
SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1 | SCARD_PROTOCOL_RAW,
&hCardHandle,
&dwAP );
if ( SCARD_S_SUCCESS != lReturn )
{
Console::WriteLine("Failed SCardConnect\n");
exit(1); // Or other appropriate action.
}
// get …Run Code Online (Sandbox Code Playgroud) 我试图通过HID OMNIKEY 5427 CK通过APDUs命令来操作MIFARE卡即.Ultralight C卡,在使用WinSCard.dll的Windows 10 x64 OS环境中.(我在NXP NDA下并且可以完全访问他们的文件)
我试图在网上找到信息好几天了.除了2pages手册之外,似乎没有该模型的已发布文档.
像GetUID(FFCA000000)这样的简单命令是可以的,我可以取回实际的卡UID.
但对于"使用卡进行身份验证",来自HID 5421模型的参考文档说我应该从OpenGenericSession(FFA0000703010001)开始,我试过了,读者总是用6D00h回复(错误)
我试过直接发送验证命令'1Ah + 00h'(FFA00005080100F30000641A0000),读者也总是回复错误代码.
我对HID 5421型号有经验,而且很直接,不知道为什么这款5427不像它的兄弟.
是的,我联系了HID支持.没运气.我没有从他们那里获得有用的信息.
如果有任何想法或有5427软件开发指南请帮忙.我现在已经把头发拉了近一个星期.
下午全部
我们有一个在Windows Server上运行的应用程序,需要多达50个智能卡才能连接到主机应用程序服务器.
这对我们现有的Server 2003/2008安装没有任何问题.
但是,当我们来测试Server 2012 R2上的应用程序时,只会显示10个智能卡.所有USB设备都能正确识别,但我们的pcsc测试应用程序只能找到10个终端.
有没有人遇到过这个问题?任何已知的修复?
干杯
加文