RSP与eIM系统中签名验证过程与证书的使用

每次都是这样,没有例外‌,在最需要有人依靠的时候,往往最后都是自己一个人挺过去

Posted by yishuifengxiao on 2026-05-21

核心概念与概览

这些签名都是用于保障eSIM远程配置与管理流程中数据的完整性 (Integrity)真实性 (Authenticity)抗抵赖性 (Non-repudiation)。它们通过非对称加密(ECDSA算法)实现,由发送方使用私钥签名,接收方使用公钥验签。

不同签名的作用对象(被签名的数据)生成方验签方各不相同,共同构成了一个复杂的信任链。

详细对比表格

签名名称 作用 生成方 验签方 主要应用场景
euiccSignEPE 证明eUICC在处理eUICC Package时发生了错误,并保证错误信息的完整性和来源。 eUICC eIM eUICC Package执行错误时,生成错误报告。
euiccSignEPR 证明eUICC成功处理了eUICC Package,并保证执行结果的完整性和来源。 eUICC eIM eUICC Package执行成功后,返回结果报告。
smdpSignature2 证明SM-DP+已经认证了eUICC,并确保后续下载流程的绑定。 SM-DP+ eUICC Profile下载流程中的PrepareDownload阶段。
serverSignature1 证明RSP Server(SM-DP+或SM-DS)的身份,并确保认证挑战等信息的完整性。 SM-DP+ / SM-DS eUICC 共同相互认证 (CMAP) 的初始阶段。
euiccCancelSessionSignature 证明取消会话的请求确实来自eUICC,并确保取消原因等信息的完整性。 eUICC SM-DP+ 取消正在进行的RSP会话(如Profile下载)。
euiccNotificationSignature 证明通知(非Profile安装结果)确实来自eUICC,并保证其内容完整。 eUICC SM-DP+ / SM-DS 发送其他类型的通知(如用户取消、操作失败等)。
euiccSignPIR 证明Profile安装结果确实来自eUICC,并保证其内容完整。 eUICC SM-DP+ 通知Profile安装成功或失败的结果。
euiccSignature1 eUICC在CMAP中向RSP Server证明自己的身份,并回应挑战。 eUICC SM-DP+ / SM-DS 共同相互认证 (CMAP) 中的eUICC认证步骤。
euiccSignature2 eUICC确认PrepareDownload请求,并绑定一次性密钥,确保后续Profile下载的安全性。 eUICC SM-DP+ Profile下载流程中的PrepareDownload阶段。
eimSignature 证明eUICC Package确实来自关联的eIM,并确保其内容的完整性和新鲜度(防重放)。 eIM eUICC eIM发送eUICC Package(包含PSMOs/eCOs)给eUICC。

详细说明与版本差异

euiccSignEPEeuiccSignEPR

  • 作用与区别:这两个签名是eUICC在处理完eIM下发的eUICC Package后,向eIM返回结果时使用的。euiccSignEPR 用于成功结果euiccSignEPE 用于错误结果

  • 生成方式:eUICC使用其私钥 SK.EUICC.ECDSA对特定数据(euiccPackageResultDataSigned /euiccPackageErrorDataSigned +associationToken)进行签名。

  • 生成方eUICC

  • 验签方eIM。eIM使用从 CERT.EUICC.ECDSA 中提取的公钥 PK.EUICC.ECDSA 进行验证。

euiccCancelSessionSignature

  • 作用:eUICC用于授权取消一个正在进行的RSP会话。
  • 生成方式:eUICC使用其私钥 SK.EUICC.ECDSAeuiccCancelSessionSigned 数据对象(包含 TransactionID, smdpOid, reason)进行签名。
  • 生成方eUICC
  • 验签方SM-DP+。SM-DP+使用与该RSP会话关联的 PK.EUICC.ECDSA 进行验证。同时,SM-DP+还会验证返回的OID与自己的证书OID是否一致。

euiccNotificationSignatureeuiccSignPIR

  • 作用与区别:两者都是eUICC生成的、用于通知外部实体(如SM-DP+)的签名。

    • euiccNotificationSignature 用于通用通知,其对 tbsOtherNotification 数据签名。
    • euiccSignPIR 用于Profile安装结果通知,其对 ProfileInstallationResultData 数据签名。
  • 生成方式:eUICC使用其私钥 SK.EUICC.ECDSA 对各自的数据对象进行签名。

  • 生成方eUICC

  • 验签方SM-DP+ 或 SM-DS。接收方使用从 CERT.EUICC.ECDSA 中提取的公钥 PK.EUICC.ECDSA 进行验证。

