支持国密ssl的curl编译和测试验证(下)

上接支持国密ssl的curl编译和测试验证(上)

4.4 验证国密http2协议功能

命令:/opt/gmcurl/bin/curl --http2 --tlcp "https://www.test.com:9443/" -kv输出:* Host www.test.com:9441 was resolved.
* IPv6: (none)
* IPv4: 127.0.0.1
*   Trying 127.0.0.1:9441...
* Connected to www.test.com (127.0.0.1) port 9441
* ALPN: curl offers h2,http/1.1
* (101) (OUT), , Unknown (1):
* (101) (IN), , Unknown (2):
* (101) (IN), , Unknown (11):
* (101) (IN), , Unknown (12):
* (101) (IN), , Unknown (14):
* (101) (OUT), , Unknown (16):
* (101) (OUT), , Change cipher spec (1):
* (101) (OUT), , Unknown (20):
* (101) (IN), , Unknown (20):
* SSL connection using NTLSv1.1 / ECC-SM2-SM4-GCM-SM3 / UNDEF / SM2
* ALPN: server did not agree on a protocol. Uses default.
* Server certificate:
*  subject: C=CN; ST=BJ; L=HaiDian; O=Beijing JNTA Technology LTD.; OU=BSRC of TASS; CN=server sign (SM2)
*  start date: May 23 02:45:48 2019 GMT
*  expire date: Jul  1 02:45:48 2023 GMT
*  issuer: C=CN; ST=BJ; L=HaiDian; O=Beijing JNTA Technology LTD.; OU=SORB of TASS; CN=Test CA (SM2)
*  SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway.
*   Certificate level 0: Public key type SM2/SM2 (256/128 Bits/secBits), signed using SM2-with-SM3
*   Certificate level 1: Public key type SM2/SM2 (256/128 Bits/secBits), signed using SM2-with-SM3
* using HTTP/1.x
> GET / HTTP/1.1
> Host: www.test.com:9441
> User-Agent: curl/8.5.0-DEV
> Accept: */*
> 
* Received HTTP/0.9 when not allowed
* Closing connection
* (101) (OUT), , close notify (256):
curl: (1) Received HTTP/0.9 when not allowed

发现用国密ssl握手的http2协议支持是有问题的。

5. 原因分析

分析后发现,铜锁可以读取客户端Client Hello报文中的ALPN信息,而且nginx正常地处理了ALPN消息并选择了h2协议,然而抓包发现铜锁SSL在握手响应的时候是没有生成应用扩展信息响应给客户端,导致客户端不能知道nginx是否能够支持http2,而nginx却已经将该连接切换到http2模式,所以客户端发送过来的是HTTP/1.1的请求的nginx,nginx不能处理该响应,发送了一个HTTP/0.9的消息进行拒绝。

然后对比了一下tls和ntls的实现源码,发现ossl_statem_server13_write_transition和ossl_statem_server_write_transition_ntls两个写状态转移函数,确实有差异:

// tls部分代码:case TLS_ST_SW_CHANGE:if (s->hello_retry_request == SSL_HRR_PENDING)st->hand_state = TLS_ST_EARLY_DATA;elsest->hand_state = TLS_ST_SW_ENCRYPTED_EXTENSIONS;return WRITE_TRAN_CONTINUE;case TLS_ST_SW_ENCRYPTED_EXTENSIONS:if (s->hit)st->hand_state = TLS_ST_SW_FINISHED;else if (send_certificate_request(s))st->hand_state = TLS_ST_SW_CERT_REQ;elsest->hand_state = TLS_ST_SW_CERT;return WRITE_TRAN_CONTINUE;

// ntls部分代码:case TLS_ST_SW_SRVR_HELLO:if (s->hit) {if (s->ext.ticket_expected)st->hand_state = TLS_ST_SW_SESSION_TICKET;elsest->hand_state = TLS_ST_SW_CHANGE;} else {/* Check if it is anon DH or anon ECDH, *//* normal PSK or SRP */if (!(s->s3->tmp.new_cipher->algorithm_auth &(SSL_aNULL | SSL_aSRP | SSL_aPSK))) {st->hand_state = TLS_ST_SW_CERT;} else if (send_server_key_exchange(s)) {st->hand_state = TLS_ST_SW_KEY_EXCH;} else if (send_certificate_request_ntls(s)) {st->hand_state = TLS_ST_SW_CERT_REQ;} else {st->hand_state = TLS_ST_SW_SRVR_DONE;}}return WRITE_TRAN_CONTINUE;......case TLS_ST_SW_CHANGE:st->hand_state = TLS_ST_SW_FINISHED;return WRITE_TRAN_CONTINUE;

