TLS协议分析 (四) handshake协议概览

抓HTTPS报文分组来分析TLS/SSL协议 追踪TCP流 TLS/SSL建立在应用层和传输层TCP之间,将到达TCP前的数据都进行加密处理,前面做了那么多的工作,握手密钥协商,数字签名防抵赖等,都是为了保证数据的完整性和机密性。HTTP结合TLS/SSL协议就是HTTPS,如果HTTP消息不交由TLS/SSL协议,一旦流量被截获了,最大的问题就是隐私泄露, 如果我们在一个没有部署HTTPS的网站上登陆我们的信息,以HTTP流量方式进行发送... 阅读详情

5. handshake 协议

handshake protocol重要而繁琐。

TLS 1.3对握手做了大修改,下面先讲TLS 1.2,讲完再介绍一下分析TLS 1.3.

5.1.handshake的总体流程

handshake protocol用于产生给record protocol使用的SecurityParameters。
在handshake中:

  • 客户端和服务器端协商TLS协议版本号和一个CipherSuite,
  • 认证对端的身份(可选,一般如https是客户端认证服务器端的身份),
  • 并且使用密钥协商算法生成共享的master secret。

步骤如下:

  • 交换Hello消息,协商出算法,交换random值,检查session resumption.
  • 交换必要的密码学参数,来允许client和server协商出premaster secret。
  • 交换证书和密码学参数,让client和server做认证,证明自己的身份。
  • 从premaster secret和交换的random值 ,生成出master secret。
  • 把SecerityParameters提供被record层。
  • 允许client和server确认对端得出了相同的SecurityParameters,并且握手过程的数据没有被攻击者篡改。

Handshake的结果是在双方建立相同的Session,Session 包含下列字段:

  1. session identifier
    session id,用来唯一标识一个session,在session 恢复的时候,也要用到
  2. peer certificate
    对端的 X509v3 格式证书. 如果不需要认证对端的身份,就为空。
  3. compression method
    压缩算法,一般被禁用
  4. cipher spec
    CipherSuite,如上文介绍,包含: 用于生成key的pseudorandom function (PRF) , 块加密算法例如AES, MAC算法 (例如 HMAC-SHA256). 还包括一个 mac_length字段,在后文的we握手协议介绍
  5. master secret
    48字节的,client和server共享密钥。
  6. is resumable
    一个标志位,用来标识当前session是否能被恢复。

以上字段,随后被用于生成 record层的SecurityParameters,多个连接可以通过握手协议的session恢复功能来复用同一个session。

握手协议使用 非对称加密/密钥协商/数字签名 3类算法,
因此要求读者对这3类算法概念清晰,能准确区分。
在此澄清一下,:
非对称的算法分为3类:
,

  • 非对称加密,有:RSAES-PKCS1-v1_5,RSAES-OAEP ,Rabin-Williams-OAEP, Rabin-Williams-PKCS1-v1_5等
  • 非对称密钥协商,有:DH,DHE,ECDH,ECDHE 等
  • 非对称数字签名:RSASSA-PKCS1-v1_5,RSASSA-PSS,ECDSA,DSA,ED25519 等

另外,非对称加密算法,可以当作密钥协商算法来用,所以 RSAES-PKCS1-v1_5,RSAES-OAEP 也可以当作密钥协商算法来用。


插播一段 RSA:

RSA的实际工程应用,要遵循PKCS#1 标准,见 https://www.ietf.org/rfc/rfc3447

其中的 RSAES-PKCS1-v1_5 和 RSASSA-PKCS1-v1_5 是使用RSA算法的两种不同scheme(体制)。
RSAES表示 RSA Encryption schemes,即非对称加密,
RSAES有:RSAES-OAEP,RSAES-PKCS1-v1_5两种,其中RSAES-OAEP更新更安全

RSASSA表示 Signature schemes with appendix,即appendix模式(appendix和recovery的区别请参看密码学教材)的非对称数字签名算法。
RSASSA有: RSASSA-PSS, RSASSA-PKCS1-v1_5 两种, 其中RSASSA-PSS更新更安全

RSA还有一个缺陷,就是很容易被时间侧通道攻击,所以现在的RSA实现都要加 blinding ,后文有介绍。

可以看到,RSA是一种很特殊的算法,既可以当非对称加密算法使用,又可以当非对称数字签名使用。这一点很有迷惑性,其实很多用RSA的人都分不清自己用的是RSA的哪种模式。

