0

SM9在国密SSL协议中的应用

 2 years ago
source link: http://suntus.github.io/2021/01/23/SM9%E5%9C%A8%E5%9B%BD%E5%AF%86SSL%E5%8D%8F%E8%AE%AE%E4%B8%AD%E7%9A%84%E5%BA%94%E7%94%A8/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

最主要目的是用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 格式的服务端证书,包括签名证书和加密证书:

opaque ASN.1Cert<1..2^24-1>;
struct {
ASN.1Cert certificate<0..2^24-1>;
} Certificate;

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

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

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 套件会发送使用服务端签名私钥签名的东西:

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

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

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列表:

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套件中,也是由客户端随机产生预主密钥,用服务端标识和公开参数产生的服务端公钥加密。

预主密钥的结构为:

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:

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

需要发送客户端用于密钥交换协议的参数

Opaque ClientIBSDHParams<1..2^16-1>;

2.6. CertificateVerify

跟IBC相同。

整体应用如图:
sslvpn-ibsdh

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

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

3.2. 主密钥

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

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK