3

私が書いている Java アプリケーションの DoD CAC 登録/認証を許可しようとしています。javax.smartcarioパッケージを使用してカードを読み取ります。正常に接続して GUID を読み取ることができます。探している情報は、カードに記載されているユーザー名です ( LAST.FIRST.M.123456789)。GUID と証明書にアクセスできる次の AID を使用しています。

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

バイト配列が空ではありません。ありがとう!

4

1 に答える 1

1

0x70 タグと 0x71 タグの両方を確認する必要があります。

0x70 には証明書データがあり、0x71 はフォーマットを示します (単純化しすぎると、0 が非圧縮、1 が圧縮 (gzip) になります)。

また、値は単一の 255 バイト バッファを超える可能性があります。X509 の "factory" に渡す有効な byte[] を取得するには、さらに数行のコードが必要です。

于 2014-06-13T04:17:01.670 に答える