国密起步4:GmSSL3生成证书并使用tls(SM2、SSL)

news2024/11/15 12:33:06

初级代码游戏的专栏介绍与文章目录-CSDN博客

我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。

这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。


        此文介绍如何使用gmssl的tls示例。

一、GmSSL的源码结构

        下载过来的目录结构如下:

        .vs是我加的,因为我习惯用visual studio查看源代码。

  • include 头文件
  • src C文件
  • tests 测试代码
  • tools 工具的代码,对应gmssl命令的command

二、gmssl命令

        安装完成就可以在系统里直接使用gmssl命令了:

user@vm-ubuntu:~/gmssl$ gmssl
Usage: gmssl command [options]
command -help

Commands:
  help              Print this help message
  version           Print version
  rand              Generate random bytes
  sm2keygen         Generate SM2 keypair
  sm2sign           Generate SM2 signature
  sm2verify         Verify SM2 signature
  sm2encrypt        Encrypt with SM2 public key
  sm2decrypt        Decrypt with SM2 private key
  sm3               Generate SM3 hash
  sm3hmac           Generate SM3 HMAC tag
  sm3_pbkdf2        Hash password into key using PBKDF2 algoritm
  sm3xmss_keygen    Generate SM3-XMSS keypair
  sm4_ecb           Encrypt or decrypt with SM4 ECB
  sm4_cbc           Encrypt or decrypt with SM4 CBC
  sm4_ctr           Encrypt or decrypt with SM4 CTR
  sm4_cfb           Encrypt or decrypt with SM4 CFB
  sm4_ofb           Encrypt or decrypt with SM4 OFB
  sm4_ccm           Encrypt or decrypt with SM4 CCM
  sm4_gcm           Encrypt or decrypt with SM4 GCM
  sm4_xts           Encrypt or decrypt with SM4 XTS
  sm4_cbc_sm3_hmac  Encrypt or decrypt with SM4 CBC with SM3-HMAC
  sm4_ctr_sm3_hmac  Encrypt or decrypt with SM4 CTR with SM3-HMAC
  sm4_cbc_mac       Generate SM4 CBC-MAC
  ghash             Generate GHASH
  zuc               Encrypt or decrypt with ZUC
  sm9setup          Generate SM9 master secret
  sm9keygen         Generate SM9 private key
  sm9sign           Generate SM9 signature
  sm9verify         Verify SM9 signature
  sm9encrypt        SM9 public key encryption
  sm9decrypt        SM9 decryption
  reqgen            Generate certificate signing request (CSR)
  reqsign           Generate certificate from CSR
  reqparse          Parse and print a CSR
  crlget            Download the CRL of given certificate
  crlgen            Sign a CRL with CA certificate and private key
  crlverify         Verify a CRL with issuer's certificate
  crlparse          Parse and print CRL
  certgen           Generate a self-signed certificate
  certparse         Parse and print certificates
  certverify        Verify certificate chain
  certrevoke        Revoke certificate and output RevokedCertificate record
  cmsparse          Parse CMS (cryptographic message syntax) file
  cmsencrypt        Generate CMS EnvelopedData
  cmsdecrypt        Decrypt CMS EnvelopedData
  cmssign           Generate CMS SignedData
  cmsverify         Verify CMS SignedData
  sdfinfo           Print SDF device info
  sdfdigest         Generate SM3 hash with SDF device
  sdfexport         Export SM2 signing public key from SDF device
  sdfsign           Generate SM2 signature with SDF internal private key
  sdfencrypt        SM2/SM4-CBC hybrid encryption with SDF device
  sdfdecrypt        SM2/SM4-CBC hybrid decryption with SDF device
  sdftest           Test vendor's SDF library and device
  tlcp_client       TLCP client
  tlcp_server       TLCP server
  tls12_client      TLS 1.2 client
  tls12_server      TLS 1.2 server
  tls13_client      TLS 1.3 client
  tls13_server      TLS 1.3 server

run `gmssl <command> -help` to print help of the given command


user@vm-ubuntu:~/gmssl$

        具体功能的源代码在tools目录下的同名C文件里。

