0%

SM9在国密SSL协议中的应用

最主要目的是用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
2
3
4
opaque ASN.1Cert<1..2^24-1>;
struct {
ASN.1Cert certificate<0..2^24-1>;
} Certificate;

签名证书在前,加密证书在后。

IBC套件则会发送服务端的标识和IBC公共参数:

1
2
3
4
5
opaque ASN.1IBCParam<1..2^24-1>;
struct {
opaque ibc_id<1..2^16-1>;
ASN.1IBCParam ibc_parameter;
} Certificate;

1.2. ServerKeyExchange

ECC_SM4_SM3 套件会发送使用服务端签名私钥签名的东西:

1
2
3
4
5
digitally-signed struct {
opaque client_random[32];
opaque server_random[32];
opaque ASN.1Cert<1..2^24-1>;
} signed_params;

IBC套件则发送的是用IBC的签名私钥签名的一个东西,还包括服务端的IBC参数:

1
2
3
4
5
6
7
ServerIBCParams params;
digitally-signed struct {
opaque client_random[32];
opaque server_random[32];
ServerIBCParams params;
opaque IBCEncryptionKey[1024];
} signed_params;

这里的 IBCEncryptionKey 是服务端加密公钥。可以从服务端标识和公开参数生成,客户端需要生成,然后验证这个签名。长度为1024字节。
ServerIBCParams是服务端的密钥交换参数。

1.3. CertificateRequest

ECC_SM4_SM3 套件会发送服务端信任的CA的证书DN列表:

1
2
3
4
5
6
7
8
enum {
rsa_sign(1), ecdsa_sign(64), ibc_params(80), (255)
} ClientCertificateType;

struct {
ClientCertificateType certificate_types<1..2^8-1>;
DistinguishedName certificate_authorities<0..2^16-1>;
} CertificateRequest;

IBC套件中, certificate_authorities 里边存放的是IBC密钥管理中心(KGC)的信任域名列表。

1.4. Client Certificate

ECC_SM4_SM3 套件会发送客户端证书。
IBC套件中,会发送客户端标识和IBC公共参数。

1.5. ClientKeyExchange

ECC_SM4_SM3 套件会发送预主密钥,由客户端随机产生,用服务端证书中的SM2公钥加密。

IBC套件中,也是由客户端随机产生预主密钥,用服务端标识和公开参数产生的服务端公钥加密。

预主密钥的结构为:

1
2
3
4
struct {
ProtocolVersion client_version;
opaque random[46];
} PreMasterSecret;

1.6. CertificateVerify

包含对所有收发的握手数据的hash的一个签名。

ECC_SM4_SM3 套件用sm3做摘要,用sm2签名。

IBC使用SM3做摘要,用SM9做签名。

整体应用如图:
sslvpn-ibc

2. IBSDH

这里只说IBSDH对各个消息的影响。

2.1. Server Certificate

IBSDH套件会发送服务端标识和IBC公共参数。跟IBC相同。

2.2 ServerKeyExchange

发送密钥交换协议使用的各种参数。这里跟IBC不一样,参数不同,少了key:

1
2
3
4
5
6
ServerIBSDHParams params;
digitally-signed struct {
opaque client_random[32];
opaque server_random[32];
ServerIBSDHParams params;
} signed_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相同。

整体应用如图:
sslvpn-ibsdh

3. 说明

3.1. 两个体系,签名和加密

其实跟国密SSL协议一样,分签名和加密,用户的私钥都是从主私钥中生成出来的。

3.2. 主密钥

包含4个东西: 主签名公钥,主签名私钥,主加密公钥,主加密私钥。这里的主公钥相当于之前CA证书中的公钥,但还不太一样。CA证书中的公钥只用于认证用户身份,不参与其他运算;但SM9的主公钥不仅参与用户身份的认证,还会参与到用户的签名、验签和加密过程。所以加载用户私钥的时候,还需要加载相应的主公钥。

主公钥和IBC公开信息和在一起,相当于CA。

另外,之前可以有多级CA,现在只有1级KGC。