euiccSignature1euiccSignature2

  • 作用与区别:这两个是eUICC在Profile下载流程中使用的关键签名。

    • euiccSignature1 在CMAP中生成,用于向RSP Server证明自己的身份。
    • euiccSignature2PrepareDownload阶段生成,用于确认下载请求,并绑定一个一次性密钥对(otPK.EUICC.ECKA),确保后续的Bound Profile Package只能由该eUICC解密。
  • 生成方式:

    • euiccSignature1:eUICC使用私钥 SK.EUICC.ECDSAeuiccSigned1 数据签名。
    • euiccSignature2:eUICC使用私钥 SK.EUICC.ECDSAeuiccSigned2smdpSignature2 的拼接数据签名。
  • 生成方eUICC

  • 验签方SM-DP+。SM-DP+使用 PK.EUICC.ECDSA 进行验证。

smdpSignature2

  • 作用:在SM-DP+完成对eUICC的认证后,生成此签名,用于向eUICC证明其身份,并绑定后续的Profile下载流程。
  • 生成方式:SM-DP+使用其Profile绑定私钥 SK.DPpb.ECDSAsmdpSigned2euiccSignature1 的拼接数据进行签名。
  • 生成方SM-DP+
  • 验签方eUICC。eUICC使用从 CERT.DPpb.ECDSA 中提取的公钥 PK.DPpb.ECDSA 进行验证,并同时验证 CERT.DPpb.ECDSA 和认证证书 CERT.DPauth.ECDSA 属于同一所有者。

serverSignature1

  • 作用:在CMAP的第一步,RSP Server(SM-DP+或SM-DS)向eUICC证明自己的身份。
  • 生成方式:RSP Server使用其认证私钥(如 SK.DPauth.ECDSA)对 serverSigned1 数据对象(包含 TransactionID, euiccChallenge, serverChallenge, SM-XX Address 等)进行签名。
  • 生成方SM-DP+ 或 SM-DS
  • 验签方eUICC。eUICC使用从 CERT.DPauth.ECDSA 中提取的公钥进行验证。

eimSignature

  • 作用:这是eIM管理eUICC Package的核心机制,用于保证下发给eUICC的指令(PSMOs/eCOs)的完整性和来源可信。

  • 生成方式:eIM使用其私钥 SK.EIM.ECDSAeuiccPackageSignedassociationToken的拼接数据进行签名。

    • euiccPackageSigned 数据对象包含 eimId, eidValue, counterValue, 可选的 eimTransactionId, 以及 euiccPackage
  • 如果eIM配置数据中没有配置associationToken,则使用一个值为零的associationToken(即 '84 01 00')进行拼接和签名。

  • 生成方eIM

  • 验签方eUICC。eUICC使用从eIM配置数据中获取的 PK.EIM.ECDSA 进行验证,并检查 EIDcounterValue 以防止重放攻击。

总结与关键点

  1. 信任根:这些签名最终都依赖于一个可信的根证书颁发机构(CI),因为所有实体的证书(如 CERT.EUICC.ECDSA, CERT.DPauth.ECDSA, CERT.EIM.ECDSA)都是通过CI证书链进行验证的。
  2. 签名算法:几乎所有签名都使用 ECDSA 算法,在 SGP.22 v3.0/v3.1 中,部分签名数据对象名称中的 ECDSA 被替换为 SIG(如 CERT.DPauth.SIG, SK.EUICC.SIG),但底层仍是ECDSA,这主要是为了在规范中更清晰地表示该密钥用于签名(Signing)而非密钥协商(Key Agreement)。
  3. associationToken 的作用:为euiccSignEPR/euiccSignEPE 签名数据的一部分。它充当了eIM和eUICC之间的一个“关联令牌”,进一步增强了安全性。
  4. counterValue 的作用eimSignatureeuiccPackageSigned 中包含 counterValue,这是一个由eIM维护的递增计数器,用于防止重放攻击。eUICC会检查接收到的counterValue是否大于之前存储的值。

eUICC 如何获取 PK.EIM.ECDSA

eUICC获取eIM公钥(PK.EIM.ECDSA)的机制,主要依赖于eIM配置数据(EimConfigurationData)的预配置和存储,并非通过动态在线获取。

