TLCP 安全传输协议

编译 NTLS 功能

NTLS 在 Tongsuo 的术语中代指符合 GM/T 0024 SSL VPN 和 TLCP 协议的安全通信协议,其特点是采用加密证书/私钥和签名证书/私钥相分离的方式。 在编译 Tongsuo 的时候,需要显式的指定编译参数方可开启 NTLS 的支持:

./config enable-ntls

签发 SM2 双证书

双证书的签发流程是:根CA > 中间CA > 客户端/服务端证书,根CA证书签发中间CA证书,中间CA证书签发客户端和服务端的证书,包括签名证书和加密证书,这些证书的公钥算法都是SM2。

签发 SM2 双证书的详细流程参考官方文档:https://www.yuque.com/tsdoc/ts/sulazb

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

测试用证书在test_certs/double_cert目录下

server 端:命令行输入

openssl s_server -accept 127.0.0.1:4433 \
    -enc_cert test_certs/double_cert/SE.cert.pem \
    -enc_key test_certs/double_cert/SE.key.pem \
    -sign_cert test_certs/double_cert/SS.cert.pem \
    -sign_key test_certs/double_cert/SS.key.pem \
    -enable_ntls

client 端(测试 ECC-SM2-WITH-SM4-SM3 套件):命令行输入

openssl s_client -connect 127.0.0.1:4433 \
    -cipher ECC-SM2-WITH-SM4-SM3 -enable_ntls -ntls

client 端(测试 ECDHE-SM2-WITH-SM4-SM3 套件):命令行输入

openssl s_client -connect 127.0.0.1:4433 \
    -cipher ECDHE-SM2-WITH-SM4-SM3 \
    -sign_cert test_certs/double_cert/CS.cert.pem \
    -sign_key test_certs/double_cert/CS.key.pem \
    -enc_cert test_certs/double_cert/CE.cert.pem \
    -enc_key test_certs/double_cert/CE.key.pem \
    -enable_ntls -ntls

NTLS API 使用

server 端示例代码如下:

SSL_CTX *ctx;
const char *sign_key_file = "/path/to/sign_key_file";
const char *sign_cert_file = "/path/to/sign_cert_file";
const char *enc_key_file = "/path/to/enc_key_file";
const char *enc_cert_file = "/path/to/enc_cert_file";

/* 生成上下文 */
ctx = SSL_CTX_new(NTLS_server_method());

/* 允许使用国密双证书功能 */
SSL_CTX_enable_ntls(ctx);

/* 设置签名证书 */
SSL_CTX_use_sign_PrivateKey_file(ctx, sign_key_file, SSL_FILETYPE_PEM);
SSL_CTX_use_sign_certificate_file(ctx, sign_cert_file, SSL_FILETYPE_PEM);

/* 设置加密证书 */
SSL_CTX_use_enc_PrivateKey_file(ctx, enc_key_file, SSL_FILETYPE_PEM);
SSL_CTX_use_enc_certificate_file(ctx, enc_cert_file, SSL_FILETYPE_PEM);

/* 后续同标准 tls 流程 */
con = SSL_new(ctx);

client端示例代码如下:

SSL_CTX *ctx = NULL;

/* 生成上下文 */
ctx = SSL_CTX_new(NTLS_client_method());

/* 设置算法套件为 ECC-SM2-WITH-SM4-SM3 或者 ECDHE-SM2-WITH-SM4-SM3
 * 这一步并不强制,默认 ECC-SM2-WITH-SM4-SM3 优先
 */
SSL_CTX_set_cipher_list(ctx, "ECC-SM2-WITH-SM4-SM3");

/* 设置签名证书,加密证书,这一步参考服务端相关代码
 * 仅ECDHE-SM2-WITH-SM4-SM3套件需要这一步
 */

说明

由于国密双证书的握手流程和协议版本号与标准tls流程存在一定的不同,因此我们选择将双证书的实现(代码里命名为 ntls )同现有的 tls 状态机拆分开来,然后在入口处通过对请求的版本号进行识别,然后使其进入正确的状态机。

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