2014-05-16 36 views
3

我正在嘗試爲我寫的Java應用程序允許國防部CAC註冊/身份驗證。我正在使用javax.smartcario包來讀取卡。我可以成功連接並讀取GUID。我正在查找的信息是卡上的用戶名(LAST.FIRST.M.123456789)。我使用下面的AID這使我獲得了GUID和證書:國防部CAC ADPU命令

byte[] aid = {(byte) 0xA0, 0x00, 0x00, 0x03, 0x08, 0x00, 0x00, 0x10, 0x00}; 

是否有容納的用戶名卡上不同的應用程序?用戶名以某種方式嵌入證書中?謝謝!

[編輯]

我想基於斷APDU命令響應的證書,但會拋出異常。

// X.509 Certificate for PIV auth command 
byte[] apdu = {0x00, (byte)0xCB, 0x3F, 
      (byte)0xFF, 0x05, 0x5C, 0x03, 0x5F, (byte)0xC1, 0x05}; 
answer = channel.transmit(new CommandAPDU(apdu)); 

CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
X509Certificate cert = (X509Certificate)cf.generateCertificate(
       new ByteArrayInputStream(answer.getBytes())); 

引發以下例外:

java.security.cert.CertificateException: Could not parse certificate: java.io.IOException: Empty input 

字節數組不爲空。謝謝!

+0

字節數組在十六進制中包含什麼?請注意,要獲取響應數據,您需要使用'answer.getData()'而不是'answer.getBytes()',因爲後者也會返回狀態字。 –

回答

1

您必須同時查看0x70和0x71標籤。

0x70具有證書數據,以及0x71告訴您的格式(過於簡化將是0未壓縮和1被壓縮(gzip的))

也值很可能是多單255字節緩衝器。在X509「工廠」中有一個有效的字節[]傳遞之前,您需要多行代碼。

+0

嘿,你有沒有參考使用的壓縮格式? gunzip不喜歡我給它的證書數據。謝謝 – elmarco

+0

啊,我發現使用uncompress()的作品。 – elmarco