流程与步骤:

  1. 预配置:eIM的公钥信息(PK.EIM.ECDSA或包含该公钥的CERT.EIM.ECDSA)作为eIM配置数据(EimConfigurationData)的一部分,预先配置并存储在eUICC中。
  2. 存储:eUICC中存储的EimConfigurationData数据结构包含eimPublicKeyPK.EIM.ECDSA)或eimCertificateCERT.EIM.ECDSA)字段,同时包含eimId(用于标识关联的eIM)。
  3. 读取:当eUICC收到来自eIM的eUICC Package(包含eimSignature)时,eUICC会使用euiccPackageSigned中的eimId来检索其存储的eIM配置数据,从而获取对应的PK.EIM.ECDSA
  4. 验签:eUICC使用检索到的PK.EIM.ECDSA来验证eimSignature

关键数据结构(来自SGP.32 v1.1):

EimConfigurationData ::= SEQUENCE {
eimId [0] UTF8String (SIZE(1..128)), -- eimId of eIM
eimFqdn [1] UTF8String OPTIONAL, -- FQDN of eIM or intermediate server, if used
eimIdType [2] EimIdType OPTIONAL,
counterValue [3] INTEGER OPTIONAL, -- initial counterValue for the eIM
associationToken [4] INTEGER OPTIONAL,
eimPublicKeyData [5] CHOICE {
eimPublicKey SubjectPublicKeyInfo, -- public key of eIM, used for eUICC Package signature verification, where the encoding follows X.509 standard
eimCertificate Certificate -- certificate of eIM, used for eUICC Package signature verification, where the encoding follows X.509 standard
} OPTIONAL,
trustedPublicKeyDataTls [6] CHOICE {
trustedEimPkTls SubjectPublicKeyInfo, -- public key of eIM, used for TLS or DTLS, where the encoding follows X.509 standard
trustedCertificateTls Certificate -- either the certificate of eIM, used for (D)TLS, or the certificate of the CA, where the encoding follows X.509 standard
} OPTIONAL,
eimSupportedProtocol [7] EimSupportedProtocol OPTIONAL,
euiccCiPKId [8] SubjectKeyIdentifier OPTIONAL, -- CI Public Key Identifier supported on the eUICC for signature creation
indirectProfileDownload[9] NULL OPTIONAL -- support of Indirect Profile download with indicated EimSupportedProtocol
}

总结:eUICC是通过本地预配置的eIM配置数据获取PK.EIM.ECDSA的,而不是通过在线接口动态获取。


eIM 平台如何获取 CERT.EUICC.ECDSA

eIM平台获取eUICC证书(CERT.EUICC.ECDSA)的机制,发生在eIM包检索过程直接配置文件下载的认证流程中。

主要流程(通过IPA间接获取):

  1. eUICC提供证书:在eUICC与IPA(LPA)交互的ES10b.AuthenticateServer过程中,eUICC会生成AuthenticateServerResponse,其中包含:
    • euiccSigned1(签名数据)
    • euiccSignature1(eUICC使用SK.EUICC.ECDSA生成的签名)
    • euiccCertificateCERT.EUICC.ECDSA
    • eumCertificate(CERT.EUM.ECDSA)
  2. IPA转发给eIM:IPA收到eUICC的响应后,在调用ESipa.AuthenticateClient函数时,将euiccCertificate(即CERT.EUICC.ECDSA)和eumCertificate一并转发给eIM。
  3. eIM存储:eIM接收到这些证书后,将其存储在本地,用于后续的验证(如验证euiccSignEPR/euiccSignEPE)。

关键代码片段(来自SGP.32 v1.1):

AuthenticateResponseOk ::= SEQUENCE {
euiccSigned1 EuiccSigned1, -- Signed information
euiccSignature1 [APPLICATION 55] OCTET STRING, -- EUICC_Sign1
euiccCertificate Certificate, -- eUICC Certificate (CERT.EUICC.ECDSA)
eumCertificate Certificate -- EUM Certificate (CERT.EUM.ECDSA)
}

IPA调用ESipa.AuthenticateClient时的输入

IPA calls ESipa.AuthenticateClient function comprising:
euiccSigned1 or compactEuiccSigned1,
euiccSignature1,
optionally CERT.EUM.ECDSA, -- 可选
optionally CERT.EUICC.ECDSA -- 可选

注意:如果IPA具有minimizeEsipaBytes能力且未提供CERT.EUICC.ECDSA,eIM需要根据收到的euiccSigned1euiccSignature1等信息,通过其他方式(如eIM内部存储或从CI查询)获取证书。

总结:eIM是通过IPA作为中介,在认证流程(ESipa.AuthenticateClient)中获取eUICC提供的CERT.EUICC.ECDSA,并将其存储在eIM本地,用于后续的验签操作。


签名数据生成过程


签名生成与验签总览表