导致ntls即国密ssl协议在写状态转义逻辑中没有机会进入到TLS_ST_SW_ENCRYPTED_EXTENSIONS状态,而TLS_ST_SW_ENCRYPTED_EXTENSIONS状态就是写应用扩展信息的逻辑,所以产生了以上问题。

至于怎么修改铜锁的代码,暂时还没有了解透里面的代码逻辑,只能先搁置了。

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

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

相关文章

Programming Abstractions in C阅读笔记:p303-p305

《Programming Abstractions in C》学习第74天,p303-p305总结,总计3页。 一、技术总结 1.时间复杂度分类(complexity classes) ClassNotationExampleconstantO(1)Returning the first element in an arraylogarithmicO(logN)Binary search in a sorte…

【SRE系列之Jenkins的使用】--实现ssh和http克隆

1、Jenkins的概念 1.1Jenkins的介绍 Jenkins是一个独立的开源软件项目,是基于Java开发的一种CI(Continuous integration,持续集成) &CD (Continuous Delivery,持续交付)工具,用于监控持续重复的工作&a…

简单聊聊现在的AI

简单聊聊现在的AI 前言主要的AI模型和形式LLM - Large Language Model(大语言模型)BOT(机器人)LAM - Large Action Models(大行动模型)Agent(智能体) 结尾 前言 好久没回来写博客&a…

LeetCode--72

72. 编辑距离 给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作: 插入一个字符删除一个字符替换一个字符 示例 1: 输入:word1 "horse", word2 …

C语言break 关键字在 switch 语句中应注意什么?

一、问题 switch 语句由 switch 分⽀点和多个 case 处理⼊⼜构成,每个 case 不具有处理互斥的功能,⼀个 case 执⾏完后,默认继续执⾏下⼀个 case。此时,如果不希望继续执⾏下⼀个 case,可以⽤ break 语句退出 switch 结构。break …

web安全学习笔记【17】——信息打点(7)

信息打点-APP资产&知识产权&应用监控&静态提取&动态抓包&动态调试 #知识点: 1、业务资产-应用类型分类 2、Web单域名获取-接口查询 3、Web子域名获取-解析枚举 4、Web架构资产-平台指纹识别 ------------------------------------ 1、开源-CMS指…

C# 通过共享内存调用C++ 算法

需求: C#程序调用 C开发的dll. 一种C# 程序调用c 算法方案_算法怎么被c#调用-CSDN博客 上回书说到,将c算法封装为dll 插件,c加载后,暴露C风格接口,然后供C#调用。但是这样有几个问题: 1,一是…

【编程语言之·调试输出打印技巧】

系列文章目录 文章目录 前言一、调试打印输出开关1.1宏定义应用 二、打印错误的函数2.1 perror()2.2 strerror() 三、示例总结 前言 一、调试打印输出开关 1.1宏定义应用 示例1: #define DEBUG_ON 0 #if DEBUG_ON #define DEBUG(...) qDebug(__VA_ARGS__) #else …

【Python笔记-设计模式】中介者模式

一、说明 中介者模式是一种行为设计模式,减少对象之间混乱无序的依赖关系。该模式会限制对象之间的直接交互,迫使它们通过一个中介者对象进行合作。 (一) 解决问题 降低系统中对象之间的直接通信,将复杂的交互转化为通过中介者进行的间接交…

RK3568平台开发系列讲解(Linux系统篇)SPI 客户端通信

