跳到主要内容

GB/T 38629-2020 信息安全技术 签名验签服务器技术规范

返回主题目录 · 官方来源

来源:GB/T 38629-2020 国家标准详情;发布日期:2020-04-28;实施日期:2020-11-01。 PDF SHA-256:10065fe980d7e5948a09bbd128f253d1a3fca9681fc5fff3fec98f780135c17e。 转写说明:将官方 PDF 按页渲染为图像,对照全部 25 页修正文、图 1、协议定义、表 1、表 2、表 A.1 和表 B.1;省略封面、目录、页眉、页脚及页码,合并跨页内容。原页字段中的 IMPLICT 按印刷文本照录;正式引用请核对官方 PDF。

前言​

本标准按照 GB/T 1.1—2009给出的规则起草。

请注意本文件的某些内容可能涉及专利。本文件的发布机构不承担识别这些专利的责任。

本标准由全国信息安全标准化技术委员会(SAC/TC 260)提出并归口。

本标准起草单位:山东得安信息技术有限公司、成都卫士通信息产业股份公司、无锡江南信息安全工程技术中心、兴唐通信科技有限公司、格尔软件股份有限公司、长春吉大正元信息技术股份有限公司、上海市数字证书认证中心有限公司、北京数字认证股份有限公司、北京创原天地科技有限公司、北京三未信安科技发展有限公司、北京信安世纪科技股份有限公司。

本标准主要起草人:马洪富、孔凡玉、罗俊、徐明翼、王妮娜、郑强、赵丽丽、韩玮、李述胜、肖青海、高志权、汪宗斌。

1 范围​

本标准规定了签名验签服务器的功能要求、安全要求和消息协议语法规则等内容。

本标准适用于签名验签服务器的研制和使用。

2 规范性引用文件​

下列文件对于本文件的应用是必不可少的。凡是注日期的引用文件,仅注日期的版本适用于本文件。凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件。

  • GB/T 9813.3—2017 计算机通用规范 第3部分:服务器

  • GB/T 19713—2005 信息技术 安全技术 公钥基础设施 在线证书状态协议

  • GB/T 25069—2010 信息安全技术 术语

  • GB/T 32905 信息安全技术 SM3密码杂凑算法

  • GB/T 32918(所有部分)信息安全技术 SM2椭圆曲线公钥密码算法

  • GB/T 33560—2017 信息安全技术 密码应用标识规范

  • GB/T 35275 信息安全技术 SM2密码算法加密签名消息语法规范

  • GB/T 35276 信息安全技术 SM2密码算法使用规范

  • GB/T 35291—2017 信息安全技术 智能密码钥匙应用接口规范

  • GB/T 36322 信息安全技术 密码设备应用接口规范

  • GM/T 0020 证书应用综合服务接口规范

  • GM/T 0028 密码模块安全要求

  • GM/T 0039 密码模块安全检测要求

3 术语和定义​

GB/T 25069—2010界定的以及下列术语和定义适用于本文件。

3.1 安全域 security domain​

在信息系统中,单一安全策略下运行的实体的汇集。例如,由单个或一组认证机构采用同一安全策略创建的各公钥证书的汇集。

[GB/T 25069—2010,定义 2.2.1.17]

3.2 签名验签服务器 signature verification server​

用于服务端的,为应用实体提供基于 PKI 体系和数字证书的数字签名、验证签名等运算功能的服务器,保证关键业务信息的真实性、完整性和不可否认性。

3.3 用户 user​

与应用实体进行通信或认证的个人、机构或系统。

注:其数字证书可导入到签名验签服务器中。

3.4 SM2 算法 SM2 algorithm​

由GB/T 32918定义的一种椭圆曲线密码算法。

3.5 SM3 算法 SM3 algorithm​

由 GB/T 32905定义的一种杂凑算法。

4 缩略语​

下列缩略语适用于本文件。

  • API:应用程序接口(Application Program Interface)
  • ASN.1:抽象语法记法 1(Abstract Syntax Notation One)
  • CA:证书认证机构(Certification Authority)
  • CRL:证书撤销列表(Certificate Revocation List)
  • OCSP:在线证书状态查询协议(Online Certificate Status Protocol)
  • PKI:公钥密码基础设施(Public Key Infrastructure)

5 签名验签服务器的功能要求​

5.1 初始化功能​

签名验签服务器的初始化应主要包括系统配置、生成管理员和审计员、创建密钥、申请证书和导入证书等,使设备处于正常工作状态。

5.2 与公钥基础设施的连接配置功能​

5.2.1 CRL 连接配置​

签名验签服务器应支持 CRL 连接配置功能,通过配置管理界面,提供从 CRL 发布点获取 CRL、导入 CRL 等功能。

5.2.2 OCSP 连接配置​

签名验签服务器应支持 OCSP 连接配置功能,通过配置管理界面,进行 OCSP 服务的连接配置管理。OCSP 服务的连接配置应遵循GB/T 19713—2005中6.1 的规定。

5.3 应用管理功能​

签名验签服务器的应用管理功能应包括应用实体的注册、配置密钥、设置私钥授权码等,并按照安全机制对应用实体的信息进行安全存储。应用实体注册的内容应包括设置应用实体名称、配置密钥索引号、导入证书等。

5.4 证书管理和验证功能​

5.4.1 应用实体的密钥产生、证书申请​

