当前位置: 首页 > news >正文

GMSSL-通信

死磕GMSSL通信-C/C++系列(一)

最近再做国密通信的项目开发,以为国密也就简单的集成一个库就可以完事了,没想到能有这么多坑。遂写下文章,避免重复踩坑。以下国密通信的坑有以下场景

1、使用GMSSL guanzhi/GmSSL进行通信

2、使用加密套件SM2-WITH-SMS4-SM3

使用心得

​ GmSSL这个库的问题很多,发现许多库和它都不能正常通信,都需要修改代码,不是修改客户端就是修改服务端,而且这个开源项目基本处于不维护的状态,如果准备集成的GM通信的,优先选择铜锁/Tongsuo 这个项目,毕竟背后是商业公司在维护。

1、经过最近几天的测试,发现

window编译

网上有好多编译教程,我这里也不细说了,大概步骤如下

安装Perl软件:从Perl官网(https://www.activestate.com/products/perl/downloads/)下载安装包直接安装就行了。安装完好后命令行执行【perl -v】就可以查看版本信息

以64位为列,打开“ VS2015 x64 本机工具命令提示符”

image-20240412170837915

执行:perl Configure VC-WIN64A no-asm no-shared

image-20240412171021233

  • VC-WIN32 表示编译选项生成32位的库
  • VC-WIN64A 表示编译选项生成64位的库
  • VC-WIN64I 表示编译选项生成IA64的库,使用安腾cpu的需要使用此选项,安腾x64架构是inter自家的,比较少见
  • no-asm 表示不使用汇编,如果本地安装了nasm工具,可以不使用此选项
  • –prefix=D:xxx\xx 表示输出目录

执行nmake

image-20240412171044150

最后程序根目录生成俩个静态库 libcrypto.lib、libssl.lib

生成证书

这里就不提供证书生成的过程了,网上生成的教程很多,GMSSL需要五个证书

  1. CA.cert.pem

  2. SE.cert.pem

  3. SE.key.pem

  4. SS.cert.pem

  5. SS.key.pem

    [注意]

    理论上客户端和服务端的证书应该是俩套,也可以直接客户端和服务器用一样的证书,我这里直接用了一套,大家可以自行测试俩套的

GMSSL双向通信

server端代码

/** Copyright 1998-2016 The OpenSSL Project Authors. All Rights Reserved.** Licensed under the OpenSSL license (the "License").  You may not use* this file except in compliance with the License.  You can obtain a copy* in the file LICENSE in the source distribution or at* https://www.openssl.org/source/license.html*//*-* A minimal program to serve an SSL connection.* It uses blocking.* saccept host:port* host is the interface IP to use.  If any interface, use *:port* The default it *:4433** cc -I../../include saccept.c -L../.. -lssl -lcrypto -ldl*/#include <stdio.h>
#include <signal.h>
#include <openssl/err.h>
#include <openssl/ssl.h>#define CA_CERT_FILE            "CA.cert.pem"
#define SIGN_CERT_FILE          "SS.cert.pem"
#define SIGN_KEY_FILE           "SS.key.pem"
#define ENCODE_CERT_FILE        "SE.cert.pem"
#define ENCODE_KEY_FILE         "SE.key.pem"static int done = 0;void interrupt(int sig)
{done = 1;
}int main(int argc, char* argv[])
{char* port = "0.0.0.0:9999";BIO* in = NULL;BIO* ssl_bio, * tmp;SSL_CTX* ctx;char buf[512];int ret = 1, i;ctx = SSL_CTX_new(GMTLS_server_method());SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);
#if 1if (!SSL_CTX_load_verify_locations(ctx, CA_CERT_FILE, NULL)){goto err;}if (!SSL_CTX_use_certificate_file(ctx, SIGN_CERT_FILE, SSL_FILETYPE_PEM))goto err;if (!
http://www.lryc.cn/news/337536.html

相关文章:

  • linux 磁盘分区Inode使用率达到100%,导致网站无法创建文件报错 failed:No space leftondevice(
  • 探索Python库的奇妙世界
  • SQL Server 存储函数(funGetId):唯一ID
  • 当你的项目体积比较大?你如何做性能优化
  • 第6章:6.3.2 一张表总结正则表达式的语法 (MATLAB入门课程)
  • VBA 实现outlook 当邮件设置category: red 即触发自动创建jira issue
  • 办公软件巨头CCED、WPS迎来新挑战,新款办公软件已形成普及之势
  • 架构设计-订单系统之订单系统的架构进化
  • 性能升级,INDEMIND机器人AI Kit助力产业再蜕变
  • 2024年妈妈杯数学建模C题思路分析-物流网络分拣中心货量预测及人员排班
  • prometheus\skywalking\splunk功能的区别
  • Harmony鸿蒙南向驱动开发-SPI接口使用
  • 芒果YOLOv7改进96:检测头篇DynamicHead动态检测头:即插即用|DynamicHead检测头,尺度感知、空间感知、任务感知
  • 独一无二:探索单例模式在现代编程中的奥秘与实践
  • centos7 安装 rabbitmq3.8.5
  • 利用SOCKS5代理和代理IP提升网络安全与匿名性
  • C++list模拟实现
  • 设计模式(22):解释器模式
  • kubernetes docker版本安装测试
  • 策略模式:灵活调整算法的设计精髓
  • [INS-30014]无法检查指定的位置是否位于 CFS 上
  • 机器学习和深度学习 -- 李宏毅(笔记与个人理解)Day 13
  • [Python图像识别] 五十二.水书图像识别 (2)基于机器学习的濒危水书古文字识别研究
  • Jmeter针对多种响应断言的判断
  • Harmony鸿蒙南向驱动开发-Regulator接口使用
  • 【opencv】示例-grabcut.cpp 使用OpenCV库的GrabCut算法进行图像分割
  • GEE数据集——巴基斯坦国家级土壤侵蚀数据集(2005 年和 2015 年)
  • 服务器代理
  • 【SGDR】《SGDR:Stochastic Gradient Descent with Warm Restarts》
  • 如何将arping以及所有依赖打包安装到另外一台离线ubuntu机器