相比之下,ECC(椭圆曲线)这一块的算法就很清晰,ECDSA只能用作数字签名,ECDH只能用作密钥交换。

分清楚 RSAES-PKCS1-v1_5 和 RSASSA-PKCS1-v1_5 有什么用涅?

PKCS#1规范解释:

A generally good cryptographic practice is to employ a given RSA
key pair in only one scheme. This avoids the risk that
vulnerability in one scheme may compromise the security of the
other, and may be essential to maintain provable security.

FIPS PUB 186-3 美国标准规定:

An RSA key pair used for digital signatures shall only be used for one
digital signature scheme (e.g., ANS X9.31, RSASSA-PKCS1 v1.5 or
RSASSA-PSS; see Sections 5.4 and 5.5). In addition, an RSA digital
signature key pair shall not be used for other purposes (e.g., key
establishment).

一对密钥只做一个用途,要么用作非对称加解密,要么用作签名验证,别混着用!
一对密钥只做一个用途,要么用作非对称加解密,要么用作签名验证,别混着用!
一对密钥只做一个用途,要么用作非对称加解密,要么用作签名验证,别混着用!

这个要求,决定了一个协议的 PFS(前向安全性),在斯诺登曝光NSA的“今日捕获,明日破解”政策后,越发重要。

https://news.ycombinator.com/item?id=5942534

http://news.netcraft.com/archives/2013/06/25/ssl-intercepted-today-decrypted-tomorrow.html

https://lwn.net/Articles/572926/

https://www.eff.org/deeplinks/2014/04/why-web-needs-perfect-forward-secrecy

http://www.wired.com/2013/10/lavabit_unsealed

PFS反映到密钥协商过程中,就是:

  • 不要使用RSA做密钥协商,一定只用RSA做数字签名。
  • 不要把ECDH的公钥固定内置在客户端做密钥协商

后文可以看到这一原则在 TLS 1.3, QUIC,Apple的iMessage等协议中一再贯彻。

非对称RSA/ECC这个话题比较大了,后面有空再写文章吧,读者可以先看一下参考资料,里面有清晰的介绍。

插播结束,继续TLS。


由于设计的时候,就要考虑兼容性,而且实际历史悠久,所以TLS协议90年代曾经使用的一些算法,现在已经被破解了,例如有的被发现漏洞(rc4),有的密钥长度过短(例如曾经美帝有出口限制,限制RSA 在512比特以下,对称加密密钥限制40比特以下,后来2005年限制被取消),但是考虑到兼容,现在的TLS实现中,还是包含了这种已经被破解的老算法的代码。这样,如果攻击者可以干扰握手过程,诱使client和server使用这种已经被破解的算法,就会威胁TLS协议的安全,这被称为“降级攻击”。

为了在握手协议解决降级攻击的问题,TLS协议规定:client发送ClientHello消息,server必须回复ServerHello消息,否则就是fatal error,当成连接失败处理。ClientHello和ServerHello消息用于建立client和server之间的安全增强能力,ClientHello和ServerHello消息建立如下属性:

  • Protocol Version
  • Session ID
  • Cipher Suite
  • Compression Method.

另外,产生并交换两个random值 ClientHello.random 和 ServerHello.random

密钥协商使用四条: server的Certificate,ServerKeyExchange,client的Certificate,ClientKeyExchange 。TLS规定以后如果要新增密钥协商方法,可以订制这4条消息的数据格式,并且指定这4条消息的使用方法。密钥协商得出的共享密钥必须足够长,当前定义的密钥协商算法生成的密钥长度必须大于46字节。

在hello消息之后,server会把自己的证书在一条Certificate消息里面发给客户端(如果需要做服务器端认证的话,例如https)。 并且,如果需要的话,server会发送一条ServerKeyExchange消息,(例如如果服务器的证书只用做签名,不用做密钥交换,或者服务器没有证书)。client对server的认证完成后,server可以要求client发送client的证书,如果这是协商出来的CipherSuite允许的。下一步,server会发送ServerHelloDone消息,表示握手的hello消息部分已经结束。然后server会等待一个client的响应。如果server已经发过了CertificateRequest消息,client必须发送Certificate消息。然后发送ClientKeyExchange消息,并且这条消息的内容取决于ClientHello和ServerHello消息协商的算法。如果client发送了有签名能力的证书,就显式发送一个经过数字签名的CertificateVerify消息,来证明自己拥有证书私钥。

然后,client发送一个ChangeCipherSpec消息,并且client拷贝待定的Cipher Spec到当前的Cipher Spec。然后client立即用新算法+新key+新密钥 发送Finished消息。收到后,server发送自己的ChangeCipherSpec消息,作为响应,并且拷贝待定的Cipher Spec到当前的Cipher Spec。此时,握手就完成了,client和server可以开始交换应用层数据(如下图所示)。应用层数据不得在握手完成前发送。

引用一个来自网络的图片:
图片

Client                                               Server

ClientHello                  -------->
                                                ServerHello
                                               Certificate*
                                         ServerKeyExchange*
                                        CertificateRequest*
                             <--------      ServerHelloDone
Certificate*
ClientKeyExchange
CertificateVerify*
[ChangeCipherSpec]
Finished                     -------->
                                         [ChangeCipherSpec]
                             <--------             Finished
Application Data             <------->     Application Data

       Figure 1.  Message flow for a full handshake

* 表示可选的消息,或者根据上下文在某些情况下会发送的消息。Indicates optional or situation-dependent messages that are not
always sent.

注:为了帮助解决管道阻塞的问题,ChangeCipherSpec是一个独立的TLS protocol content type,并不是一个握手消息。

TLS的完整握手过程,要进行RSA/ECDH/ECDSA等非对称计算,非对称计算是很慢的。关于非对称的性能:
例如在2015年的服务器cpu: Intel® Xeon® CPU E3-1230 V2 @ 3.30GHz 上,
使用如下命令测试:

openssl speed rsa2048
openssl speed ecdsap256
openssl speed ecdhp256
openssl speed aes-128-cbc
openssl speed -evp aes-128-cbc

结果如下表:

算法性能性能
RSA-2048私钥运算 723.7 次/秒公钥运算 23505.8 次/秒
256 bit ecdsa (nistp256)签名 8628.4 次/秒验证 2217.0 次/秒
256 bit ecdh (nistp256)ECDH协商 2807.8 次/秒
aes-128-cbc加密 121531.39 K/秒
aes-128-cbc 使用aesni硬件加速加密 683682.13 K/秒

注:非对称的单位是 次/秒,这是由于非对称一般只用于处理一个block,
对称的单位是 K/秒,因为对称一般用于处理大量数据流,所以单位和流量一样。
可以给非对称的 次/秒 乘以 block size ,就可以和对称做比较了。例如rsa-2048,723.7*2048/8/1024=185.2672 K/秒 ,
故 RSA-2048 私钥运算性能 是aes-128-cbc 的 1.5/1000。是aesni的 2.6/10000。

如上,性能数据惨不忍睹, 简直不能忍!!!

有鉴于此,TLS从设计之初,就采用了万能手段—加cache,有2种cache手段:session id,和session ticket。把握手的结果直接cache起来,绕过握手运算。

当client和server决定恢复一个之前的session,或复用一个已有的session时(可以不用协商一个新的SecurityParameters),消息流程如下:

客户端使用要被恢复的session,发送一个ClientHello,把Session ID包含在其中。server在自己的session cache中,查找客户端发来的Session ID,如果找到,sever把找到的session 状态恢复到当前连接,然后发送一个ServerHello,在ServerHello中把Session ID带回去。然后,client和server都必须ChangeCipherSpec消息,并紧跟着发送Finished消息。这几步完成后,client和server 开始交换应用层数据(如下图所示)。如果server在session cache中没有找到Session ID,那server就生成一个新的session ID在ServerHello里给客户端,并且client和server进行完整的握手。

流程图如下:

Client                                                Server

ClientHello                   -------->
                                                 ServerHello
                                          [ChangeCipherSpec]
                              <--------             Finished
[ChangeCipherSpec]
Finished                      -------->
Application Data              <------->     Application Data

    Figure 2.  Message flow for an abbreviated handshake

5.2. handshake 协议外层结构

从消息格式来看,TLS Handshake Protocol 在 TLS Record Protocol 的上层. 这个协议用于协商一个session的安全参数。 Handshake 消息(例如ClientHello,ServerHello等) 被包装进 TLSPlaintext结构里面,传入TLS record层,根据当前session 状态做处理,然后传输。

如下:

enum {
    hello_request(0), client_hello(1), server_hello(2),
    certificate(11), server_key_exchange (12),
    certificate_request(13), server_hello_done(14),
    certificate_verify(15), client_key_exchange(16),
    finished(20), (255)
} HandshakeType;struct {
    HandshakeType msg_type;  /* handshake type */
    uint24 length;          /* bytes in message */
    select (HandshakeType) {              case hello_request:       HelloRequest;      case client_hello:        ClientHello;      case server_hello:        ServerHello;
      case certificate:         Certificate;        
      case server_key_exchange: ServerKeyExchange;
      case certificate_request: CertificateRequest;
      case server_hello_done:   ServerHelloDone;
      case certificate_verify:  CertificateVerify;
      case client_key_exchange: ClientKeyExchange;
      case finished:            Finished;
      case session_ticket:      NewSessionTicket; /* NEW */
    } body;
} Handshake;

TLS协议规定,handshake 协议的消息必须按照规定的顺序发,收到不按顺序来的消息,当成fatal error处理。也就是说,TLS协议可以当成状态机来建模编码。

下面按照消息发送必须遵循的顺序,逐个解释每一条握手消息。

handshake协议的外层字段,见这个抓包:

图片

5.3. handshake — ClientHello,ServerHello,HelloRequest

Hello消息有3个:ClientHello, ServerHello,HellloRequest
逐个说明:

5.3.1 Client Hello

当客户端第一次连接到服务器时,第一条message必须发送ClientHello。
另外,rfc里规定,如果客户端和服务器支持重协商,在客户端收到服务器发来的HelloRequest后,也可以回一条ClientHello,在一条已经建立的连接上开始重协商。(重协商是个很少用到的特性。)

消息结构:

struct {
    uint32 gmt_unix_time;
    opaque random_bytes[28];
} Random;

opaque SessionID<0..32>;

uint8 CipherSuite[2];enum { null(0), (255) } CompressionMethod;struct {
    ProtocolVersion client_version;
    Random random;
    SessionID session_id;
    CipherSuite cipher_suites<2..2^16-2>;
    CompressionMethod compression_methods<1..2^8-1>;
    select (extensions_present) {               case false:            struct {};               case true:
            Extension extensions<0..2^16-1>;
    };
} ClientHello;

Random 其中:
gmt_unix_time 是 unix epoch时间戳。
random_bytes 是 28字节的,用密码学安全随机数生成器 生成出来的随机数。


密码学安全的随机数生成,这是个很大的话题,也是一个大陷阱,目前最好的做法就是用 /dev/urandom,或者openssl库的 RAND_bytes()

历史上,恰好就在SSL的random_bytes这个字段,NetScape浏览器早期版本被爆出过随机数生成器漏洞。
被爆菊的随机数生成器使用 pid + 时间戳 来初始化一个seed,并用MD5(seed)得出结果。
见 http://www.cs.berkeley.edu/~daw/papers/ddj-netscape.html,
建议读者检查一下自己的随机数生成器。


client_version
客户端支持的最高版本号。
random
客户端生成的random。

ClientHello.session_id 唯一标识一个session,用来做session cache。如果为空,表示不做复用,要求服务器生成新的session。
session_id的来源有:

  1. 之前的协商好的连接的session_id
  2. 当前连接的session_id
  3. 当前也在使用中的另一条连接的session_id

其中第三种允许不做重新握手,就同时建立多条独立的安全连接。这些独立的连接可能顺序创建,也可以同时创建。一个SessionID当握手协商的Finished消息完成后,就合法可用了。存活直到太旧被移除,或者session 关联的某个连接发生fatal error。SessionID的内容由服务器端生成。

注:由于SessionID的传输是不加密,不做MAC保护的,服务器不允许把私密信息发在里面,不能允许伪造的SessionID在服务器造成安全问题。(握手过程中的数据,整体是受Finished消息的保护的)

ClientHello.cipher_suites字段,包含了客户端支持的CipherSuite的列表,按照客户端希望的优先级排序,每个CipherSuite有2个字节,每个CipherSuite由:一个密钥交换算法,一个大量数据加密算法(需要制定key length参数),一个MAC算法,一个PRF 构成。服务器会从客户端发过来的列表中选择一个;如果没有可以接受的选择,就返回一个 handshake failure 的 alert,并关闭连接。如果列表包含服务器不认识,不支持,或者禁用的CipherSuite,服务器必须忽略。
如果SessionID不为空,则cipher_suites里面起码要包含客户端cache的session里面的那个CipherSuite

compression_methods,类似地,ClientHello里面包含压缩算法的列表,按照客户端优先级排序。当然,如前介绍,服务器一般禁用TLS的压缩。

compression_methods 后面可以跟一组扩展(extensions), extensions都是可选的,比较有用的扩展如: SNI, session ticket,ALPN,OCSP 等,后文介绍。

客户端发送了ClientHello后,服务器端必须回复ServerHello消息,回复其他消息都会导致 fatal error 关闭连接。

5.3.2 Server Hello

当收到客户端发来的ClientHello后,正常处理完后,服务器必须回复ServerHello。

消息结构:

struct {
    ProtocolVersion server_version;
    Random random;
    SessionID session_id;
    CipherSuite cipher_suite;
    CompressionMethod compression_method;
    select (extensions_present) {        case false:            struct {};        case true:
            Extension extensions<0..2^16-1>;
    };
} ServerHello;
server_version
服务器选择 ClientHello.client_version 和 服务器支持的版本号 中的最小的。
random
服务器生成的random,必须确保和客户端生成的random没有关联。
session_id
服务器为本连接分配的SessionID。如果ClientHello.session_id不为空,服务器会在自己的本地做查找。
  • 如果找到了匹配,并且服务器决定复用找到的session建立连接,服务器应该把ClientHello.session_id同样的 session id填入ServerHello.session_id,这表示恢复了一个session,并且双方会立即发送Finished消息。
  • 否则,回复一个和ClientHello.random_id不同的Serverhello.session_id,来标识新session。服务器可以回复一个空的session_id,来告诉客户端这个session不要cache,不能恢复。
    如果一个session 被恢复了,那必须恢复成之前协商的session里面的 CipherSuite。要注意的是,并不要求服务器一定要恢复session, 服务器可以不做恢复。

在实践中,session cache在服务器端要求key-value形式的存储,如果tls服务器不止一台的话,就有一个存储怎么共享的问题,要么存储同步到所有TLS服务器的内存里,要么专门搞服务来支持存储,并使用rpc访问,
无论如何,都是很麻烦的事情,相比之下,后文要介绍的session ticket就简单多了,所以一般优先使用session ticket。

cipher_suite
服务器选定的一个CipherSuite。如果是恢复的session,那就是session里的CipherSuite。
compression_method
跟上面类似。
extensions
扩展列表。要注意的是,ServerHello.extensions 必须是 ClientHello.extensions的子集。
5.3.3 Hello Extensions

The extension 的格式是:

struct {
    ExtensionType extension_type;
    opaque extension_data<0..2^16-1>;
} Extension;enum {
    signature_algorithms(13), (65535)
} ExtensionType;

其中:

  • “extension_type” 标识是哪一个扩展类型。
  • “extension_data” 一坨二进制的buffer,扩展的数据体,各个扩展自己做解析。

extension_type 只能出现一次,ExtensionType之间不指定顺序。

extensions 可能在新连接创建时被发送,也可能在要求session恢复的时候被发送。所以各个extension都需要规定自己再完整握手和session恢复情况下的行为。
这些情况比较琐碎而微妙,具体案例要具体分析。

5.3.4 Hello Request

服务器任何时候都可以发送 HelloRequest 消息。

HelloRequest的意思是,客户端应该开始协商过程。客户端应该在方便的时候发送ClientHello。服务器不应该在客户端刚创建好连接后,就发送HelloRequest,此时应该让客户端发送ClientHello。

客户端收到这个消息后,可以直接忽略这条消息。
服务器发现客户端没有响应HelloRequest后,可以发送fatal error alert。

消息结构:

struct { } HelloRequest;

HelloRequest不包含在握手消息的hash计算范围内。

​ 本文转自微信后台团队,如有侵犯,请联系我们立即删除

OpenIMgithub开源地址:

https://github.com/OpenIMSDK/Open-IM-Server

OpenIM官网 : https://www.rentsoft.cn

OpenIM官方论坛: https://forum.rentsoft.cn/

更多技术文章:

开源OpenIM:高性能、可伸缩、易扩展的即时通讯架构
https://forum.rentsoft.cn/thread/3

【OpenIM原创】简单轻松入门 一文讲解WebRTC实现1对1音视频通信原理
https://forum.rentsoft.cn/thread/4