在签名验签服务器注册的应用实体,应由签名验签服务器产生应用实体的签名密钥对和证书请求,并支持通过管理界面导入应用实体的签名证书、加密证书和加密密钥对。加密密钥对的保护结构应遵循 GB/T 35291—2017中6.4.10 的规定。

5.4.2 证书导入和存储​

签名验签服务器应支持用户证书、根证书或证书链的导入,导入时应对证书的有效性进行验证。

5.4.3 应用实体的证书更新​

应用实体的证书更新时应保存原来的证书,以防止以前的签名不能验证。

5.4.4 证书验证​

签名验签服务器应支持对证书的有效性的验证,包括验证证书有效期、验证证书签名有效性、验证证书状态。

5.4.5 备份和恢复​

签名验签服务器应支持备份和恢复功能,包括密钥、证书等数据的备份和恢复。

备份操作产生的备份文件可存储到签名验签服务器外的存储介质中,应采取措施保证备份文件的机密性和完整性。

5.5 数字签名和验签功能​

签名验签服务器应支持 SM2算法的数字签名和数字验签功能,提供对数据、消息、文件等多种格式的运算方式。

数据的结构应遵循 GB/T 35275 和 GB/T 35276。

5.6 日志管理功能​

签名验签服务器应提供日志记录、查看、审计和导出功能,具备相应的配置管理和查看界面。

日志内容包括:

a) 系统管理日志,包括登录认证、系统配置、密钥管理等操作;

b) 异常事件,包括认证失败、非法访问等异常事件的记录;

c) 如与设备管理中心连接,对相应操作进行记录;

d) 对应用接口的调用进行日志记录。

5.7 时间源同步功能​

签名验签服务器应能够配置连接时间源服务器,自动同步时间。

6 签名验签服务器的安全要求​

6.1 接口要求​

签名验签服务器调用密码设备的接口应遵循 GB/T 36322。

6.2 系统要求​

签名验签服务器所使用的操作系统应进行安全加固,保障其安全性。

6.3 使用要求​

签名验签服务器只接受合法的操作指令,并防止非授权用户的使用。

6.4 管理要求​

6.4.1 管理工具​

签名验签服务器通过管理工具实现对该签名验签服务器的管理功能。

6.4.2 管理员身份鉴别​

签名验签服务器应具备完善的身份鉴别机制,签名验签服务器应设置管理员和审计员,管理员和审计员应通过智能密码钥匙、智能IC卡等硬件介质与口令相结合的方式登录系统,并使用证书进行身份验证。各类管理员通过身份鉴别后执行自己权限范围内的相关管理操作。

6.4.3 设备管理​

6.4.3.1 设备初始化​

签名验签服务器的初始化,除应由厂商进行的操作外,系统配置、密钥的生成(恢复)与安装、生成管理员和审计员等均应由用户方设备管理人员完成。

6.4.3.2 设备自检​

签名验签服务器应具备自检功能,应具备状态和功能自检功能,能够进行密码算法正确性检查、随机数发生器检查、存储密钥和数据的完整性检查等,检查不通过时应报警并停止工作。

6.5 设备物理安全防护​

签名验签服务器在工艺设计、硬件配置等方面应采取相应的保护措施,保证设备基本的物理安全防护功能。

6.6 网络部署要求​

签名验签服务器应部署在应用系统的安全域内,只为安全域内的应用实体和用户服务,不应为安全域外的应用实体和用户使用。

6.7 服务接口​

以基于 HTTP的WEB方式提供服务的签名验签服务器,接口要求见附录A,响应码的定义见附录B。

以消息协议方式提供服务的签名验签服务器,接口要求见第7章,响应码的定义见附录B。

以应用程序接口方式提供服务的签名验签服务器,其接口应遵循 GM/T 0020。

6.8 环境适应性​

签名验签服务器的工作环境应遵循GB/T 9813.3—2017中5.8的规定。

6.9 可靠性​

签名验签服务器的平均失效间隔工作时间应遵循GB/T 9813.3—2017中4.9的规定。

6.10 其他​

签名验签服务器的其他安全要求应遵循GM/T 0028 和 GM/T 0039。

7 消息协议语法规则​

7.1 概述​

签名验签服务的消息协议接口采用请求响应模式,如图 1 所示。协议模型由请求者、响应者和它们之间的交互协议组成。通过本协议,请求者将数字签名、验证数字签名等请求发送给响应者,由响应者完成签名验签服务并返回结果。本规则中的接口消息协议包括导出证书、解析证书、验证证书有效性、数字签名、验证数字签名、消息签名、验证消息签名等服务功能,每个服务都按照请求—响应的步骤执行。请求者可通过规则获得签名验签功能,而不必关心下层 PKI 公钥密码基础设施的实现细节。

图1 签名验签服务的消息协议接口模式

图 1 签名验签服务的消息协议接口模式

请求者组织业务服务请求,发送到响应者,并延缓自身的事务处理过程,等待响应者响应返回;响应者接收到来自请求者的业务服务请求后,检查请求的合法性,根据请求类型处理服务请求,并将处理结果返回给请求者。

下面的协议内容将按照图1所示的框架进行。

7.2 协议内容​

协议内容如下:

a) 请求

也称业务服务请求,包含请求者业务请求的类型、性质以及特性数据等,该请求将被发送到响应者并得到服务。服务请求包括如下数据:

  • 协议版本(当前版本为 1);
  • 请求类型;
  • 请求包;
  • 请求时间。