签名名称 生成方 原始数据拼接方式 验签方 验签使用的公钥
euiccSignEPR eUICC euiccPackageResultDataSigned + associationToken eIM PK.EUICC.ECDSA
euiccSignEPE eUICC euiccPackageErrorDataSigned + associationToken eIM PK.EUICC.ECDSA
smdpSignature2 SM-DP+ smdpSigned2 + euiccSignature1 eUICC PK.DPpb.ECDSA
serverSignature1 SM-DP+/SM-DS serverSigned1 eUICC PK.DPauth.ECDSA
euiccSignature1 eUICC euiccSigned1 SM-DP+/SM-DS PK.EUICC.ECDSA
euiccSignature2 eUICC euiccSigned2 + smdpSignature2 SM-DP+ PK.EUICC.ECDSA
eimSignature eIM euiccPackageSigned + associationToken eUICC PK.EIM.ECDSA
euiccNotificationSignature eUICC tbsOtherNotification SM-DP+/SM-DS PK.EUICC.ECDSA

详细签名原型说明

euiccSignEPR & euiccSignEPE

  • 原始数据拼接(SGP.32 v1.1/v1.2):
    • euiccSignEPR: euiccPackageResultDataSignedassociationToken 的数据对象拼接。
    • euiccSignEPE: euiccPackageErrorDataSignedassociationToken 的数据对象拼接。
    • 版本差异:在 SGP.32 v1.0.1 中,拼接的是 euiccPackageResultDataSignedeimSignature。这是重要的升级点,associationToken 取代了 eimSignature 成为签名的一部分。
  • 验签: eIM 使用从 CERT.EUICC.ECDSA 中提取的 PK.EUICC.ECDSA 进行验证。
  • 规范出处: SGP.32 EuiccPackageResult

euiccSignEPR and euiccSignEPE SHALL be created using the SK.EUICC.ECDSA and verified using the related PK.EUICC.ECDSA. In case there are more than one SK.EUICC.ECDSA available for signing, the SK.EUICC.ECDSA chaining back to the CI public key identified by the euiccCiPKId of the eIM Configuration Data (of the Associated eIM for which the eUICC Package Result is intended) SHALL be used. euiccSignEPR SHALL apply on the concatenated data objects euiccPackageResultDataSigned and associationToken. euiccSignEPE SHALL apply on the concatenated data objects euiccPackageErrorDataSigned and associationToken.

If no associationToken is configured for the eIM, the associationToken data object SHALL be used with the value set to zero for creating the signature.

The eIM SHALL use the PK.EUICC.ECDSA from CERT.EUICC.ECDSA to verify the signature euiccSignEPR and euiccSignEPE. The eIM SHALL verify CERT.EUICC.ECDSA.

euiccSignEPR和euiccSignEPE应使用SK.EUICC.ECDSA生成,并使用相关的PK.EUICC.ECDSA进行验证。若存在多个可用于签名的SK.EUICC.ECDSA,则应使用链接至eIM配置数据中euiccCiPKId所标识的CI公钥的SK.EUICC.ECDSA。euiccSignEPR应用于拼接后的数据对象euiccPackageResultDataSigned和associationToken。euiccSignEPE应用于拼接后的数据对象euiccPackageErrorDataSigned和associationToken。
若eIM未配置关联令牌,则应使用关联令牌数据对象,并将其值设为零以生成签名。
eIM应使用来自CERT.EUICC.ECDSA的PK.EUICC.ECDSA来验证euiccSignEPR和euiccSignEPE签名。电子身份管理(eIM)应验证CERT.EUICC.ECDSA。

smdpSignature2

  • 原始数据拼接: smdpSigned2 (DER编码) 与 euiccSignature1 (OCTET STRING) 的拼接。
  • 验签: eUICC 使用从 CERT.DPpb.ECDSA 中提取的 PK.DPpb.ECDSA 进行验证。
  • 规范出处: SGP.32 Direct Profile Download

Compute the smdpSignature2 over smdpSigned2 and euiccSignature1 using the SK.DPpb.ECDSA.

使用SK.DPpb.ECDSA计算smdpSigned2和euiccSignature1的smdpSignature2。

serverSignature1

  • 原始数据拼接: serverSigned1 (DER编码) 数据对象。
  • 验签: eUICC 使用从 CERT.DPauth.ECDSA 中提取的 PK.DPauth.ECDSA 进行验证。
  • 规范出处: SGP.22 v2.5 3.1.2 Common Mutual Authentication Procedure

· Compute the serverSignature1 over serverSigned1 using the SK.XXauth.ECDSA.