【OpenIM原创】开源OpenIM:轻量、高效、实时、可靠、低成本的消息模型
https://forum.rentsoft.cn/thread/1

TLS协议中的握手协议 TLS 握手协议(handshake protocol) 握手是TLS协议中最精密复杂的部分。在这个过程中,通信双方协商连接参数(沟通双方各有什么加密算法,选择一个最合适的算法),并且完成身份验证。根据使用的功能的不同,整个过程通常需要交换6~10次信息。根据配置和支持的协议扩展的不同,交换过程可能有许多变种。在使用中经常可以观察到以下三种流程: (一) 完整的握手,对服务器进行身份验证; ... 阅读详情

相关推荐

TLS握手流程分析

客户端发送:用于初始化会话消息,该消息主要包含如下信息:: 客户端发送它所支持的最高 SSL/TLS 版本;:一个 32 字节的客户端随机数,该随机数被服务端生成通信用的对称密钥(master secret);:session ID 被客户端用于恢复之前的会话: 客户端发送它所支持的加密套件列表服务端发送:服务端发送双方所支持的最高的 SSL/TLS 版本;:一个 32 字节的服务端随机数,被客户端用于生成通信用的对称密钥(master secret);:用于会话恢复;

weixin_43894455的博客 4341

错误:net/http: TLS handshake timeout;解决方案

 Linux中使用命令:curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://d1d9aef0.m.daocloud.io  该脚本可以将 --registry-mirror 加入到你的 Docker 配置文件 /etc/docker/daemon.json 中。适用于 Ubuntu14.04、Debian、...

leo_zexin的博客 6210

TLS1.2连接过程解析

文章目录HTTPS 建立连接TLS 协议的组成抓包的准备工作ECDHE 握手过程RSA 握手过程双向认证总结 HTTPS 建立连接 当你在浏览器地址栏里键入“https”开头的 URI,再按下回车,会发生什么呢? 回忆一下第 8 讲的内容,你应该知道,浏览器首先要从 URI 里提取出协议名和域名。因为协议名是“https”,所以浏览器就知道了端口号是默认的 443,它再用 DNS 解析域名,得到目标的 IP 地址,然后就可以使用三次握手与网站建立 TCP 连接了。 在 HTTP 协议里,建立连接后,浏览器会

qq_38304320的博客 841

SSL/TLS介绍以及wireshark抓包TLS Handshake报文

SSL/TLS是在应用层和传输层之间的一个安全协议,通信的双方在进行通信前需要握手,通过在通信的两端建立一个安全的通道,保护数据在传输过程中的安全性。Session Identifier 的优点是它很简单,但它的缺点是,如果服务器重新启动或者会话超时,之前的Session Identifier就会失效,需要重新建立会话。Session Ticket 的优点是它可以在服务器重启后仍然保持会话的有效性,但需要确保会话票据的安全性,以防止被恶意利用。因为这是一次单向认证的Handshake过程,故比较简单。

weixin_52018852的博客 7000

用Python手把手教你实现一个多层感知机(MLP)——从理论到代码实战

本文详细介绍了如何使用Python和Theano库从零开始实现多层感知机(MLP),涵盖从核心原理到代码实战的全过程。通过构建隐藏层、输出层和完整MLP模型,结合权重初始化、激活函数选择和训练技巧,帮助开发者深入理解神经网络工作机制,并应用于实际机器学习任务。

web39explorer的博客 970

Xilinx XDMA驱动代码分析及用法

Xilinx XDMA驱动代码分析及用法 先简单的介绍一下,赛灵思的XDMA的驱动是用于做什么的、他的主要功能就类似与网卡pcie接口的网卡驱动、用于控制主机与fpga设备进行pcie的通讯。通讯的主要方式是设备文件的读写,这里不清楚的同学可以看一下我上一篇文章。通过控制设备文件的读写,操作驱动与fpga设备进行数据传输。 1、目录结构 zacha@Superman:~/nfs/xdma-debug/dma_ip_drivers-master/XDMA/linux-kernel$ tree -C . ├──

恍恍惚惚的大穷猫的博客 3万+

TLS协商报错Handshake failure问题解决

介绍了curl工具协助定位tls连接问题,tcp连接报错Handshake failure可能原因是协商的加密套件存在问题导致。

qq_42288975的博客 5394

