TLS 1.3 使用商密套件(RFC 8998)

TLS 1.3 协议在 RFC 8998 规范中定义:https://datatracker.ietf.org/doc/html/rfc8998

重要说明

在tls1.3的标准中,现有的任意算法套件均不强制使用某一个签名算法,而为了国密算法的统一性,我们在RFC8998的定义中明确要求了tls1.3+国密的两个套件:TLS_SM4_GCM_SM3TLS_SM4_CCM_SM3,需要强制使用SM2作为签名算法(即server端需要配置国密证书)。 然而出于兼容性考虑,现有的大量软件和设备并没有部署国密证书,为保证大家能尽快体验到更快更便捷的国密流程,我们的实现中并不完全强制签名算法为SM2,而是提供了一个开关来由用户选择是否要开启这种强制措施(默认关闭),在本手册后续会介绍相关用法。

签发 SM2 证书

此例使用Tongsuo签发一个自签名的证书:

# 生成 SM2 私钥
openssl ecparam -genkey -name SM2 -out sm2.key

# 生成证书签名请求
openssl req -new -key sm2.key -out sm2.csr \
    -sm3 -sigopt "sm2_id:1234567812345678"

# 签名证书
openssl x509 -req -in sm2.csr -signkey sm2.key \
    -out sm2.crt -sm3 -sm2-id 1234567812345678 \
    -sigopt "sm2_id:1234567812345678"

特性使用(s_client/s_server 工具验证)

server端:命令行输入

openssl s_server \
    -cert test_certs/sm2_cert/sm2-second.crt \
    -key test_certs/sm2_cert/sm2-second.key \
    -accept 127.0.0.1:4433

client端:命令行输入

openssl s_client -connect 127.0.0.1:4433 \
    -tls1_3 -ciphersuites TLS_SM4_GCM_SM3

在你的client/server中使用(相关api使用)

server端:和标准tls的server一样,无需做任何修改,仅需要注意是否强制签名算法使用SM2(虽然我们在标准中定义了tls1.3+国密的算法套件必须强制使用sm2签名算法,但由于国密证书还不够普及,所以我们在实现上暂时放宽了这个限制,而是提供了一个开关),通过下面的代码开启/关闭:

/* enable */
SSL_CTX_enable_sm_tls13_strict(ctx);

/* disable */
SSL_CTX_disable_sm_tls13_strict(ctx);

client端:client无需做修改,只需要强制指定算法套件为TLS_SM4_GCM_SM3/TLS_SM4_CCM_SM3(国密套件的默认优先级低于现有的tls1.3算法套件),通过这种方式设定:

SSL_CTX_set_ciphersuites(ctx, "TLS_SM4_GCM_SM3");
Copyright © openanolis.cn 2023 all right reserved
作者: OpenAnolis
链接: https://github.com/openanolis/whitebook-shangmi
来源: OpenAnolis
本文原创发布于「OpenAnolis」,转载请注明出处,谢谢合作!