使用SK.XXauth.ECDSA在serverSigned1上计算serverSignature1。

euiccSignature1

  • 原始数据拼接: euiccSigned1 (DER编码) 数据对象。
  • 验签: SM-DP+ 或 SM-DS 使用从 CERT.EUICC.ECDSA 中提取的 PK.EUICC.ECDSA 进行验证。
  • 规范出处: SGP.22 v2.5 3.1.2 Common Mutual Authentication Procedure

· Compute the euiccSignature1 over euiccSigned1 using SK.EUICC.ECDSA. When generating the euiccSignature1, the eUICC SHALL use credentials related to the euiccCiPKIdToBeUsed parameter received from the SM-XX.

使用SK.EUICC.ECDSA在euiccSigned1上计算euiccSignature1。在生成euiccSignature1时,eUICC应使用与从SM-XX接收到的euicciPKIdToBeUsed参数相关的凭据。

euiccSignature2

  • 原始数据拼接: euiccSigned2 (DER编码) 与 smdpSignature2 (OCTET STRING) 的拼接。
  • 验签: SM-DP+ 使用与该 RSP 会话关联的 PK.EUICC.ECDSA 进行验证。
  • 规范出处: SGP.22 v2.5 Sub-procedure Profile Download and Installation – Download Confirmation 。

· Compute the euiccSignature2 over euiccSigned2 and smdpSignature2 using SK.EUICC.ECDSA. When generating the euiccSignature2, the eUICC SHALL use the same private key as in the AuthenticateServer response.

使用SK.EUICC.ECDSA通过euiccSigned2和smdpSignature2计算euiccSignature2。在生成euiccSignature2时,eUICC应使用与AuthenticateServer响应中相同的私钥。

eimSignature

  • 原始数据拼接 :euiccPackageSigned(DER编码) 与associationToken(OCTET STRING) 的拼接。
    • 注意:如果 associationToken 未配置,则使用一个值为零的 associationToken 数据对象(即 84 01 00)进行拼接。
  • 验签: eUICC 使用从 eIM 配置数据中获取的 PK.EIM.ECDSA 进行验证。
  • 规范出处: SGP.32 EuiccPackageRequest

The eIM SHALL sign the euiccPackageSigned data object concatenated with the associationToken data object (retrieved from the eIM Configuration Data) to create the eimSignature. If no association token is configured in the eIM Configuration Data, the associationToken data object SHALL be used with the value set to zero (i.e., ‘84 01 00’) for creating the signature.

eIM应将euiccPackageSigned数据对象与关联令牌数据对象(从电子标识管理器配置数据中检索)连接后进行签名,以生成电子标识管理器签名。若电子标识管理器配置数据中未配置关联令牌,则应使用关联令牌数据对象并将其值设置为零(即’84 01 00’)来创建签名。

euiccNotificationSignature

  • 原始数据拼接: tbsOtherNotification (DER编码) 数据对象。
  • 验签: SM-DP+ 或 SM-DS 使用从 CERT.EUICC.ECDSA 中提取的 PK.EUICC.ECDSA 进行验证。
  • 规范出处: SGP.22 v2.5 Function (ES10b): RetrieveNotificationsList 。

euiccNotificationSignature SHALL be created using the SK.EUICC.ECDSA and verified using the PK.EUICC.ECDSA as described in section 2.6.7.2. euiccNotificationSignature SHALL apply on the tbsOtherNotification data object.

euiccNotificationSignature应使用SK.EUICC.ECDSA创建,并使用PK.EUICC.ECDSA如第2.6.7.2节所述进行验证。euiccNotificationSignature应适用于tbsOtherNotification数据对象。


关键验证点总结

  1. 信任链校验:验签方在进行签名验证前,必须首先验证签名者证书的完整性和有效性。例如,eUICC 在验证 smdpSignature2 前,必须先验证 CERT.DPpb.ECDSA 的证书链,并确保 CERT.DPauth.ECDSACERT.DPpb.ECDSA 属于同一实体。
  2. 完整性校验:验签方在验证签名时,会按照相同的拼接方式重新计算待签名的数据,然后用公钥解密签名,比较两者是否一致。
  3. 防重放攻击:对于 eimSignature,eUICC 会在验证签名后,检查 euiccPackageSigned 中的 counterValue 是否大于 eUICC 本地存储的值,以防止重放攻击。
  4. 上下文一致性:对于 euiccSignature2,SM-DP+ 在验证签名后,还会验证 euiccSigned2 中的 TransactionID 是否与当前 RSP 会话的 TransactionID 一致。