智能卡:使用APDU命令获取证书内容

4
我正在处理Gemalto智能卡,并尝试获取存储在其中的两个证书的内容。为此,我已经成功发送了多个APDU命令。但是,我从未找到我的证书内容。
首先,我获取ODF(对象目录文件):
00 A4 00 0C 02 50 31
00 B0 00 00 3C

我得到了以下响应:
A0 06 30 04 04 02 70 02 A1 06 30 04 04 02 70 04 A4 06 30 04 04 02 70 05 A7 06 30 04 04 02 70 06 A8 06 30 04 04 02 70 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90 00

现在,我已获取了CDF(证书目录文件):
00 A4 00 00 02 70 05
00 B0 00 00 E7

我获得了以下响应:
30 6D 30 3D 0C 1B 43 65 72 74 69 66 69 63 61 74 20 53 69 67 6E 61 74 75 72 65 20 49 47 43 2D 43 41 03 02 06 40 30 1A 30 06 03 02 07 80 05 00 30 07 03 02 06 40 04 01 C1 30 07 03 02 04 10 04 01 C1 30 22 04 20 34 63 33 38 38 64 34 31 38 65 39 37 33 39 66 61 30 31 34 65 62 66 35 61 39 38 64 31 32 31 36 35 A1 08 30 06 30 04 04 02 B0 01 30 74 30 44 0C 22 43 65 72 74 69 66 69 63 61 74 20 41 75 74 68 65 6E 74 69 66 69 63 61 74 69 6F 6E 20 49 47 43 2D 43 41 03 02 06 40 30 1A 30 06 03 02 07 80 05 00 30 07 03 02 06 40 04 01 C1 30 07 03 02 04 10 04 01 C1 30 22 04 20 66 34 62 66 65 35 35 34 64 37 65 39 35 36 31 38 35 39 61 38 31 62 65 65 66 36 62 35 36 39 32 33 A1 08 30 06 30 04 04 02 B0 02 FF FF 90 00

当我将上面的响应从十六进制转换为ASCII码(http://www.rapidtables.com/convert/number/hex-to-ascii.htm),我可以读取我的两个证书名称,后跟一个难以理解的字符串。例如:
第一张证书: 证书名称: "Certificat Signature IGC-CA" 难以理解的字符串: 4c388d418e9739fa014ebf5a98d12165
第二张证书: 证书名称: "Certificat Authentification IGC-CA" 难以理解的字符串: f4bfe554d7e9561859a81beef6b56923
因此,我认为可以获取到所有证书的内容,但是如何做到呢?"难以理解的字符串"包含哪些信息?
3个回答

3
你收到的证书目录文件响应是一系列以DER标签-长度-值编码格式表示的证书。你可以根据PKCS#15规范中描述的ASN.1符号进行解码。
30 6D
-> x509Certificate PKCS15Object SEQUENCE
    30 3D
    -> commonObjectAttributes CommonObjectAttributes SEQUENCE
        0C 1B
        -> label Label UTF8String
            43 65 72 74 69 66 69 63  61 74 20 53 69 67 6E 61
            74 75 72 65 20 49 47 43  2D 43 41
            -> "Certificat Signature IGC-CA"
        03 02
        -> flags CommonObjectFlags BIT STRING
            06 40
            -> "01------" (private = 0, modifiable = 1)
        30 1A
        -> accessControlRules SEQUENCE OF AccessControlRule
            30 06
            -> AccessControlRule SEQUENCE
                03 02
                -> accessMode AccessMode BIT STRING
                     07 80
                     -> "1-------" (read = 1)
                05 00
                -> SecurityCondition NULL 
            30 07
            -> AccessControlRule SEQUENCE
                03 02
                -> accessMode AccessMode BIT STRING
                    06 40
                    -> "01------" (read = 0, update = 1)
                04 01
                -> securityCondition.authId Identifier OCTET STRING
                    C1
            30 07
            -> AccessControlRule SEQUENCE
                03 02
                -> accessMode AccessMode BIT STRING
                    04 10
                    -> "0001----" (read = 0, update = 0, execute = 0, ??? = 1)
                04 01
                -> securityCondition.authId Identifier OCTET STRING
                    C1
    30 22
    -> classAttributes CommonCertificateAttributes SEQUENCE
        04 20
        -> iD Identifier OCTET STRING
            34 63 33 38 38 64 34 31  38 65 39 37 33 39 66 61
            30 31 34 65 62 66 35 61  39 38 64 31 32 31 36 35
    }
    A1 08
    -> typeAttributes [1]
        30 06
        -> X509CertificateAttributes SEQUENCE
            30 04
            -> value.indirect.path Path SEQUENCE
                04 02
                -> path OCTET STRING
                    B0 01
                    -> ISO/IEC 7816-4 file identifier "B001"