三、使用tlcp_server

3.1 需要key、证书和密钥链

        直接运行gmssl tlcp_server是不行的,需要太多参数:

user@vm-ubuntu:~/gmssl$ gmssl tlcp_server
usage: tlcp_server [-port num] -cert file -key file [-pass str] -ex_key file [-ex_pass str] [-cacert file]

        对SSL有经验的知道这些参数就是证书和私钥。

3.2 生成根证书、服务端签名证书、服务端加密证书和密钥链

        我看了看源代码,国密需要的证书文件(-cert参数)里面必须包含两个证书,第一个对应-key,第二个对应-ex_key。具体我还没太了解,先跑起来再说。

        在一个干净的目录下执行以下脚本就可以生成所需的这些文件(执行前最好先仔细看一遍,因为我先删除了所有crt和pem!):

rm *.crt *.pem

echo 生成根证书
gmssl sm2keygen -pass 123456 -out cakey.pem -pubout capubkey.pem
gmssl certgen -C CN -ST PROVINCE -L LOCALITY -O ORG -OU ORGUINT -CN CA -days 3650 -key cakey.pem -key_usage keyCertSign -pass 123456 -out ca.crt
gmssl certparse -in ca.crt

echo 生成服务端签名证书
gmssl sm2keygen -pass 123456 -out s_signkey.pem -pubout s_signpubkey.pem
gmssl reqgen -C CN -ST PROVINCE -L LOCALITY -O ORG -OU ORGUINT -CN s_sign -key s_signkey.pem -pass 123456 -out s_signreq.pem
gmssl reqsign -in s_signreq.pem -days 3650 -key_usage digitalSignature -cacert ca.crt -key cakey.pem -pass 123456 -out s_sign.crt
gmssl certparse -in s_sign.crt

echo 生成服务端加密证书
gmssl sm2keygen -pass 123456 -out s_enckey.pem -pubout s_encpubkey.pem
gmssl reqgen -C CN -ST PROVINCE -L LOCALITY -O ORG -OU ORGUINT -CN s_enc -key s_enckey.pem -pass 123456 -out s_encreq.pem
gmssl reqsign -in s_encreq.pem -days 3650 -key_usage keyEncipherment -cacert ca.crt -key cakey.pem -pass 123456 -out s_enc.crt
gmssl certparse -in s_enc.crt

echo 生成证书链
cat s_sign.crt s_enc.crt | tee server.crt
gmssl certparse -in server.crt

        生成的文件如下:

-rw-rw-r-- 1 user user  684 Aug 27 16:49 ca.crt
-rw-rw-r-- 1 user user  436 Aug 27 16:49 cakey.pem
-rw-rw-r-- 1 user user  178 Aug 27 16:49 capubkey.pem
-rw-rw-r-- 1 user user  688 Aug 27 16:49 s_enc.crt
-rw-rw-r-- 1 user user  436 Aug 27 16:49 s_enckey.pem
-rw-rw-r-- 1 user user  178 Aug 27 16:49 s_encpubkey.pem
-rw-rw-r-- 1 user user  465 Aug 27 16:49 s_encreq.pem
-rw-rw-r-- 1 user user 1376 Aug 27 16:49 server.crt
-rw-rw-r-- 1 user user  688 Aug 27 16:49 s_sign.crt
-rw-rw-r-- 1 user user  436 Aug 27 16:49 s_signkey.pem
-rw-rw-r-- 1 user user  178 Aug 27 16:49 s_signpubkey.pem
-rw-rw-r-- 1 user user  465 Aug 27 16:49 s_signreq.pem

        注意一下日志,里面显示了算法,都是sm系列的。 

3.3 运行tlcp_server

        现在可以执行了:

启动服务端:
gmssl tlcp_server -port 10000 -cert ./server.crt -key ./s_signkey.pem -pass 123456 -ex_key ./s_enckey.pem -ex_pass 123456
启动客户端:
gmssl tlcp_client -host 127.0.0.1 -port 10000

        你需要在两个控制台分别执行服务端和客户端。

        服务端执行结果:

user@vm-ubuntu:~/gmssl$ gmssl tlcp_server -port 10000 -cert ./server.crt -key ./s_signkey.pem -pass 123456 -ex_key ./s_enckey.pem -ex_pass 123456
start listen ...

        这样就跑起来了。(你看我云淡风轻,其实折腾参数折腾了好久,怎么弄都不对,看了源代码才意识到证书里面必须包含两个证书)

        客户端也有证书参数,不过也可以不用,先跑起来看吧:

user@vm-ubuntu:~/gmssl$ gmssl tlcp_client -host 127.0.0.1 -port 10000
Connection established!

        再看看服务端:

Connection Established!

        现在可以在客户端随便输入,服务端会原样返回(服务端源代码显示确实如此)。


(这里是文档结束)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2085214.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RCS plot 包内置数据集使用时报错,如何解决?

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

【爬虫软件】YouTube评论采集工具

我用Python开发的油管评论批量采集软件。 软件界面&#xff1a; 采集结果&#xff1a; 演示视频&#xff1a; https://www.bilibili.com/video/BV1Ny411z7Wk 完整讲解&#xff1a; https://www.bilibili.com/read/cv35334276

Python进阶01-面向对象基础

零、文章目录 Python进阶01-面向对象基础 1、面向对象编程思想 &#xff08;1&#xff09;编程思想是什么 所谓的编程思想&#xff0c;就是人们利用计算机来解决实际问题的一种思维方式。常见的编程思想有面向过程和面向对象&#xff0c;很多计算机语言的语法各不相同&…

OpenHarmony南向开发:分布式软总线-softbus_tool使用规范

oftbus_tool 是 OpenHarmony 分布式软总线 API 调用测试工具&#xff0c;文件结构如下图所示。 softbus_tool 能够将软总线 interfaces 目录下的一些常用接口集中起来&#xff0c;供设备间搭建一些场景时使用&#xff08;比如设备绑定、BR 组网&#xff0c;BLE 组网&#xff0…

oracle的BITAND()函数用法

BITAND函数是计算两个数据的按位与 如下&#xff1a; 0010 0101 的按位与结果是0000 转为2进制就是0 0010 0011 的按位与结果是0010 转为2进制就是2

linux本地库迁移到阿里云云redis

背景 领导要我把另外一个不同账号的云redis进行同步 想法 阿里云不能直接备份还原redis&#xff0c;需要把备份文件先给搞到本地redis,然后本地redis进行同步到云redis 大概的逻辑是这样 实操 我这里下载的版本是4.0.2,文件如下: redis-shake-linux-amd64.tar.gz github下…

独立站除了Shopify还有什么?

国外电商平台仅占40-50%的市场份额。独立网站具有巨大的潜力。通过建立独立的跨境电商网站&#xff0c;您可以拥有自己的品牌销售体系。然而&#xff0c;对于很多平台卖家来说&#xff0c;建站可能并不是一件容易的事。在构建网站之前需要考虑几个问题&#xff0c;以及如何选择…

如何用wireshark分析找出url接口和param参数???

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

Java学习第四天

程序流程控制 顺序结构&#xff1a;按顺序从上往下执行&#xff1b; 分支结构&#xff1a; if分支结构&#xff08;区间匹配&#xff09; switch分支&#xff08;值匹配&#xff09; 循环结构&#xff1a; for循环 while循环 do-while循环 死循环 continue和break区别&…

鸿道Intewell实时操作系统MIPS架构生态:龙芯2K1000

在当今快速发展的工业互联时代&#xff0c;实时操作系统&#xff08;RTOS&#xff09;扮演着至关重要的角色。实时操作系统为工业制造、能源电力、轨道交通、汽车电子等领域提供了高实时、高可靠和高效率的技术支持。实时操作系统的设计注重实时性、并行性、可靠性和功耗&#…

基于分布式计算的电商系统设计与实现【系统设计、模型预测、大屏设计、海量数据、Hadoop集群】