b) 响应

指响应者对来自请求者请求的处理响应。响应者的响应包括如下数据:

  • 协议版本(当前版本为 1);
  • 响应类型;
  • 响应包;
  • 响应时间。

c) 异常情况

当响应者处理发生错误时,需要向请求者发送错误信息。错误可以是下列两类:

  • 请求失败:响应者验证来自请求者业务请求数据失败,请求者收到该响应后应重新组织业务请求数据进行发送。
  • 内部处理失败:响应者处理请求者业务请求过程中发生内部错误,响应者通知请求者该请求处理失败,请求者需重新组织业务请求数据进行发送。

本规则采用抽象语法记法1(ASN.1)来描述具体协议内容。如果无特殊说明,默认使用 ASN.1显式标记。

7.3 请求协议​

7.3.1 请求数据格式​

请求者请求数据的基本格式如下:

SVSRequest ::= SEQUENCE {
version Version DEFAULT v1,
reqType ReqType,
request Request,
reqTime [0] IMPLICIT GeneralizedTime OPTIONAL,
reqTimeStampToken [1] IMPLICIT ReqTimeStampToken OPTIONAL,
extAttributes [2] IMPLICIT ExtAttributes OPTIONAL
}

其中:

Version ::= INTEGER { v1(0) }
ReqType ::= INTEGER {
exportCert (0),
parseCert (1),
validateCert (2),
signData (3),
verifySignedData (4),
signDataInit (5),
signDataUpdate (6),
signDataFinal (7),
verifySignedDataInit (8),
verifySignedDataUpdate (9),
verifySignedDataFinal (10),
signMessage (11),
verifySignedMessage (12)
}
Request ::= OCTET STRING {
exportUserCertReq [0] IMPLICT ExportUserCertReq,
parseCertReq [1] IMPLICT ParseCertReq,
validateCertReq [2] IMPLICT ValidateCertReq,
signDataReq [3] IMPLICT SignDataReq,
verifySignedDataReq [4] IMPLICT VerifySignedDataReq,
signDataInitReq [5] IMPLICT SignDataInitReq,
signDataUpdateReq [6] IMPLICT SignDataUpdateReq,
signDataFinalReq [7] IMPLICT SignDataFinalReq,
verifySignedDataInitReq [8] IMPLICT VerifySignedDataInitReq,
verifySignedDataUpdateReq [9] IMPLICT VerifySignedDataUpdateReq,
verifySignedDataFinalReq [10] IMPLICT VerifySignedDataFinalReq,
signMessageReq [11] IMPLICT SignMessageReq,
verifySignedMessageReq [12] IMPLICT VerifySignedMessageReq
}
ReqTimeStampToken ::= TimeStampToken
ExtAttributes ::= SET OF Attribute

7.3.2 SVSRequest 及其结构解释​

SVSRequest 包含了请求语法中的重要信息,本条将对该结构作详细的描述和解释:

a) 协议版本

本项描述了请求语法的版本号,当前版本为 1,取整型值 0。

b) 请求类型

本项描述了不同业务的请求类型值,0~999 为保留值,不可占用。

c) 请求包

请求包与请求类型值之间的对应关系如表 1 所示。

表1 请求包与请求类型值的对应关系

请求类型字符描述请求类型值请求包说明
exportCert0导出证书请求包
parseCert1解析证书请求包
validateCert2验证证书有效性请求包
signData3单包数字签名请求包
verifySignedData4单包验证数字签名请求包
signDataInit5多包数字签名初始化请求包
signDataUpdate6多包数字签名更新请求包
signDataFinal7多包数字签名结束请求包
verifySignedDataInit8多包验证数字签名初始化请求包
verifySignedDataUpdate9多包验证数字签名更新请求包
verifySignedDataFinal10多包验证数字签名结束请求包
signMessage11单包消息签名请求包
verifySignedMessage12单包验证消息签名请求包

d) 请求时间

请求者产生请求的时间,采用 GeneralizedTime 语法表示。

e) 请求时间戳

request 内容的时间戳。如包含此项数据,签名服务器应验证该时间戳。

f) 扩展数据

依据实际业务需求添加的扩展数据。

7.4 响应协议​

7.4.1 响应数据格式​

响应者响应的基本格式如下:

SVSRespond ::= SEQUENCE {
version Version DEFAULT v1,
respType RespType,
respond Respond,
respTime [0] IMPLICIT GeneralizedTime OPTIONAL,
respTimeStampToken [1] IMPLICIT RespTimeStampToken OPTIONAL,
extAttributes [2] IMPLICIT ExtAttributes OPTIONAL
}

其中:

Version ::= INTEGER { v1(0) }
RespType ::= INTEGER {
exportCert (0),
parseCert (1),
validateCert (2),
signData (3),
verifySignedData (4),
signDataInit (5),
signDataUpdate (6),
signDataFinal (7),
verifySignedDataInit (8),
verifySignedDataUpdate (9),
verifySignedDataFinal (10),
signMessage (11),
verifySignedMessage (12)
}
Respond ::= OCTET STRING {
exportUserCertResp [0] IMPLICT ExportUserCertResp,
parseCertResp [1] IMPLICT ParseCertResp,
validateCertResp [2] IMPLICT ValidateCertResp,
signDataResp [3] IMPLICT SignDataResp,
verifySignedDataResp [4] IMPLICT VerifySignedDataResp,
signDataInitResp [5] IMPLICT SignDataInitResp,
signDataUpdateResp [6] IMPLICT SignDataUpdateResp,
signDataFinalResp [7] IMPLICT SignDataFinalResp,
verifySignedDataInitResp [8] IMPLICT VerifySignedDataInitResp,
verifySignedDataUpdateResp [9] IMPLICT VerifySignedDataUpdateResp,
verifySignedDataFinalResp [10] IMPLICT VerifySignedDataFinalResp,
signMessageResp [11] IMPLICT SignMessageResp,
verifySignedMessageResp [12] IMPLICT VerifySignedMessageResp
}
respTimeStampToken ::= TimeStampToken
ExtAttributes ::= SET OF Attribute

7.4.2 SVSRespond 及其结构解释​

SVSRespond 包含了响应语法中的重要信息,本条将对该结构作详细的描述和解释:

a) 协议版本

本项描述了响应语法的版本号,当前版本为 1,取整型值 0。

b) 响应类型

本项描述了不同业务的响应类型值,0~999 为保留值,不可占用。

c) 响应包

响应包与响应类型值之间的对应关系如表 2 所示。

表2 响应包与相应类型值的对应关系

应答类型字符描述应答类型值响应包说明
exportCert0导出证书响应包
parseCert1解析证书响应包
validateCert2验证证书有效性响应包
signData3单包数字签名响应包
verifySignedData4单包验证数字签名响应包
signDataInit5多包数字签名初始化响应包
signDataUpdate6多包数字签名更新响应包
signDataFinal7多包数字签名结束响应包
verifySignedDataInit8多包验证数字签名初始化响应包
verifySignedDataUpdate9多包验证数字签名更新响应包
verifySignedDataFinal10多包验证数字签名结束响应包
signMessage11单包消息签名响应包
verifySignedMessage12单包验证消息签名响应包

d) 响应时间

响应者产生响应的时间,采用 GeneralizedTime 语法表示。

e) 响应时间戳

respond 内容的时间戳。如包含此项数据,客户端应验证该时间戳。

f) 扩展数据

依据实际业务需求添加的扩展数据。

7.5 协议接口功能说明​

7.5.1 导出证书​

  • ExportCertReq 包

ExportCertReq 包为导出证书请求格式包,当 reqType 取值 exportCert 时,请求包采用本子包,其具体格式如下:

ExportCertReq ::= SEQUENCE {
identification OCTET STRING
}

identification 表明要导出证书的标识。

  • ExportCertResp 包

ExportCertResp 包为导出证书响应格式包,当 respType 取值 exportCert 时,响应包采用本子包,其具体格式如下:

ExportCertResp ::= SEQUENCE {
respValue INTEGER,
cert Certificate OPTIONAL
}

respValue 表明响应码,0 表示成功,非 0 表示错误。

cert 表明导出的证书。

7.5.2 解析证书​

— ParseCertReq 包

ParseCertReq 包为解析证书请求格式包,当 reqType 取值 parseCert 时,请求包采用本子包,其具体格式如下:

ParseCertReq ::= SEQUENCE {
infoType INTEGER,
cert Certificate
}

infoType 表明要解析证书信息的类型,应遵循 GB/T 33560—2017 中 6.3.4 的规定;

cert 表示要解析的数字证书。

— ParseCertResp 包

ParseCertResp 包为解析证书响应格式包,当 respType 取值 parseCert 时,响应包采用本子包,其具体格式如下:

ParseCertResp ::= SEQUENCE {
respValue INTEGER,
info OCTET STRING OPTIONAL
}

respValue 表明响应码,0 表示成功,非 0 表示错误。

info 表示获取的证书信息。

7.5.3 验证证书有效性​

— ValidateCertReq 包

ValidateCertReq 包为验证证书有效性请求格式包,当 reqType 取值 validateCert 时,请求包采用本子包,其具体格式如下:

ValidateCertReq ::= SEQUENCE {
cert Certificate,
ocsp BOOLEAN DEFAULT FALSE
}

cert 表示要验证证书有效性的数字证书;

ocsp 表示是否获取证书 OCSP 状态,默认值为 FALSE。

— ValidateCertResp 包

ValidateCertResp 包为验证证书有效性响应格式包,当 respType 取值 validateCert 时,响应包采用本子包,其具体格式如下:

ValidateCertResp ::= SEQUENCE {
respValue INTEGER,
state INTEGER OPTIONAL
}

respValue 表明响应码,0 表示成功,非 0 表示错误;

state 表明获取的证书 OCSP 状态标识。

7.5.4 单包数字签名​

— SignDataReq 包

SignDataReq 包为单包数字签名请求格式包,当 reqType 取值 signData 时,请求包采用本子包,其具体格式如下:

SignDataReq ::= SEQUENCE {
signMethod INTEGER,
keyIndex INTEGER,
keyValue OCTET STRING,
signerIDLen [0] IMPLICT INTEGER OPTIONAL,
signerID [1] IMPLICT OCTET STRING OPTIONAL,
inDataLen INTEGER,
inData OCTET STRING
}

signMethod 表明使用的签名算法类型,应遵循 GB/T 33560—2017 中 6.2.4 的规定;

keyIndex 表示签名者私钥的索引值,如十进制1表示索引值为1的密钥;

