在JavaCard中安装小应用程序

8
我通过Eclipse制作了一个流行的“Hello World” javacard代码的.cap文件。现在我想通过GPShell和ACR38智能卡读卡器将其加载到真实的javacard中。
问题:我需要任何密钥才能将.cap文件加载到智能卡上吗?我的意思是,在上传我的应用程序之前,我是否需要进行身份验证,或者这不是必要的? 我认为进行身份验证是必须的。未经身份验证上传.cap是不合理的。但是我不知道如何进行身份验证。 问题:这有什么问题吗?
C:\Users\ghasemi>java -jar e:\gpj\gpj.jar -load e:\helloWorld.cap -install
Found terminals: [PC/SC terminal ACS CCID USB Reader 0]
javax.smartcardio.CardException: connect() failed
        at sun.security.smartcardio.TerminalImpl.connect(Unknown Source)
        at net.sourceforge.gpj.cardservices.GlobalPlatformService.main(Unknown S
ource)
Caused by: sun.security.smartcardio.PCSCException: SCARD_E_SHARING_VIOLATION
        at sun.security.smartcardio.PCSC.SCardConnect(Native Method)
        at sun.security.smartcardio.CardImpl.<init>(Unknown Source)
        ... 2 more
Found card in terminal: ACS CCID USB Reader 0
java.lang.NullPointerException
        at net.sourceforge.gpj.cardservices.GlobalPlatformService.main(Unknown S
ource)

C:\Users\ghasemi>java -jar e:\gpj\gpj.jar -load e:\helloWorld.cap -install

Found terminals: [PC/SC terminal ACS CCID USB Reader 0]

Found card in terminal: ACS CCID USB Reader 0

ATR: 3B 7F 94 00 00 80 31 80 65 B0 85 02 02 ED 12 0F FF 82 90 00

DEBUG: Command  APDU: 00 A4 04 00 07 A0 00 00 01 51 00 00

DEBUG: Response APDU: 6A 82

Failed to select Security Domain GP211 A0 00 00 01 51 00 00 , SW: 6A 82
DEBUG: Command  APDU: 00 A4 04 00 08 A0 00 00 00 18 43 4D 00

DEBUG: Response APDU: 6F 65 84 08 A0 00 00 00 18 43 4D 00 A5 59 73 4A 06 07 2A 8
6 48 86 FC 6B 01 60 0C 06 0A 2A 86 48 86 FC 6B 02 02 01 01 63 09 06 07 2A 86 48
86 FC 6B 03 64 0B 06 09 2A 86 48 86 FC 6B 04 01 05 65 0B 06 09 2B 85 10 86 48 64
 02 01 03 66 0C 06 0A 2B 06 01 04 01 2A 02 6E 01 02 9F 6E 06 12 91 20 11 02 02 9
F 65 01 FF 90 00

Successfully selected Security Domain GemaltoXpressPro A0 00 00 00 18 43 4D 00
DEBUG: Command  APDU: 80 50 00 00 08 17 2A 53 4F AC DF 8D 16

DEBUG: Response APDU: 69 82

javax.smartcardio.CardException: Wrong initialize update, SW: 69 82
        at net.sourceforge.gpj.cardservices.GlobalPlatformService.openSecureChan
nel(Unknown Source)
        at net.sourceforge.gpj.cardservices.GlobalPlatformService.main(Unknown S
ource)

tnx


你确定你的卡片安全域是:A0 00 00 00 18 43 4D 00 吗?你使用的是什么类型的卡片? - Kamen Goranchev
1
@KamenGoranchev 它返回了 90 00,是吗?我猜你可以检查一下 A0 00 00 00 18 是否是 Gemalto 的 RID,但我猜它就是。 - Maarten Bodewes
3个回答

3

响应代码6A 82用于Security_Status_Not_Satisfied

选择Security Domain时,此状态字可能由以下两个原因之一引起:

  • 卡的Life Cycle State (CLCS)LOCKEDTERMINATED,因此不允许选择Security Domain,因为如果CLCS为LOCKED,则只能选择具有Card Lock权限的安全域和/或应用程序,并且如果CLCS为TERMINATED,则仅处理GET DATA命令,所有其他命令都将被禁用并返回错误。如果CLCS为LOCKED,请尝试选择具有Card Lock权限的安全域和/或应用程序,并使用SCP session命令帮助将卡生命周期状态(CLCS)移动到SECURED,否则如果CLCS为TERMINATED,则无法切换回SECURED,因为此状态是不可逆的。

  • 或者您尝试选择的Security Domain本身处于LOCKED状态,在这种情况下,该Security Domain可能会被阻止进一步选择,OPEN并返回错误状态字。

@CLCS-卡片生命周期状态。

很乐意帮助。


2
您应该了解智能卡的全局平台状态。6982是一个常见的状态字,表示“安全状态未满足”,这意味着您的智能卡可能处于错误的状态(例如,全局平台已锁定或终止状态)。
也有可能是因为您使用了无效的全局平台密钥集,或者密钥不可用。
请联系智能卡供应商了解智能卡状态和应该使用哪些密钥。

PS 不确定,但可能与委托或隐式身份验证有关。再次,请向提供者询问。 - Maarten Bodewes
这不更像是卡片或安全域处于LOCKED或TERMINATED状态吗?否则,它应该至少接受在SCP01中初始化更新命令... - Michael Roland
1
@Michael Roland 是的,问题中已经提到了。它没有放在最前面是因为我不确定那是否是最可能的原因。这张卡似乎没有使用正常的卡管理器(或者隐藏在旧的A0000000030000 AID后面)。 (根据您的评论修改的答案) - Maarten Bodewes

1

Card Manager AID显示它是一张Gemalto XPresso卡。 该卡的默认卡为47454d5850524553534f53414d504c45 尝试设置这些键。 如果不起作用,说明卡片已更改CM密钥或卡片可能已被锁定。 请注意,使用错误的密钥尝试太多次进行身份验证可能会锁定卡片。


1
亲爱的保罗,你确定这些密钥是默认密钥吗?我认为40414243444546448494A4B4C4D4E4F才是默认密钥!顺便说一下,我在“JCManager”中尝试了两种密钥,都没有成功! - Ebrahim Ghasemi
重新查看调试输出,我认为你可以尝试使用存储在P1中的另一个密钥号进行init-update,例如01。如果这不起作用,我认为卡可能已被锁定。 - Paul Bastian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接