fumingxiaoshen 2024-02-25 15:56 采纳率: 50%
浏览 100

基于openssl编程,报错Handshake failure 40

使用openssl源码目录demos/bio下的测试代码,当指定支持的签名算法时,会出现如下所示的问题,报错Handshake failure 40,并提示不支持列出的签名算法。

img


(1)这个报错的原因是因为libcrypto不支持该签名算法吗?我查看了openssl对于签名和hash算法的支持,是包括ECDSA和SHA512的

img

(2)在wireshark截获的报文中,为何无法看到服务端选择的签名算法
当我删除掉配置文件中对于签名算法的指定,发现能够正常建立TLS连接。我观察整个建立连接过程的报文,无法定位服务端到底选择了哪一个签名算法。

img

附:
1.客户端的配置文件

# Example configuration file

# Comment out the next line to ignore configuration errors
# config_diagnostics = 1

# Connects to the default port of s_server
Connect = localhost:4433

# Disable TLS v1.2 for test.
# Protocol = ALL, -TLSv1.2
# Only support 3 curves
Curves = P-521:P-384:P-256

# Restricted signature algorithms
SignatureAlgorithms = ECDSA+SHA512
# RSA+SHA512:ECDSA+SHA512

2.服务端的配置文件

# Example configuration file

# Comment out the next line to ignore configuration errors
# config_diagnostics = 1

# Port to listen on
Port = 4433

# Disable TLS v1.2 for test.
# Protocol = ALL, -TLSv1.2
# Only support 3 curves
Curves = P-521:P-384:P-256

# Restricted signature algorithms
SignatureAlgorithms = ECDSA+SHA512
#RSA+SHA512:ECDSA+SHA512
Certificate=server.pem
PrivateKey=server.pem
ChainCAFile=root.pem
VerifyCAFile=root.pem

# Request certificate
VerifyMode=Request
ClientCAFile=root.pem
  • 写回答

2条回答 默认 最新

  • 码农阿豪@新空间 Java领域优质创作者 2024-02-25 16:02
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如需一对一服务私聊我哦
    1. 可能的原因是openssl版本不支持该签名算法。检查openssl版本是否最新,并确认该版本是否支持所需的签名算法。 案例:如果使用的openssl版本比较旧,可能不支持最新的签名算法,比如post-quantum密码学中常用的算法。需要更新openssl版本或使用其他支持该算法的库。
    1. 服务端选择的签名算法可能被压缩。TLS协议中的签名算法通常在ServerHello消息中被传输,但是这些算法可能被压缩到更短的表示形式中,以减少传输的数据量。因此,在wireshark中无法直接看到服务端选择的签名算法。 案例:可以使用sslkeylog插件将协商过程中使用的密钥信息写入文件,然后使用Wireshark中的"Decode As"功能,在TLS密钥日志文件中解码加密数据包,将其解密并查看服务端选择的签名算法。代码如下:
    export SSLKEYLOGFILE=keylogfile.txt  # 设置密钥日志文件
    ./openssl s_server -accept 443 -key key.pem -cert cert.pem -tls1_2 -cipher ECDHE-RSA-AES256-GCM-SHA384  # 启动服务端
    

    在Wireshark中,选择"Edit"->"Preferences"->"Protocols"->"SSL"->"Pre-Master Secret log filename",输入密钥日志文件的路径,然后选择"Decode As"->"TLS"->右键"TLS"->"Preferences",在"RSA Keylist"或"ECDHE Keylist"中导入密钥日志文件,完成解密和查看签名算法。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月25日