keyValue 表示签名者私钥权限标识码;

signerIDLen 表示签名者的ID 长度,当 signMethod 为 SGD_SM3_SM2 时有效;

signerID 表示签名者的ID 值,当 signMethod 为 SGD_SM3_SM2 时有效;

inDataLen 表示待签名的数据原文长度;

inData 表示待签名的数据原文。

— SignDataResp 包

SignDataResp 包为单包数字签名响应格式包,当 respType 取值 signData 时,响应包采用本子包,其具体格式如下:

SignDataResp ::= SEQUENCE {
respValue INTEGER,
signature OCTET STRING OPTIONAL
}

respValue 表明响应码,0 表示成功,非 0 表示错误;

signature 表示签名值,数据的结构应遵循 GB/T 35276。

7.5.5 单包验证数字签名​

— VerifySignedDataReq 包

VerifySignedDataReq 包为单包验证数字签名请求格式包,当 reqType 取值 verifySignedData 时,请求包采用本子包,其具体格式如下:

VerifySignedDataReq ::= SEQUENCE {
signMethod INTEGER,
type INTEGER,
cert [0] IMPLICT Certificate OPTIONAL,
certSN [1] IMPLICT OCTET STRING OPTIONAL,
signerIDLen [2] IMPLICT INTEGER OPTIONAL,
signerID [3] IMPLICT OCTET STRING OPTIONAL,
inDataLen INTEGER,
inData OCTET STRING,
signature OCTET STRING,
verifyLevel INTEGER
}

signMethod 表明使用的签名算法类型,应遵循 GB/T 33560—2017 中 6.2.4 的规定;

type 表示使用验证数字签名时使用证书或证书序列号,1表示使用证书,2表示使用证书序列号;

cert 表示签名证书,type 取值1时有效;

certSN 表示签名证书序列号,type 取值2时有效;

signerIDLen 表示签名者的 ID 长度,当 signMethod 为 SGD_SM3_SM2 时有效;

signerID 表示签名者的 ID 值,当 signMethod 为 SGD_SM3_SM2 时有效;

inDataLen 表示待签名的数据原文长度;

inData 表示待签名的数据原文;

signature 表示签名值,数据的结构应遵循 GB/T 35276;

verifyLevel 表示证书验证级别,0:验证时间,1:验证时间和根证书签名,2:验证时间、根证书签名和 CRL。

— VerifySignedDataResp 包

VerifySignedDataResp 包为单包验证数字签名响应格式包,当 respType 取值 verifySignedData 时,响应包采用本子包,其具体格式如下:

VerifySignedDataResp ::= SEQUENCE {
respValue INTEGER
}

respValue 表明响应码,0 表示成功,非 0 表示错误。

7.5.6 多包数字签名初始化​

— SignDataInitReq 包

SignDataInitReq 包为多包数字签名初始化请求格式包,当 reqType 取值 signDataInit 时,请求包采用本子包,其具体格式如下:

SignDataInitReq ::= SEQUENCE {
signMethod INTEGER,
signerPublicKey [0] IMPLICT OCTET STRING OPTIONAL,
signerIDLen [1] IMPLICT INTEGER OPTIONAL,
signerID [2] IMPLICT OCTET STRING OPTIONAL
}

signMethod 表明使用的签名算法类型,应遵循 GB/T 33560—2017 中 6.2.4 的规定;

signerPublicKey 表示签名者公钥,当 signMethod 为 SGD_SM3_SM2 时有效;

signerIDLen 表示签名者的ID 长度,当 signMethod 为SGD_SM3_SM2 时有效;

signerID 表示签名者的 ID 值,当 signMethod 为 SGD_SM3_SM2 时有效;

— SignDataInitResp 包

SignDataInitResp 包为多包数字签名初始化响应格式包,当 respType 取值 signDataInit 时,响应包采用本子包,其具体格式如下:

SignDataInitResp ::= SEQUENCE {
respValue INTEGER,
SessionID OCTET STRING OPTIONAL
}

respValue 表明响应码,0 表示成功,非 0 表示错误;

SessionID 表示会话标识。

7.5.7 多包数字签名更新​

— SignDataUpdateReq 包

SignDataUpdateReq 包为多包数字签名更新请求格式包,当 reqType 取值 signDataUpdate 时,请求包采用本子包,其具体格式如下:

SignDataUpdateReq ::= SEQUENCE {
SessionID OCTET STRING,
inDataLen INTEGER,
inData OCTET STRING
}

SessionID 表示会话标识;

inDataLen 表示数据明文长度;

inData 表示数据明文。

— SignDataUpdateResp 包

SignDataUpdateResp 包为多包数字签名更新响应格式包,当 respType 取值 signDataUpdate 时,响应包采用本子包,其具体格式如下:

SignDataUpdateResp ::= SEQUENCE {
respValue INTEGER,
SessionID OCTET STRING OPTIONAL
}

respValue 表明响应码,0 表示成功,非 0 表示错误;

SessionID 表示会话标识。

7.5.8 多包数字签名结束​

— SignDataFinalReq 包

SignDataFinalReq 包为多包数字签名结束请求格式包,当 reqType 取值 signDataFinal 时,请求包采用本子包,其具体格式如下:

SignDataFinalReq ::= SEQUENCE {
keyIndex INTEGER,
keyValue OCTET STRING,
SessionID OCTET STRING
}