30 74
-> x509Certificate PKCS15Object SEQUENCE
    30 44
    -> commonObjectAttributes CommonObjectAttributes SEQUENCE
        0C 22
        -> label Label UTF8String
            43 65 72 74 69 66 69 63  61 74 20 41 75 74 68 65
            6E 74 69 66 69 63 61 74  69 6F 6E 20 49 47 43 2D
            43 41
            -> "Certificat Authentification IGC-CA"
        03 02
        -> flags CommonObjectFlags BIT STRING
            06 40
            -> "01------" (private = 0, modifiable = 1)
        30 1A
        -> accessControlRules SEQUENCE OF AccessControlRule
            30 06
            -> AccessControlRule SEQUENCE
                03 02
                -> accessMode AccessMode BIT STRING
                     07 80
                     -> "1-------" (read = 1)
                05 00
                -> SecurityCondition NULL 
            30 07
            -> AccessControlRule SEQUENCE
                03 02
                -> accessMode AccessMode BIT STRING
                    06 40
                    -> "01------" (read = 0, update = 1)
                04 01
                -> securityCondition.authId Identifier OCTET STRING
                    C1
            30 07
            -> AccessControlRule SEQUENCE
                03 02
                -> accessMode AccessMode BIT STRING
                    04 10
                    -> "0001----" (read = 0, update = 0, execute = 0, ??? = 1)
                04 01
                -> securityCondition.authId Identifier OCTET STRING
                    C1
    30 22
    -> classAttributes CommonCertificateAttributes SEQUENCE
        04 20
        -> iD Identifier OCTET STRING
            66 34 62 66 65 35 35 34  64 37 65 39 35 36 31 38
            35 39 61 38 31 62 65 65  66 36 62 35 36 39 32 33
    A1 08
    -> typeAttributes [1]
        30 06
        -> X509CertificateAttributes SEQUENCE
            30 04
            -> value.indirect.path Path SEQUENCE
                04 02
                -> path OCTET STRING
                    B0 02
                    -> ISO/IEC 7816-4 file identifier "B002"

因此,该列表为您提供了包含实际证书的文件标识符:

  • B001代表第一个证书(名为“Certificat Signature IGC-CA”),以及
  • B002代表第二个证书(名为“Certificat Authentification IGC-CA”)。

然后,您可以选择这些文件:

00 A4 00 0C 02 <FILE ID>

使用“读取二进制”命令从文件中读取数据。

1
经过多次搜索和尝试,我终于成功获取了两个证书的内容。事实上,在“难以理解的字符串”中,每个证书都有一个FID。在我的例子中,路径是“B0 01”和“B0 02”。因此,当我执行以下APDU命令时,我获得了证书的内容:
选择文件:00 A4 00 0C 02 B0 01
要获取一个证书的全部内容:
获取响应: 00 B0 00 19 E7 00 B0 01 19 E7 00 B0 02 19 E7 00 B0 03 00 04
不幸的是,我还没有理解CDF响应的含义!

0

在所有情况下,您都从相应的文件中读取E7个字节,这可能是完整数据,也可能不是完整数据。因此,您可以查看SELECT响应数据(为此,您需要将P2更改为零并提供一个LE字节)以查找完整大小,或者您只需增加重复读取的起始偏移量,直到出现错误。

请注意,存储在卡上的证书从卡的角度来看只是任意数据。因此,您的问题不再是智能卡特定的问题,而是缺少证书结构描述。


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