文章目录 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主项目展示项目介绍 目录摘要Abstract1 引言1.1 研究背景1.2 国内外研究现状1.3 研究目的1.4 研究意义 2 关键技术理论介绍2.1 Hadoop相关组件介绍2.2 分布式集群介绍2.3 Pyecharts介绍2.4 Fl…

Keil The selected deivce“xxx“is unknown。。。识别到芯片依然烧录不进去程序解决或者未识别

之前一直用DAP烧录&#xff0c;用Jlink后烧录发现不行 在网上找了很多教程&#xff0c;版本等问题都一一排查依然不行 最后通过修改Port解决。。。。 将JTAG改成SW后就可识别芯片并且可以烧录。。。。

Vocechat本地部署结合内网穿透实现远程聊天交互实战方案(1)

文章目录 前言1. 拉取Vocechat2. 运行Vocechat3. 本地局域网访问4. 群晖安装Cpolar5. 配置公网地址6. 公网访问小结 7. 固定公网地址 前言 本文主要介绍如何在本地群晖NAS搭建一个自己的聊天服务Vocechat&#xff0c;并结合内网穿透工具实现使用任意浏览器远程访问进行智能聊天…

蚂蚁数科隐私计算技术平台FAIR入选2024数博会十大领先科技成果

8月28日&#xff0c;2024数博会领先科技成果发布会在贵阳国际生态会议中心举行&#xff0c;蚂蚁数科自主研发的隐私计算技术平台&#xff08;FAIR&#xff09;凭借领先的技术及广泛的应用场景脱颖而出&#xff0c;成功入选本届大会的“十大领先科技成果”奖。 据悉&#xff0c;…

HDMI、USB、WIFI的名称魔性更改

HDMI 授权组织把原来 HDMI 2.0 和 2.1 接口统称为 HDMI 2.1 的做法&#xff0c;等于是让电子设备上的 HDMI 2.1 标示丧失了区分作用&#xff0c;这操作就很离谱。 说起来类似这样的事情已经其实不是第一次发生了。 就拿现在最普及的 USB 接口来说&#xff0c;在 USB 3.2 标准…

音频检测电路 | 声音传感器模块 | 口哨开关 | Arduino

音频检测电路 | 声音传感器模块 | 口哨开关 | Arduino 案例分析电路设计1. **基本音频检测电路设计**电路结构:2. **灵敏度调节原理**方法:3. **非 MCU 控制的 LED 触发**设计步骤:4. **电路示例**5. **示意图(文本描述)**总结实验方法案例分析 一个硅胶娃娃,挤压或拍打…

(第三十八天)

1 、 harbor 软件包下载 https://github.com/search?qharbor&typerepositories 2 、出现拒绝连接错误&#xff0c;可能是由于容器没开 # 问题解决&#xff1a; [rootdocker ~] # curl localhost:5000/v2/_catalog curl : (7) Failed connect to localhost:5000; 拒绝…

零基础国产GD32单片机编程入门(一)GPIO输出Keil5工程创建含源码

文章目录 一.概要二.GD32单片机GPIO内部结构图三.GD32单片机GPIO输入输出信号流向四.GD32单片机GPIO引脚的复用以及重映射五.从零开始创建一个GD32F103C8T6单片机GPIO输出驱动LED灯例程六.工程源代码下载七.小结 一.概要 GPIO(general porpose intput output):单片机通用输入输…

如何禁止电脑访问网站

一、修改Hosts文件 找到Hosts文件&#xff1a;在Windows系统中&#xff0c;Hosts文件通常位于C:\Windows\System32\drivers\etc\目录下。 编辑Hosts文件&#xff1a;以管理员身份打开记事本或任意文本编辑器&#xff0c;然后找到并打开Hosts文件。 添加禁止访问的域名&#…

【小趴菜前端实习日记4】

el-table数据更新视图不更新的问题、el-dialog居中展示、el-form表单验证之对象属性验证、vue2过滤器 一、el-table数据更新视图不更新的问题二、el-dialog居中展示三、el-form表单验证之对象属性验证四、vue2过滤器 一、el-table数据更新视图不更新的问题 手动触发元素更新&a…