keyIndex 表示签名者私钥的索引值,如十进制 1 表示索引值为 1 的密钥;

keyValue 表示签名者私钥权限标识码;

SessionID 表示会话标识。

— SignDataFinalResp 包

SignDataFinalResp 包为多包数字签名结束响应格式包,当 respType 取值 signDataFinal 时,响应包采用本子包,其具体格式如下:

SignDataFinalResp ::= SEQUENCE {
respValue INTEGER,
signature OCTET STRING OPTIONAL
}

respValue 表明响应码,0 表示成功,非 0 表示错误;

signature 表示签名值,数据的结构应遵循GB/T 35276。

7.5.9 多包验证数字签名初始化​

— VerifySignedDataInitReq 包

VerifySignedDataInitReq 包为多包验证数字签名初始化请求格式包,当 reqType 取值 verifySignedDataInit 时,请求包采用本子包,其具体格式如下:

VerifySignedDataInitReq ::= SEQUENCE {
signMethod INTEGER,
signerPublicKey [0] IMPLICT OCTET STRING OPTIONAL,
signerIDLen [1] IMPLICT INTEGER OPTIONAL,
signerID [2] IMPLICT OCTET STRING OPTIONAL
}

signMethod 表明使用的签名算法类型,应遵循 GB/T 33560—2017 中 6.2.4 的规定;

signerPublicKey 表示签名者公钥,当 signMethod 为 SGD_SM3_SM2 时有效;

signerIDLen 表示签名者的 ID 长度,当 signMethod 为 SGD_SM3_SM2 时有效;

signerID 表示签名者的ID 值,当 signMethod 为 SGD_SM3_SM2时有效。

— VerifySignedDataInitResp 包

VerifySignedDataInitResp 包为多包验证数字签名初始化响应格式包,当 respType 取值 verifySignedDataInit 时,响应包采用本子包,其具体格式如下:

VerifySignedDataInitResp ::= SEQUENCE {
respValue INTEGER,
SessionID OCTET STRING OPTIONAL
}

respValue 表明响应码,0 表示成功,非 0 表示错误;

SessionID 表示会话标识。

7.5.10 多包验证数字签名更新​

— VerifySignedDataUpdateReq 包

VerifySignedDataUpdateReq 包为多包验证数字签名更新请求格式包,当 reqType 取值 verifySignedDataUpdate 时,请求包采用本子包,其具体格式如下:

VerifySignedDataUpdateReq ::= SEQUENCE {
SessionID OCTET STRING,
inDataLen INTEGER,
inData OCTET STRING
}

SessionID 表示会话标识;

inDataLen 表示数据明文长度;

inData 表示数据明文。

— VerifySignedDataUpdateResp 包

VerifySignedDataUpdateResp 包为多包验证数字签名更新响应格式包,当 respType 取值 verifySignedDataUpdate 时,响应包采用本子包,其具体格式如下:

VerifySignedDataUpdateResp ::= SEQUENCE {
respValue INTEGER,
SessionID OCTET STRING OPTIONAL
}

respValue 表明响应码,0 表示成功,非 0 表示错误;

SessionID 表示会话标识。

7.5.11 多包验证数字签名结束​

— VerifySignedDataFinalReq 包

VerifySignedDataFinalReq 包为多包验证数字签名结束请求格式包,当 reqType 取值 verifySignedDataFinal 时,请求包采用本子包,其具体格式如下:

VerifySignedDataFinalReq ::= SEQUENCE {
type INTEGER,
cert [0] IMPLICT Certificate OPTIONAL,
certSN [1] IMPLICT OCTET STRING OPTIONAL,
SessionID OCTET STRING,
signature OCTET STRING,
verifyLevel INTEGER
}

type 表示使用验证数字签名时使用证书或证书序列号,1 表示使用证书,2 表示使用证书序列号;

cert 表示签名证书,type 取值1时有效;

certSN 表示签名证书序列号,type 取值2时有效;

SessionID 表示会话标识;

signature 表示签名值,数据的结构应遵循 GB/T 35276。

verifyLevel 表示证书验证级别,0:验证时间,1:验证时间和根证书签名,2:验证时间、根证书签名和 CRL。

— VerifySignedDataFinalResp 包

VerifySignedDataFinalResp 包为多包验证数字签名结束响应格式包,当 respType 取值 verifySignedDataFinal 时,响应包采用本子包,其具体格式如下:

VerifySignedDataFinalResp ::= SEQUENCE {
respValue INTEGER
}

respValue 表明响应码,0 表示成功,非 0 表示错误。

7.5.12 消息签名​

— SignMessageReq 包

SignMessageReq 包为消息签名请求格式包,当 reqType 取值 signMessage 时,请求包采用本子包,其具体格式如下:

SignMessageReq ::= SEQUENCE {
signMethod INTEGER,
keyIndex INTEGER,
keyValue OCTET STRING,
signerIDLen [0] IMPLICT INTEGER OPTIONAL,
signerID [1] IMPLICT OCTET STRING OPTIONAL,
inDataLen INTEGER,
inData OCTET STRING,
originalText [0] IMPLICT BOOLEAN OPTIONAL,
certificateChain [1] IMPLICT BOOLEAN OPTIONAL,
crl [2] IMPLICT BOOLEAN OPTIONAL
}

