如何在智能卡上执行终端身份验证



我正在尝试使用智能卡电子签名应用程序对文档进行数字签名。这是一张国民身份证,我遵循ICAO 9303TR-03110的规范。如果我没有错的话,在选择eSign应用程序之前,我应该预先执行Terminal Authentication作为Signature Terminal

ICAO 9303中规定:

The following sequence of commands SHALL be used with secure messaging to implement Terminal Authentication:
MSE:Set DST
PSO:Verify Certificate
MSE:Set AT
Get Challenge
External Authenticate
Steps 1 and 2 are repeated for every CV certificate to be verified (CVCA Link Certificates, DV Certificate, Terminal Certificate).

要执行MSE:Set DST,应使用以下APDU

INS - 0x22
P1/P2 - 0x81B6
Data - 0x83 Reference of a public key, ISO 8859-1 encoded name of the public key to be set

这是我不理解的Data部分。我到底需要在那里提供什么?如何查找公钥或其名称?

我到底需要在那里提供什么?如何查找公钥或其名称?

在开始TA之前,您应该确保终端拥有自己的有效CV证书链+正确的私钥:

  1. DV鲸蜡酸酯
  2. 码头IS证书
  3. IS证书对应的私钥

TA的第一步是证书链验证:

  1. 读取EF.CVCA并查找芯片已知的根证书的CHR
  2. 选择一个是终端DV证书的父级证书。EF.CVCA中的CHR必须等于DV证书中的CAR
  3. 发送MSE:使用所选CHR设置DST
  4. 发送PSO:用终端的DV证书验证证书
  5. 发送MSE:用终端DV证书的CHR设置DST(必须等于IS证书的CAR(
  6. 发送PSO:用终端的IS证书验证证书现在芯片知道了终端的公钥,可以用它来验证终端用私钥签名的密码

证书持有者引用(CHR(和证书授权引用(CAR(是编码为字符串值的ID。

JMRTD库可以帮助:

JMRTD:一个开放源代码Java实现的机器可读旅行证件

简单来说,完成终端身份验证的步骤如下

  • 第一个IS(检验系统(将终端证书链发送到IC(芯片(
  • IC验证证书链并提取终端的公钥
  • IC向终端发送质询
  • IS用其私钥签署挑战
  • IC验证签名

通过这种方式,IC对终端进行身份验证,并授予对敏感数据组的访问权限。

最新更新