TL3562/3568内核驱动移植实战:解决无锡沐创N500L-AM4网口异常问题

本文详细介绍了在TL3562/3568平台上移植无锡沐创N500L-AM4网卡驱动的实战经验,重点解决了第四个网口通讯异常问题。通过升级驱动版本至rnpgbe-0.2.3,生成关键头文件并正确配置内核,最终实现四个网口稳定工作。文章还提供了性能优化建议和避坑指南,为类似硬件驱动移植项目提供参考。

weixin_28273593的博客 180

TLS协议分析 (二) 架构总览

二. TLS协议的原理 1. 自顶向下,分层抽象 构建软件的常用方式是分层,把问题域抽象为多层,每一层的概念定义为一组原语,上一层利用下一层的组件构造实现,并被上一层使用,层层叠叠即成软件。 例如在编程语言领域中,汇编语言为一层,在汇编上面是C/C++等静态编译语言,C/C++之上是python/php/lua等动态类型脚本语言层,之上常常还会构造领域特定的DSL 在网络架构中,以太网是一层,其上是ip协议的网络层,ip之上是tcp等传输层,tcp之上是http等应用层 密码学通信协议也是分层构造得到。

OpenIM的博客 1607

如何导入su_利用GIS快速生成SU场地模型

01|前言:进入2021年了,希望大家也是一个新的开始。告诫自己多写文章多更新,多读点书多旅行。然而元旦由于出去玩了4天,积累了一些事情要处理,一直没有时间好好写点东西。今天给大家带来的分享主题叫“利用GIS快速生成SU场地模型”。相关的视频方法其实B站上也有,但我相信视频很多人都不会看,我自己也是。直接给大家上操作流程。主要的操作步骤是【获取场地的矢量shp文件】—【导入ArcScen...

weixin_33806859的博客 9813

避坑指南:RK3588上编译EtherCAT 1.6时遇到的权限问题和模块安装错误

本文详细解析了在RK3588平台上编译EtherCAT 1.6时常见的权限问题和模块安装错误,提供了两种实战解决方案和嵌入式开发的通用权限管理策略。通过优化内核配置和编译参数,显著提升实时性能,帮助开发者高效完成EtherCAT主站部署。

weixin_33724046的博客 453

TLS协议分析 (五) handshake协议 证书与密钥交换

