使用GPShell向带DM权限的SSD写入RSA公钥失败及APDU格式困惑
解决GPShell写入DM RSA公钥的6A86错误及相关疑问
我来帮你一步步拆解这些问题,结合Global Platform规范和工具使用经验,整理如下:
一、排查6A86(P1/P2参数错误)的核心原因
返回6A86本质是命令的P1/P2参数不符合卡片的预期,常见触发场景和排查点:
- GPShell脚本参数错误:导入DM RSA公钥的标准APDU是
80 DA P1 P2 Lc Data,其中P1应设为0x00(表示导入公钥类型),P2通常设为0x00(默认密钥版本)。如果你的put_dm_keys命令填错了这两个参数,就会直接返回6A86。 - 未正确选中目标SSD:执行
put_dm_keys前必须用select -AID <你的SSD_AID>切换到目标安全域,如果误选中主域或其他SSD,参数逻辑不匹配也会触发错误。 - 密钥类型不匹配:DM权限的SSD需要导入的是RSA公钥作为验证密钥,若GPShell命令误指定为对称密钥类型(比如MAC/ENC密钥),也会导致参数校验失败。
二、Global Platform密钥传输格式(Format1/Format2)解析
根据Global Platform Card Specification v2.2+的定义,密钥传输分为两种格式:
- Format1(明文传输):格式为
0x01 + 密钥长度 + 密钥明文HEX,适用于公钥这类无需保密的场景(比如DM验证公钥),测试环境下用这个最省心。 - Format2(加密传输):格式为
0x02 + 加密后密钥长度 + 加密密钥密文(含CMAC校验),需要用当前域的ENC密钥加密后传输,适合生产环境的对称密钥导入,公钥一般不需要用这个。
三、RSA公钥转HEX的正确姿势
你需要把OpenSSL生成的公钥转换为DER编码的纯十六进制字符串,步骤如下:
- 先将PEM格式公钥转成DER二进制格式:
openssl rsa -in your_pubkey.pem -pubout -outform der -out pubkey.der - 将DER文件转成无空格的HEX字符串:
注意:绝对不能包含PEM的头/尾标识(xxd -p -c 2000 pubkey.der > pubkey.hex-----BEGIN PUBLIC KEY-----这类),必须是纯DER编码的二进制转HEX。
四、用Global Platform Pro(GPP)加载DM RSA公钥
完全可以用GPP完成这个操作,而且比GPShell更简洁,命令示例如下:
假设你的SSD AID是A000000151000000,RSA公钥的HEX文件是pubkey.hex,密钥类型为DM_RSA_PUB(对应GP规范的委托管理验证公钥):
java -jar gp.jar --put-key A000000151000000 --key DM_RSA_PUB --file pubkey.hex
如果需要指定密钥版本,加上--key-version 01参数即可。
内容的提问来源于stack exchange,提问作者Roman Gr.
相关产品推荐
相关产品推荐

