# babassl-lns **Repository Path**: supergame/babassl-lns ## Basic Information - **Project Name**: babassl-lns - **Description**: 隐私计算之商用密码安全:alibaba的openssl for loongson - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2025-06-05 - **Last Updated**: 2025-06-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## babassl 8.3.0 base openssl- chf@tsinghua.org.cn ## 编译BabaSSL和Tengine 源码编译打包及使用 ### 编译打包 ``` 在makefile当前文件文件夹下执行make,组件安装: yum install gcc rpm-build rpm-devel rpmlint make python3 bash coreutils diffutils yum -y install openssl openssl-devel make zlib zlib-devel gcc gcc-c++ libtool pcre pcre-devel yum install openssl.loongarch64 https://zhuanlan.zhihu.com/p/456044170 下载源码: git clone https://github.com/BabaSSL/BabaSSL/releases git clone https://github.com/alibaba/tengine.git 编译tengine: ./configure --add-module=modules/ngx_openssl_ntls \ --without-http_gzip_module \ --with-openssl=../BabaSSL-8.3.0 \ --with-openssl-opt="--strict-warnings enable-ntls" \ --with-http_ssl_module --with-stream \ --with-stream_ssl_module --with-stream_sni \ --prefix=/usr/local/nginx 没有babassl的场合使用以下: // --with-openssl=/root/openssl-1.1.1g 配置 Tengine 开启 NTLS 一个开启了 NTLS 的 Tengine 配置文件的例子: worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; server { listen 443 ssl; server_name localhost; enable_ntls on; ssl_sign_certificate server_sign.crt; ssl_sign_certificate_key server_sign.key; ssl_enc_certificate server_enc.crt; ssl_enc_certificate_key server_enc.key; location / { return 200 "body $ssl_protocol:$ssl_cipher"; } } } stream { server { listen 8443 ssl; enable_ntls on; ssl_sign_certificate server_sign.crt; ssl_sign_certificate_key server_sign.key; ssl_enc_certificate server_enc.crt; ssl_enc_certificate_key server_enc.key; return "body $ssl_protocol:$ssl_cipher"; } } 测试 NTLS 可以使用 BabaSSL 的 s_client 工具对开启了 NTLS 的 Tengine 进行测试。 具体可以参考:https://babassl.readthedocs.io/zh/latest/Tutorial/SM/ntls/ ``` ### NTLS使用手册 ``` 编译NTLS功能 NTLS在BabaSSL的属于中代指符合GM/T 0024 SSL VPN和TLCP协议的安全通信协议,其特点是采用加密证书/私钥和签名证书/私钥相分离的方式。 在编译BabaSSL的时候,需要显式的指定编译参数方可开启NTLS的支持: ./config enable-ntls 特性使用(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 在你的client/server中使用(相关api使用) server端 int main() { //变量定义 const SSL_METHOD *meth = NULL; SSL_CTX *ctx = NULL; 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"; //双证书相关server的各种定义 meth = NTLS_server_method(); //生成上下文 ctx = SSL_CTX_new(meth); //允许使用国密双证书功能 SSL_CTX_enable_ntls(ctx); //加载签名证书,加密证书 if (sign_key_file) { if (!SSL_CTX_use_sign_PrivateKey_file(cctx->ctx, sign_key_file, SSL_FILETYPE_PEM)) goto err; } if (sign_cert_file) { if (!SSL_CTX_use_sign_certificate_file(cctx->ctx, sign_cert_file, SSL_FILETYPE_PEM)) goto err; } if (enc_key_file) { if (!SSL_CTX_use_enc_PrivateKey_file(cctx->ctx, enc_key_file, SSL_FILETYPE_PEM)) goto err; } if (enc_cert_file) { if (!SSL_CTX_use_enc_certificate_file(cctx->ctx, enc_cert_file, SSL_FILETYPE_PEM)) goto err; } //...后续同标准tls流程 con = SSL_new(ctx); } client端 int main() { //变量定义 const SSL_METHOD *meth = NULL; SSL_CTX *ctx = NULL; 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"; //双证书相关client的各种定义 meth = NTLS_client_method(); //生成上下文 ctx = SSL_CTX_new(meth); //允许使用国密双证书功能 SSL_CTX_enable_ntls(ctx); //设置算法套件为ECC-SM2-WITH-SM4-SM3或者ECDHE-SM2-WITH-SM4-SM3 //这一步并不强制编写,默认ECC-SM2-WITH-SM4-SM3优先 if(SSL_CTX_set_cipher_list(ctx, "ECC-SM2-WITH-SM4-SM3") <= 0) goto err; //加载签名证书,加密证书,仅ECDHE-SM2-WITH-SM4-SM3套件需要这一步, //该部分流程用...begin...和...end...注明 // ...begin... if (sign_key_file) { if (!SSL_CTX_use_sign_PrivateKey_file(cctx->ctx, sign_key_file, SSL_FILETYPE_PEM)) goto err; } if (sign_cert_file) { if (!SSL_CTX_use_sign_certificate_file(cctx->ctx, sign_cert_file, SSL_FILETYPE_PEM)) goto err; } if (enc_key_file) { if (!SSL_CTX_use_enc_PrivateKey_file(cctx->ctx, enc_key_file, SSL_FILETYPE_PEM)) goto err; } if (enc_cert_file) { if (!SSL_CTX_use_enc_certificate_file(cctx->ctx, enc_cert_file, SSL_FILETYPE_PEM)) goto err; } // ...end... //...后续同标准tls流程 con = SSL_new(ctx); } 重要说明 由于国密双证书的握手流程和协议版本号与标准tls流程存在一定的不同,因此我们选择将双证书的实现(代码里命名为ntls)同现有的tls状态机拆分开来,然后在入口处通过对请求的版本号进行识别,然后使其进入正确的状态机。然而比较麻烦的是,openssl的bio体系并没有实现msg_peek的功能,因此目前的实现是通过获取链接的fd,然后通过recv(fd, MSG_PEEK)的形式来获取链接的协议的,造成的困扰是如果你实现了一套非socket形式的bio,则无法使用这个功能,该问题我们后续会视情况进行修复 ``` ## openssl性能测试 ``` https://blog.csdn.net/scarecrow_byr/article/details/115264375 -v0.1 2020.11.20 Sherlock init -v0.2 2021. 3.27 Sherlock add openssl speed代码分析 简介: 文本介绍openssl性能测试的相关方法,包括openssl自带的speed测试,加硬件engine 的测。并且简单分析下openssl speed测试的代码。 ``` ### openssl基本命令 ``` AES对称加解密: openssl enc -aes-128-cbc -in data -out key_encrypt -K 12345678901234567890 -iv 12345678 openssl enc -aes-128-cbc -in key_encrypt -out key_decrypt -K 12345678901234567890 -iv 12345678 -d 公钥加密: openssl rsautl -encrypt -in rsa_test -inkey test_pub.key -pubin -out rsa_test.en -engine uadk 公钥生成: openssl rsa -in test.key -pubout -out test_pub.key -engine uadk 私钥生成: openssl genrsa -out test.key -engine uadk 4096 私钥解密: openssl rsautl -decrypt -in rsa_test.en -inkey test.key -out rsa_test.de -engine uadk 签名: openssl rsautl -sign -in msg.txt -inkey test.key -out signed.txt -engine uadk 认证: openssl rsautl -verify -in signed.txt -inkey test_pub.key -pubin -out verified.txt -engine uadk 哈希: openssl md5/sha1/sha256/sm3 -engine uadk data openssl md5/sha1/sha256/sm3 data 如上,有-engine xxx的表示用执行的硬件加解密engine做任务,没有指定就是用openssl里提供的软件计算方法搞。 在非对称加解密的测试中,我们使用RSA算法。需要先生成私钥,然后生成公钥,然后用 秘钥进行加解密和签名、认证的测试。 ``` ### 性能测试:openssl speed命令 ``` openssl speed aes openssl speed rsa openssl speed -engine uadk -async_jobs 1 -evp md5 openssl speed -engine uadk -async_jobs 1 -evp aes-128-cbc openssl speed -engine uadk -elapsed rsa2048 // 如下例子 openssl speed -engine uadk -elapsed -async_jobs 1 rsa2048 openssl speed -engine uadk -elapsed -async_jobs 36 rsa2048 如上,加了-async_jobs使用了openssl里的异步机制,如果engine里使用过了openssl里的 异步机制,这里就会触发engine里的异步机制生效。 openssl speed的代码在openssl/apps/speed.c,拿同步rsa2048为例。 main /* 分配input,output buffer */ +-> app_malloc(buflen, "input buffer"); /* 只看同步,即async_jobs = 0的情况 */ +-> run_benchmark(async_jobs, RSA_sign_loop, loopargs); /* * 可以看到这里的内存使用模型是,反复的用一个buffer做sign。如果 * engine的实现没有另外申请内存,这个测试将反复用一块固定的buffer。 */ +-> RSA_sign_loop +-> RSA_sign /* 如果下面适配的是openssl engine, 可以实现如下的回调函数支持 */ +-> rsa->meth->rsa_sign +-> RSA_private_encrypt +-> rsa->meth->rsa_priv_enc ``` ## 问题与解答QA ``` 问题1: client-arg.c:11:10: fatal error: openssl/err.h: No such file or directory ``` #### 软件架构 软件架构说明 #### 安装教程 1. xxxx 2. xxxx 3. xxxx #### 使用说明 1. xxxx 2. xxxx 3. xxxx #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)