signMethod 表明使用的签名算法类型,应遵循 GB/T 33560—2017 中 6.2.4 的规定;

keyIndex 表示签名者私钥的索引值,如十进制1表示索引值为1的密钥;

keyValue 表示签名者私钥权限标识码;

signerIDLen 表示签名者的 ID 长度,当 signMethod 为 SGD_SM3_SM2 时有效;

signerID 表示签名者的ID 值,当 signMethod 为 SGD_SM3_SM2 时有效;

inDataLen 表示待签名的数据长度;

inData 表示待签名的数据;

originalText 表示是否附加原文选项;

certificateChain 表示是否附加证书链选项;

crl 表示是否附加黑名单选项。

— SignMessageResp 包

SignMessageResp 包为消息签名响应格式包,当 respType 取值 signMessage 时,响应包采用本子包,其具体格式如下:

SignMessageResp ::= SEQUENCE {
respValue INTEGER,
signedMessage OCTET STRING OPTIONAL
}

respValue 表明响应码,0 表示成功,非 0 表示错误;

signedMessage 表示消息签名数据,消息的结构应遵循 GB/T 35275。

7.5.13 验证消息签名​

— VerifySignedMessageReq 包

VerifySignedMessageReq 包为验证消息签名请求格式包,当 reqType 取值 verifySignedMessage 时,请求包采用本子包,其具体格式如下:

VerifySignedMessageReq ::= SEQUENCE {
inDataLen INTEGER OPTIONAL,
inData OCTET STRING OPTIONAL,
signerIDLen [0] IMPLICT INTEGER OPTIONAL,
signerID [1] IMPLICT OCTET STRING OPTIONAL,
signedMessage OCTET STRING
}

inDataLen 表示数据原文长度,消息签名不附加原文时有效;

inData 表示数据原文,消息签名不附加原文时有效;

signerIDLen 表示签名者的ID 长度,当消息签名的签名算法为 SGD_SM3_SM2 时有效;

signerID 表示签名者的 ID 值,当消息签名的签名算法为 SGD_SM3_SM2 时有效;

signedMessage 表示输入的消息签名数据,消息的结构应遵循 GB/T 35275。

— VerifySignedMessageResp 包

VerifySignedMessageResp 包为验证消息签名响应格式包,当 respType 取值 verifySignedMessage 时,响应包采用本子包,其具体格式如下:

VerifySignedMessageResp ::= SEQUENCE {
respValue INTEGER
}

respValue 表明响应码,0 表示成功,非 0 表示错误。

附录 A(规范性附录)基于 HTTP 的消息协议语法规则​

A.1 概述​

第 7 章中描述的 ASN.1 格式是一种二进制格式,考虑到签名验证服务将被广泛用于各种 WEB 系统,而 WEB 系统更善于处理文本,为此在第 7 章的基础上,另行设计了一套基于 HTTP 协议的消息协议接口,便于各类 WEB 系统调用。

其工作原理与第 7 章中的请求响应模式类似,不同的是将消息格式从二进制的 ASN.1 格式,转换为易于在 WEB 应用和 HTTP 协议中传递的文本格式。

本附录只描述了从第 7 章的消息格式到对应 HTTP 格式的转换规则,而不再复述第 7 章中每个请求、响应的业务含义。

A.2 ASN.1 数据类型到 HTTP 格式的转化规则​

表A.1 ASN.1数据类型到 HTTP 格式的转化规则

ASN.1类型HTTP 字段类型示例
INTEGER数字的十进制文本表示123
BOOLEAN文本 TRUE 和 FALSE
GeneralizedTime带时区格式的时间字符串 YYYYMMDDhhmm[ss[.s...]]{Z|+hhmm|-hhmm}20131001120000Z+0800
OCTET STRING对 OCTET STRING 进行 BASE64 编码后的结果验证证书有效性请求包
Certificate对 DER 格式的证书进行 BASE64 编码后的结果

A.3 HTTP 请求的转换规则(urlencoded 格式)​

第 7 章中的请求分为两层结构,外层是公共结构。

SVSRequest ::= SEQUENCE {
version Version DEFAULT v1,
reqType ReqType,
request Request,
reqTime GeneralizedTime
}

这一层结构在转换为 HTTP 时,被转化为 HTTP Request Header 中的字段,原则如下:

a) 所有请求都采用 HTTP的 POST 模式;

b) reqType 作为 URL 的最终一级资源名,目录允许自定义,如:/SignServer/SignData;

c) version 被作为一个自定义的 HTTP 字段 SVS-Request-Version;

d) reqTime 被作为一个自定义的 HTTP 字段 SVS-Request-Time;

e) HTTPHeader 中的 Content-Type 为 application/x-www-form-urlencoded;

f) HTTPHeader 中的Content-Length 为第7章中请求数据的实际长度。

一个转换的实例如下:

POST /SignServer/SignData HTTP/1.1\r\n
SVS-Request-Version: v1\r\n
SVS-Request-Time: 20131001120000Z+0800\r\n
Content-Type: application/x-www-form-urlencoded\r\n
Content-Length: 实际请求 body 长度\r\n
\r\n
signMethod=...

注 1:将 reqType 直接作为 WEB 路径,而不是自定义的 HTTP 字段,是为了能在通用的 WEB 负载设备上进行负载。

注 2:允许自定义 URL 目录目的是允许灵活部署多套服务,对前端应用加以区分。

