我正在尝试使用Bouncy Castle的DefaultTlsClient与只使用密码套件TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8的服务器进行交互。在搜索Bouncy Castle源代码时,我偶然发现了抽象的DefaultTlsClient,我想我也许能够使用它并覆盖GetCipherSuites方法,如下所示:
public override int[] GetCipherSuites()
{
return new int[]
{
CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
};
}然而,我不确定Bouncy Castle是否真的实现了该套件,因为在服务器完成其hello之后,程序崩溃,并从客户端发出失败的握手( 40 )-我认为这应该是一个失败的密码套件协商错误。因此,TLS消息的顺序是:使用CCM_8密码套件的客户端问候提供使用CCM_8密码套件的->服务器问候,提供从客户端到服务器的回复->警报握手失败(40)。
如果我在重写GetCipherSuites()时使用更常见的密码,我的实现可以与谷歌等其他TLS服务器进行通信,但我需要与之通信的服务器只使用CCM_8。
Bouncy Castle TLSClient真的可以与常量类CipherSuite:http://docs.glngn.com/latest/api/org.bouncycastle.bcprov-jdk15on/org/bouncycastle/crypto/tls/CipherSuite.html中的所有套件一起工作吗?或者它依赖于操作系统来提供?
此外,还试图找到一种在dotnet中使用TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8和x509证书的方法。我发现的库只使用预先共享的密钥。
发布于 2020-12-16 16:08:00
是的,Bouncy Castle TLSClient可以使用不常见的/非操作系统密码套件:我能够创建另一个CCM_8服务器,用于使用Openssl的s_server进行测试:openssl s_server -cert ./selfsigned.pem -cipher ECDHE-ECDSA-AES128-CCM8 -www,我的Bouncy Castle TLSClient能够与其进行密钥交换。所以这只是我如何使用Bouncy Castle为TLSClient的证书创建证书的一个bug。(您可以使用Openssl s_server中的TLS参数进行TLS证书请求,并强制客户端使用证书回复,如果未提供证书,则返回失败)
https://stackoverflow.com/questions/65315914
复制相似问题