🚀返回专栏总目录 文章目录 一、spi_transfer二、spi_message三、初始化沉淀、分享、成长,让自己和他人都能有所收获!😄 SPI I/O模型由一组队列消息组成。我们提交一个或多个struct spi_message结构时,这些结构以同步或异步方式处理完成。单个消息由一个或多个struct sp…

Basisformer时间序列预测 锂电池SOC估计

Basisformer是一种基于Transformer架构的模型,用时间序列预测任务。 【Basisformer】时间序列预测 【锂电池SOC估计】 [1]采用自适应监督自监督对比学习方法学习时序特征 [2]通过双向交叉注意力机制计算历史序列和基准序列之间的相关系数 [3]最后通过相关系数…

动态规划(算法竞赛、蓝桥杯)--深入浅出的完全背包DP

1、B站视频链接&#xff1a;E09【模板】背包DP 完全背包_哔哩哔哩_bilibili #include <bits/stdc.h> using namespace std; const int N1010; int n,m; int v[N],w[N],f[N][N];int main(){scanf("%d%d",&n,&m);for(int i1;i<n;i){scanf("%d%d…

人像背景分割SDK,智能图像处理

美摄科技人像背景分割SDK解决方案&#xff1a;引领企业步入智能图像处理新时代 随着科技的不断进步&#xff0c;图像处理技术已成为许多行业不可或缺的一部分。为了满足企业对于高质量、高效率人像背景分割的需求&#xff0c;美摄科技推出了一款领先的人像背景分割SDK&#xf…

一款实用的.NET Core加密解密工具类库

前言 在我们日常开发工作中&#xff0c;为了数据安全问题对数据加密、解密是必不可少的。加密方式有很多种如常见的AES&#xff0c;RSA&#xff0c;MD5&#xff0c;SAH1&#xff0c;SAH256&#xff0c;DES等&#xff0c;这时候假如我们有一个封装的对应加密解密工具类可以直接…

【DeepStream】基于英伟达DeepStream框架进行算法开发(一):GStreamer基础

目录 简介deepstream 来源于 GStreamerGStreamer关于RTP相关代码 简介 在当今快速发展的人工智能和计算机视觉领域&#xff0c;英伟达的DeepStream框架提供了强大的工具和功能&#xff0c;帮助开发者快速部署和优化实时视频分析应用。本博客将重点介绍基于英伟达DeepStream框架…

maven复合工程生成

1. maven命令生成复合工程&#xff1a; ------- mvn archetype:generate -DgroupIdcom.caiwm -DartifactIdspring-learn -DarchetypeArtifactIdmaven-archetype-quickstart -DinteractiveModefalse 修改packing为pom ------ cd composite-parent mvn archetype:generate -Dgrou…

虚拟机JVM

虚拟机 1、定义jvm 假想计算机 运行在操作系统之上 和硬件之间没有直接交互 包括 一套字节码指令、寄存器、栈、垃圾回收、堆 一个存储方法域 jvm:承担一个翻译工作&#xff0c;动态的将java代码编译成操作系统可以识别的机器码。 从软件层面屏蔽了不同操作系统在底层硬件与指…

petalinux-config : command not found 和petalinux-build: command not found

发现这两个问题都是因为&#xff1a;没有先设置 petalinux 的作环境 先输入命令 先执行 source /opt/pkg/petalinux/2020.2/settings.sh 或者 sptl 然后切换目录&#xff0c;到相应的目录&#xff0c;就可以了

【设计模式】使用门面模式简化接口的复杂度

文章目录 1.概述2.门面模式的定义3.门面模式的应用场景4.总结 1.概述 门面模式&#xff08;Facade Pattern&#xff09;又叫做外观模式&#xff0c;它通过为子系统提供一个统一的高层入口的方式&#xff0c;达到简化复杂系统的使用以及降低客户端与子系统之间的耦合度的效果&a…

unity-unity2d基础操作笔记(二)0.5.101

unity2d基础操作笔记 五十一、canvas中的必须熟悉的属性五十二、如何调整canvas与游戏人物大小近似大小五十三、canvas中的canvas scaler介绍【概念】五十四、ui scale mode介绍【概念】五十五、为什么创建image后,canvas的范围要要远远大于游戏世界?五十六、图片常用操作【技…