进行https访问时,如何修改ClientHello消息?
我们知道,当进行https访问时,客户端会首先发出ClientHello消息
ClientHello消息内容包含如下:
1. Version
协议版本(protocol version)指示客户端支持的最佳协议版本。从低到高依次 SSLv2、SSLv3、TLSv1、TLSv1.1、TLSv1.2,TLSv1.3
2. Random
随机数(random)字段包含32字节的数据。当然,只有28字节是随机生成的;剩余的4字节包含额外的信息,受客户端时钟的影响。4个字节以Unix时间格式记录了客户端的协调世界时间(UTC)。协调世界时间是从1970年1月1日开始到当前时刻所经历的秒数,那么时间是不断的上涨的,通过前4字节填写时间方式,有效的避免了周期性的出现一样的随机数。使得“随机”更加“随机”。随机数是用来生成对称密钥的。
在握手时,客户端和服务器都会提供随机数。这种随机性对每次握手都是独一无二的,在身份验证中起着举足轻重的作用。它可以防止重放攻击,并确认初始数据交换的完整性。
3. Session ID
在第一次连接时,会话ID(session ID)字段是空的,这表示客户端并不希望恢复某个已
存在的会话。在后续的连接中,这个字段可以保存会话的唯一标识。服务器可以借助会话ID在自己的缓存中找到对应的会话状态。
如果Session id length有值,对于 SSL 2.0 Session id length 0~16字节,其后的版本扩大到32字节。本报文中Session id length是0,后面就没有跟Session id,直接是Cipher suit length。
Session id并不一定是32字节,RFC规定可以0~32字节。只是Session id由服务器生成,服务器普遍采用OpenSSL,而OpenSSL基本只生成32字节的session id,如果碰到其他字节长度的Session id,切莫认为是异常client hello。
4. 其它扩展信息,如:server_name,supported_groups,key_share等等
5. 密码套件列表(Cipher Suites),如:
TLS_AES_128_GCM_SHA256
TLS_AES_256_GCM_SHA384
TLS_CHACHA20_POLY1305_SHA256
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
TLS_RSA_WITH_AES_128_GCM_SHA256
TLS_RSA_WITH_AES_256_GCM_SHA384
TLS_RSA_WITH_AES_128_CBC_SHA
TLS_RSA_WITH_AES_256_CBC_SHA
----------------------------------------------------
我想请问的是,用wininet,winhttp(或者第三方HTTP库,如libcurl)进行https访问时,如何修改clienthello中的扩展信息和密码套件信息以及顺序?
请高手解答!