注 3:Content-Type 和 Content-Length 是 HTTP 协议的标准字段,此处按照其原意进行使用。

注 4:HTTP 协议中的其他标准字段如 Host、User-Agent 等,在此不再标出。

第 7 章中代表业务请求实体的 Request 类型,将被转换为一个 HTTP 的 form 表单:

param1=value1&param2=value2...paramN=valueN

比如 7.5.4 单包数字签名请求,将被转换为以下文本格式的表单:

signMethod=签名算法类型&keyIndex=私钥的索引&keyValue=私钥权限标识码&inDataLen=1024&inData=Base64 编码的待签名的数据原文。

A.4 HTTP 响应的转换规则(urlencoded 格式)​

第 7 章中的响应分为两层结构,外层是公共结构。

SVSRespond ::= SEQUENCE {
version Version DEFAULT v1,
respType RespType,
respond Respond,
respTime GeneralizedTime
}

这一层结构在转换为 HTTP 时,被转化为 HTTP Response Header 中的字段,原则如下:

a) respType 被作为一个自定义的 HTTP 字段 SVS-Response-type;

b) version 被作为一个自定义的 HTTP 字段 SVS-Response-version;

c) respTime 被作为一个自定义的 HTTP 字段 SVS-Response-Time;

d) 代表业务响应实体的 Response 类型,也被转换为一个 HTTP 的 form 表单。

以 7.5.4 单包数字签名请求为例,其转换后 HTTP 响应如下:

HTTP 200 OK\r\n
SVS-Response-Type: SignData\r\n
SVS-Response-Version: v1\r\n
SVS-Response-Time: 20131001120000Z+0800\r\n
Content-Type: text/html;charset=GB2312\r\n
Content-Length: 实际响应 body 的长度\r\n
\r\n
respValue=0&signature=Base64 编码的签名结果

A.5 HTTP 请求的转换规则(json 格式)​

第 7 章中的请求。

SVSRequest ::= SEQUENCE {
version Version DEFAULT v1,
reqType ReqType,
request Request,
reqTime GeneralizedTime
}

在转换为 HTTP 时,被转化为 HTTP Request body 中以 json 格式表示的数据,原则如下:

a) 所有请求都采用 HTTP 的 POST 模式;

b) reqType 被作为 URL的路径。

以 7.5.4 单包数字签名请求为例,其转换后 HTTP 请求如下:

POST /SignData HTTP/1.1\r\n
Content-Type: application/json\r\n
Content-Length: 实际请求 body 长度\r\n
\r\n
{
"version": "v1",
"reqType": "signData",
"request": {
"signMethod": "签名算法类型",
"keyIndex": "私钥的索引",
"keyValue": "私钥权限标识码",
"inDataLen": "待签名的数据原文长度",
"inData": "Base64 编码的待签名的数据原文"
},
"reqTime": "带时区格式的时间字符串"
}

注 1:将 reqType 直接作为 WEB 路径,是为了能在通用的 WEB 负载设备上进行负载。

注 2:Content-Type 和 Content-Length 是 HTTP 协议的标准字段,此处按照其原意进行使用。

注 3:对应 HTTP 协议中的其他标准字段如 Host、User-Agent 等,在此不再标出。

A.6 HTTP 响应的转换规则(json 格式)​

第 7 章中的响应。

SVSRespond ::= SEQUENCE {
version Version DEFAULT v1,
respType RespType,
respond Respond,
respTime GeneralizedTime
}

在转换为 HTTP 时,被转化为 HTTP Response body 中以 json 格式表示的数据。

以 7.5.4 单包数字签名请求为例,其转换后 HTTP 响应如下:

HTTP 200 OK\r\n
Content-Type: application/json;charset=UTF-8\r\n
Content-Length: 实际响应 body 的长度\r\n
\r\n
{
"version": "v1",
"reqType": "signData",
"respond": {
"respValue": "响应码",
"signature": "Base64 编码的签名结果"
},
"reqTime": "带时区格式的时间字符串"
}

附录 B(规范性附录)响应码定义和说明​

响应码定义和说明见表 B.1。

表B.1 响应码定义和说明

宏描述预定义值说明
GM_SUCCESS0正常返回
GM_ERROR_BASE0x04000000错误码起始值
GM_ERROR_CERT_ID0x04000001错误的证书标识
GM_ERROR_CERT_INFO_TYPE0x04000002错误的证书信息类型
GM_ERROR_SERVER_CONNECT0x04000003CRL 或 OCSP 服务器无法连接
GM_ERROR_SIGN_METHOD0x04000004签名算法类型错误
GM_ERROR_KEY_INDEX0x04000005签名者私钥索引值错误
GM_ERROR_KEY_VALUE0x04000006签名者私钥权限标识码错误
GM_ERROR_CERT0x04000007证书非法或服务器内不存在
GM_ERROR_CERT_DECODE0x04000008证书解码错误
GM_ERROR_CERT_INVALID_AF0x04000009证书过期
GM_ERROR_CERT_INVALID_BF0x0400000A证书尚未生效
GM_ERROR_CERT_REMOVED0x0400000B证书已被撤销
GM_INVALID_SIGNATURE0x0400000C签名无效
GM_INVALID_DATA_FORMAT0x0400000D数据格式错误
GM_SYSTEM_FAILURE0x0400000E系统内部错误
……0x0400000F~0x040000FF预留