3.3.3.2 安全通道协议使用
当目标安全域是解包远程APDU命令字符串的实体时,远程APDU命令字符串将被信任并进行处理。任何尝试在远程APDU命令字符串内启动安全通道会话(根据另一个安全通道协议)的行为都将被拒绝。
当目标安全域不是解包远程APDU命令字符串的实体时,适用以下规则:
1.如果目标安全域没有任何安全通道密钥集:
a. 如果解包远程APDU命令字符串的安全域与目标安全域相关联,则远程APDU命令字符串将被目标安全域信任并处理。
b. 如果解包远程APDU命令字符串的安全域与目标安全域不相关联,则远程APDU命令字符串不被信任,目标安全域应请求其关联的安全域验证在远程APDU命令字符串中接收到的APDU命令的保护(SCP 'xx',其中'xx'在'01'到'7F'范围内)。
2.如果目标安全域至少有一个完整的安全通道协议密钥集,则远程APDU命令字符串不被信任,并且:
a. 如果目标安全域不支持SCP '81',则它应使用自己的安全通道(SCP 'xx',其中'xx'在'01'到'7F'范围内)来验证在远程APDU命令字符串中接收到的APDU命令的保护。
b. 如果目标安全域同时支持SCP '81'和其他安全通道协议(SCP 'xx',其中'xx'在'01'到'7F'范围内),则应使用该其他协议来验证在远程APDU命令字符串中接收到的APDU命令的保护。否则,保护无法成功验证,APDU命令应被拒绝。
3.3.4 管理会话结束
当远程管理服务器发送的所有HTTP消息都被接收并处理完毕时,管理会话结束。远程管理服务器通过发送一个不包含“X-Admin-Next-URI”头且内容为空的HTTP响应来明确结束会话(参见3.4.2节)。随后,安全域应关闭管理会话和通信通道。
此外,如果安全通信通道失败(参见3.3.2节),管理会话也会结束。
如果在管理会话期间发生通信中断,安全域应尝试按照3.5节描述的那样恢复管理会话。
在远程管理服务器变得无响应的情况下(即预期有HTTP响应但未收到),安全域可以决定结束管理会话。检测此类情况的方法不在本文档的范围内。
3.4 命令格式
3.4.1 安全域的HTTP POST请求
安全域使用POST请求来获取远程APDU格式字符串,并传输响应字符串。
POST请求应遵循以下格式:
- URI、"X-Admin-From"值和"Host"值由管理会话触发消息或安全域参数定义。
- 新管理会话的第一个POST请求不应包含任何可选头字段和无正文。
- "X-Admin-Script-Status"头字段用于返回前一个远程APDU格式字符串的传递状态。可能的值定义如下:
- "ok":如果前一个远程APDU格式字符串已成功传递,则使用此值。应发送响应字符串。
- "unknown-application":如果前一个远程APDU格式字符串的目标应用程序未找到,则使用此值。不发送响应字符串。
- "not-a-security-domain":如果前一个远程APDU格式字符串的目标应用程序不是安全域,则使用此值。不发送响应字符串。
- "security-error":此值可用于指示目标安全域无法检查其安全性。在这种情况下,APDU格式字符串可能已完全或部分处理,但不发送响应字符串。
- "security-error"状态值的使用是可选的。目标安全域也可以使用"ok"状态值并发送响应字符串。
- 如果管理会话是从之前的中断会话中恢复的,安全域应在恢复会话的第一个POST请求中使用带有值"true"的"X-Admin-Resume"头。在后续的POST请求中不应使用"X-Admin-Resume"头。参见3.5节,重试策略。
- 如果需要发送响应字符串,安全域应使用:
- "Content-Type"头字段,其值为"application/vnd.globalplatform.card-content-mgt-response;version=1.0"。
- "Content-Length"头字段,其值为正文的确切字节长度,或者使用"Transfer-Encoding"头字段,其值为"chunked"。
- 一个包含前一个远程APDU格式字符串的完整响应字符串的正文,采用二进制格式。可以使用分块传输编码。应使用[102 226]中定义的扩展远程响应结构格式。
3.4.2 远程管理服务器的HTTP POST响应
远程管理服务器使用POST响应来向安全域传输下一个远程APDU格式字符串,并可能通知下一个URI,用于请求后续的管理命令。
POST响应应遵循以下格式:
- 如果响应包含正文,远程管理服务器应使用成功状态(200 OK),否则如果未发送正文,则应使用204(无内容)。
- 如果Content-Type和X-Admin-Protocol不一致,会话应关闭。
- 如果远程管理服务器无法处理上一个HTTP POST请求(意外的URI、无效的头等),则应使用错误状态。安全域应关闭管理会话。
- 如果响应中存在“X-Admin-Next-URI”头,则安全域应在下一个POST请求中使用给定的URI。该头可以被“SCWS-Next-URI”头替换,而不会有任何功能上的改变。
- 如果响应中没有“X-Admin-Next-URI”头,并且正文为空,这是远程管理服务器的最终响应,管理会话应关闭。
- 如果响应中没有“X-Admin-Next-URI”头,并且正文不为空,远程APDU格式字符串应按上述方式处理,但不向远程管理服务器返回响应字符串,管理会话应关闭。
- 如果远程管理服务器指示状态204(无内容),则不应存在“Content-Type”头。如果存在,可以忽略或视为错误。
- 如果远程管理服务器还有剩余的远程APDU格式字符串要转发给安全域,它应使用包含以下内容的正文:
- “Content-Type”头字段,其值为“application/vnd.globalplatform.card-content-mgt;version=1.0”。
- “Content-Length”头字段,其值为正文的确切字节长度,或者“Transfer-Encoding”头字段,其值为“chunked”。
- 一个包含要转发给安全域的远程APDU格式字符串的正文,采用二进制格式。可以使用分块传输编码。应使用[102 226]中定义的扩展远程命令结构格式。
- 可选地,如果目标安全域不是负责PSK TLS安全的域,则可以使用“X-Admin-Targeted-Application”头字段,其值为表示目标安全域AID的头值。
- AID的编码方式如下;//aid/<RID>/<PIX>,其中<RID>和<PIX>是应用程序AID的两个组成部分。RID和PIX的所有字节,包括任何前导0字节值,都应以字符字符串表示。
- RID字节字符串长度为5字节。其字符字符串等价长度应恰好为10个字符。
- PIX字节字符串长度可以从0到11字节不等。长度为N字节的PIX字节字符串应有相当于2*N字符的等价字符字符串表示。
请注意,实现不应仅因HTTP响应包含未在本文档中描述的HTTP头字段而拒绝该响应。
3.4.3 与SCWS的互操作性
如果在卡片上使用HTTP上的RAM与[OMA SCWS]定义的SCWS管理一起使用,应适用以下额外规定:
用于HTTP上的RAM的PSK TLS安全通道也可以按照[OMA SCWS]的定义打开。 不论PSK TLS通道是如何打开的,都应支持在HTTP上的RAM和SCWS管理之间按以下两个要点定义的顺序切换。 从SCWS管理切换到HTTP上的RAM,应由远程管理服务器的响应替换结束SCWS管理的空响应,该响应应包含本文件定义的内容。这将启动本文件定义的管理会话。 从HTTP上的RAM切换到SCWS管理,应由SCWS远程管理服务器的响应替换本文件定义的远程管理服务器的最终响应,该响应应包含为SCWS定义的内容。这将结束本文件定义的管理会话。
3.5 重试策略
一旦管理会话被触发并被安全域接受,它就负责与远程管理服务器的连接以及会话的完成。
这意味着如果在处理管理协议期间发生通信错误,安全域应根据发卡机构特定的重试策略尝试重新连接。
重试策略可能包括以下内容:
如果在安全域和远程管理服务器之间交换了有效请求后发生通信中断,安全域应始终使用恢复模式(见3.4.1节)。
整体行为应基于以下规则:
如果注册了多个需要重试的管理请求,安全域应独立处理这些重试(例如,如果当前尝试不成功,则不应阻止其他重试尝试)。
如果PSK TLS会话建立因安全/授权原因失败,则管理会话应立即丢弃。
- 一个结束条件(例如重试次数),用于避免由于过时或不一致的远程管理请求造成的网络拥塞。
- 如果连接尝试失败(如网络拥塞),则基于时间、计数器或事件的重试策略。
- 安全域将尝试多次恢复管理会话。两次尝试之间的等待时间以及最大尝试次数由重试策略指定。参见3.7.4节。
- 如果通信恢复,并且在中断发生之前安全域已接收到完整的脚本,则安全域将处理脚本,并尝试使用带有“X-Admin-Resume: true”头的下一个HTTP请求恢复HTTP对话。
- 如果在其他时间点通信恢复,安全域将尝试通过重复带有“X-Admin-Resume: true”头的最后一个HTTP请求来恢复HTTP对话。
- 在这两种情况下,远程管理服务器可以从给定的URL继续管理会话,或者从头开始重新启动。
- 相反,如果达到最大尝试次数,管理会话请求则被放弃。
3.7.1 TLV: 安全域管理会话参数
在安全域安装期间,可以使用标签'85'设置管理参数,或者在应用程序特定的安装参数中使用标签'85',或者在安全域个性化期间使用标签'85'或'A5',通过[GPCS]中定义的TLV模式下的STORE DATA命令来创建或更新安全域管理会话参数的完整集合。
请注意,标签'85'是一个上下文相关的标签,与表3-3中定义的标签'85'无关。发行者安全域拥有默认的管理会话参数。
使用标签'85'(在TLV模式下)的STORE DATA命令应被用来创建或更新安全域管理会话参数的完整集合。可以使用带有空长度的标签'85'一次性移除所有参数。
使用标签'A5'(在TLV模式下)的STORE DATA命令应被用来创建、更新或移除安全域管理会话参数的子TLVs:'84'(连接参数)、'85'(安全参数)、'86'(重试策略参数)、'89'(HTTP POST参数)。可以存在一个或多个这些子TLVs。如果子TLV不存在,则不对相应的安全域管理会话参数执行创建/更新。如果子TLV存在但没有值(即长度设置为0),则从安全域中移除相应的管理会话参数。否则,子TLV的值将替换安全域中相应管理会话参数的值。
由于标签'85'或'A5'的值可能相当长,实现应支持接收跨越至少两个连续STORE DATA命令的TLV。请注意,在安全域安装时,由于Java Card规范[JCS]限制安装参数的长度为127字节,因此无法提供如此长的值。
可以使用[GPCS]中定义的STORE DATA命令来更新或移除整个安全域管理会话参数及其任何子TLVs:'84'(连接参数)、'85'(安全参数)、'86'(重试策略参数)、'89'(HTTP POST参数)。
如果TLV不存在,则不对相应的安全域管理会话参数执行更新。如果TLV存在但没有值(即长度设置为0),则从安全域中移除相应的管理会话参数。否则,TLV的值将替换安全域中相应管理会话参数的值。同样的规则适用于整个安全域管理会话参数TLV。
可以使用[GPCS]中定义的GET DATA命令,通过设置P1-P2为'00 85'来检索上述定义的完整安全域管理会话参数集合。GET DATA命令的响应应包含标签'85',封装整个安全域管理会话参数集合(即当前存储的参数)。
可以使用[GPCS]中定义的GET DATA命令,通过设置P1-P2为'00 A5'并包含一个数据字段,该数据字段包含一个标签列表,指示请求的参数,来检索单个安全域管理会话参数。标签列表(TLV '5C')应只包含一个标签。可能的标签包括:'84'(连接参数)、'85'(安全参数)、'86'(重试策略参数)、'89'(HTTP POST参数)。GET DATA命令的响应应包含标签'A5',仅封装请求的相应安全域管理会话参数的TLV。
通过设置P1-P2为'00 85'的GET DATA命令,可以检索上述定义的安全域管理会话参数。为了仅检索单个安全域管理会话参数,GET DATA命令的数据字段应包含一个标签列表,指示请求的参数。标签列表(TLV '5C')应只包含一个标签。可能的标签包括:'84'(连接参数)、'85'(安全参数)、'86'(重试策略参数)、'89'(HTTP POST参数)。为了检索整个安全域管理会话参数,不应存在标签列表。
GET DATA命令的响应应包含请求的单个安全域管理会话参数,或者在没有标签列表时包含整个安全域管理会话参数。
3.7.2 连接参数
连接参数TLV嵌入了所有必要的参数,用于在管理代理和远程管理服务器之间建立点对点TCP连接。此参数通常用于当管理代理与远程管理服务器之间的连接通过BIP(Bearer Independent Protocol)进行时,在与配置资源合并后,数据应包含ETSI TS 102 223 [102 223]中为OPEN CHANNEL定义的所有必需的COMPREHENSION-TLV数据对象。
A.6 通过中介参与者进行通信流程
涉及此场景的参与者和卡片组件包括:
- 应用提供者(AP)
- 由另一实体拥有的远程管理服务器
- 负责PSK TLS安全的PSK TLS密钥的安全域(OTASD)
- 符合[102 226]标准的应用提供者安全域(APSD),如果需要,支持SCP '02'以保护APDU(应用协议数据单元)