最主要目的是用IBC标识替换证书,可以减少握手时发送的数据量。
定义的套件有:
名称 | 值 |
---|---|
IBSDH_SM1_SM3 | 0xe0,0x05 |
IBC_SM1_SM3 | 0xe0,0x07 |
IBSDH_SM4_SM3 | 0xe0,0x15 |
IBC_SM4_SM3 | 0xe0,0x17 |
应用中有两种,IBC或者IBSDH。IBC是使用SM9的加密算法,IBSDH使用密钥交换协议。下边为了跟之前的套件做对比,会拿 ECC_SM4_SM3
套件做说明,本套件使用SM2的加密算法做密钥交换,使用证书做认证。
1. IBC
如果协商出了 IBC_SM1_SM3, IBC_SM4_SM3
这两个套件,会有以下影响。
1.1. Server Certificate
ECC_SM4_SM3
在这里会发送 X.509 v3 格式的服务端证书,包括签名证书和加密证书:
1 | opaque ASN.1Cert<1..2^24-1>; |
签名证书在前,加密证书在后。
IBC套件则会发送服务端的标识和IBC公共参数:
1 | opaque ASN.1IBCParam<1..2^24-1>; |
1.2. ServerKeyExchange
ECC_SM4_SM3
套件会发送使用服务端签名私钥签名的东西:
1 | digitally-signed struct { |
IBC套件则发送的是用IBC的签名私钥签名的一个东西,还包括服务端的IBC参数:
1 | ServerIBCParams params; |
这里的 IBCEncryptionKey
是服务端加密公钥。可以从服务端标识和公开参数生成,客户端需要生成,然后验证这个签名。长度为1024字节。ServerIBCParams
是服务端的密钥交换参数。
1.3. CertificateRequest
ECC_SM4_SM3
套件会发送服务端信任的CA的证书DN列表:
1 | enum { |
IBC套件中, certificate_authorities
里边存放的是IBC密钥管理中心(KGC)的信任域名列表。
1.4. Client Certificate
ECC_SM4_SM3
套件会发送客户端证书。
IBC套件中,会发送客户端标识和IBC公共参数。
1.5. ClientKeyExchange
ECC_SM4_SM3
套件会发送预主密钥,由客户端随机产生,用服务端证书中的SM2公钥加密。
IBC套件中,也是由客户端随机产生预主密钥,用服务端标识和公开参数产生的服务端公钥加密。
预主密钥的结构为:
1 | struct { |
1.6. CertificateVerify
包含对所有收发的握手数据的hash的一个签名。
ECC_SM4_SM3
套件用sm3做摘要,用sm2签名。
IBC使用SM3做摘要,用SM9做签名。
整体应用如图:
2. IBSDH
这里只说IBSDH对各个消息的影响。
2.1. Server Certificate
IBSDH套件会发送服务端标识和IBC公共参数。跟IBC相同。
2.2 ServerKeyExchange
发送密钥交换协议使用的各种参数。这里跟IBC不一样,参数不同,少了key:
1 | ServerIBSDHParams params; |
2.3. Certificate Request
跟IBC相同。
2.4. Client Certificate
跟IBC相同。
2.5. ClientKeyExchagne
需要发送客户端用于密钥交换协议的参数
1 | Opaque ClientIBSDHParams<1..2^16-1>; |
2.6. CertificateVerify
跟IBC相同。
整体应用如图:
3. 说明
3.1. 两个体系,签名和加密
其实跟国密SSL协议一样,分签名和加密,用户的私钥都是从主私钥中生成出来的。
3.2. 主密钥
包含4个东西: 主签名公钥,主签名私钥,主加密公钥,主加密私钥。这里的主公钥相当于之前CA证书中的公钥,但还不太一样。CA证书中的公钥只用于认证用户身份,不参与其他运算;但SM9的主公钥不仅参与用户身份的认证,还会参与到用户的签名、验签和加密过程。所以加载用户私钥的时候,还需要加载相应的主公钥。
主公钥和IBC公开信息和在一起,相当于CA。
另外,之前可以有多级CA,现在只有1级KGC。