5.4. handshake — Server Certificate 当服务器确定了CipherSuite后,根据CipherSuite里面的认证算法,如果需要发送证书给客户端,那么就发送 Server Certificate消息给客户端。Server Certificate总是在ServerHello之后立即发送,所以在同一个RTT里。 Server Certificate里面包含了服务器的证书链。 消息结构: opaque ASN.1Cert<1..2^24-1>;struct {

OpenIM的博客 2201

CASIA数据集解析:图像篡改检测的黄金标准与实践指南

本文深入解析了CASIA数据集在图像篡改检测领域的核心价值与应用实践。作为中科院自动化所打造的黄金标准,CASIA数据集通过模拟真实篡改场景(如拼接和复制移动)为研究者提供全面支持。文章详细对比了v1.0与v2.0版本差异,分享数据预处理和模型训练的最佳实践,并探讨了未来研究方向,是图像篡改检测领域的重要参考指南。

kappa的博客 784

net/http: TLS handshake timeout 问题

最近系统偶现”net/http: TLS handshake timeout“,而且都集中在同一个机房,这个报错还是第一次见,产生的原因和解决的方案都比较有意思。

2456

Python全栈入门到实战【基础篇 05】核心基础:Python的2种运行模式(交互式+命令行式)

Python代码运行模式详解:交互式与命令行式对比 摘要: Python提供两种核心运行模式:交互式(REPL)和命令行式(脚本式)。交互式模式适合快速测试语法,即时反馈结果,通过终端输入python启动,特点是无需保存、临时执行,适合验证小段代码逻辑。命令行式模式需将代码保存为.py文件后运行,适合开发完整程序,可重复执行和修改。两种模式各有优势:交互式便于学习调试,命令行式适合实际开发。掌握两种模式的使用场景和切换方法,是Python入门的关键技能,能显著提升学习效率。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 4554

171、运动控制中的标定:摩擦力与死区补偿标定

摘要(149字) 运动控制系统中的摩擦力与死区补偿是提升精度的关键。摩擦力分为静摩擦、库仑摩擦和粘滞摩擦,其中Stribeck效应是低速抖动的主因;死区则表现为控制信号的无效区间。有效标定方法包括恒速测试(摩擦力)和斜坡响应法(死区)。补偿策略需采用分段前馈和动态调整,避免过度补偿导致振荡。实践中要注意机械状态检查、补偿量限幅,并定期重新标定。硬件升级配合算法补偿才能实现最优控制,标定工作应优先于PID参数调整。

m0_50546716的博客 227

TLS 1.3 协议详解

TLS 1.3 握手流程详解 需要的背景知识: (1):对 TLS 1.2 协议有一定程度的了解,包括秘钥交换、会话复用等。 第一节 TLS 1.3 的握手概述 协议分析的第一步就是看报文。TLS 1.3的报文,有个特点,就是通过抓包发现,只能看到明文的Client Hello和Server Hello,其余的握手报文均被加密。 1-RTT 如图: 图1 条件:无条...

Network, Linux Kernel 4万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

SSL/TLS的Handshake过程与javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure异常

一.SSL/TLS的Handshake过程 在SSL/TLS的Handshake过程中,客户端与服务器之间需要交换参数,具体过程如下: 客户端提供其所支持的各种cipher suites(包含加密算法和Hash函数)服务器从中选择自己也支持的cipher suite,并通知客户端,表明两者将以此进行数据传输服务器同时将自己的数字证书(包括服务器名称、CA和公钥)作为标识符发给客户端客户端向

w348399060的博客 3525

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

TLS协议分析 (六) handshake协议扩展

转自:http://chuansong.me/n/1281554652943 5.11. handshake  — Finished 在 ChangeCipherSpec 消息之后,应该立即发送 Finished 消息,来确认密钥交换和认证过程已经成功了。ChangeCipherSpec 必须在其它握手消息和 Finished 消息之间。 Finished 消息是第一条用刚刚协商

zhangtaoym的博客 2805

HTTPS - 揭秘 TLS 1.2 协议完整握手过程

关注并将「趣谈前端」设为星标定期推送技术干货/优秀开源/技术思维HTTPS 是建立在 SSL/TLS 传输层安全协议之上的一种 HTTP 协议,相当于 HTTPS = HTTP + SSL/TLS。第一篇文章 “HTTPS - 通俗易懂的阐述 HTTPS 协议,解决面试难题” 更多是理论上的一些阐述,能解决一些面试及常见问题,例如 “SSL/TLS” 的关系是什么?文中...

趣谈前端 5789

HTTPS认证过程和SSLError bad handshake原因分析

HTTPS连接出现SSLError错误的分析与解决方案 摘要:本文分析了项目部署中HTTPS接口请求失败的常见问题。当出现"bad handshake: certificate verify failed"错误时,主要原因是公网/内网部署环境下证书配置不匹配。文章对比了HTTPS单向认证和双向认证的区别,并给出了Nginx配置示例(包含ssl_certificate、ssl_client_certificate等关键参数)。解决方案需根据部署环境调整Python请求代码:内网需指定根证书

zhai的博客 1433

SSL/TLS握手时报Remote host closed connection during handshake

一、问题的发现 问题是前段时间发现和处理,现在再来回顾和总结。那段时间,线上偶尔预警Remote host closed connection during handshake这个报错,次数大概是一天3-10次左右,频率不高。一开始没有多少关注,但心想既然出现了,总要查个究竟。 这个功能请求了一个第三方接口,使用https协议。 二、尝试处理 自己对https协议理解不深,出现这个问题,先是百度,后是谷歌,反正查的都查了。网上分析的原因无非是两种: ①、ssl版本问题 ②、ssl证书验证问题 ③、jdk1.

u011442760的博客 1万+

解决:http: TLS handshake error from *

目录 问题 解决 结尾 问题 今天以容器的形式在公网上一个部署了一个云服务,在测试环境是没有问题的,不知道为什么部署到 beta 环境就出现了问题,导致 https 协议文件访问失败。 具体报错信息如下: 2021/11/09 07:15:58 http: TLS handshake error from 125.64.94.138:34428: remote error: tls: bad certificate\ 2021/11/09 07:15:58 http: TLS handshak

liuzhen007的专栏 1万+
上一篇: TLS协议分析 (三) record协议
下一篇: TLS协议分析 (五) handshake协议 证书与密钥交换
OpenIM
博客等级 码龄5年 295粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值