这玩意还是挺好玩的


硬件

J3H145 JAVA Card(飞天产, 支持RSA4096,购买链接
笔记本自带安国接触式读卡器(推荐X宝的Rocketek,alibaba的飞天读卡器
额外的接触式读卡器(推荐ACR122U, 若有写卡需求不推荐PN532+IFDNFC)


软件

Global Platform Pro
pcsc-lite
IFD-NFC(如果你用的是PN532)
libfido2
opensc(Windows系统下若不认卡/无法写入则需要安装)
yubico-piv-tool
openssl(生成证书用)
ant(Applet编译工具)
oracle-jdk-8
oracle-javacard-sdk*


Applet

JCAlgTest(用于测试卡片)
u2f-javacard
SmartPGP*
PivApplet


参考资料

自签CA与PKCS12证书生成(PIV使用)
从零开始的 GPG key 与 Yubikey
常见RFID卡片介绍、XX思路 及 Proxmark3简介
PIV Slot


使用方法/注意事项

  1. 卡拿到手就是初始化好的,可以直接写入,如果你使用PN532,抱歉,写入applet会因为超时而重新上电,导致无法正常写入。但是写好后用PN532读是没问题的。
  2. (oracle-javacard-sdk*) 使用ant编译的时候需要设置两个环境变量,JAVA_HOME指向jdk,JC_HOME指向Java Card SDK,JavaCardSDK请务必使用上文提供的sdk,oracle官网的SDK部分applet无法编译,能编译的也无法使用。
  3. PIV中的slot和yubikey一样,在载入证书的时候请确定好slot,slot相关详见上文参考资料,写入slot使用 yubico-piv-tools,如果你使用的不是yubico,请加参数 -r 你的读卡器名字(部分即可)
  4. (smartPGP*) 默认编译的时候只能写入RSA2048的私钥,如果有4096需求,请按照README中修改 SmartPGP/src/fr/anssi/smartpgp 中的 Constants.java,修改参数如下:
for RSA 2048 bits, Constants.INTERNAL_BUFFER_MAX_LENGTH must be at least (short)0x3b0;

for RSA 3072 bits, Constants.INTERNAL_BUFFER_MAX_LENGTH must be at least (short)0x570;

for RSA 4096 bits, Constants.INTERNAL_BUFFER_MAX_LENGTH must be at least (short)0x730.
  1. (smartPGP*) 如果使用openkeychain App, 请写入由master branch所编译的applet
  2. 在Windows中建议使用管理员权限操作
  3. Global Platform Pro常用指令:
    • 设定gp简称:alias gp=java -jar /path/to/gp.jar
    • 查看卡信息:gp -dvi
    • 写入applet:gp --install <APPLETNAME.cap>
    • 卸载applet:gp --uninstall <APPLETNAME.cap>
    • 取消ACR122U的超时:gp -dva ff0041ff00
  4. u2f Applet写入务必使用该脚本,该脚本使用的证书是fido的示例证书。
  5. 测试u2f建议使用WebAuthn - FIDO2 Example