我正在编写客户端/服务器TCP程序,并希望使用TLS加密和验证连接。我的计划是让客户向服务器提交公共RSA密钥,然后使用私钥和用户名来验证客户端的身份并加密连接。
GnuTLS文档还有很多不足之处,但我找到了一个很好的PSK示例并试图使其适应使用RSA非对称密钥。在针对这个问题敲打我的脑袋后,特别是文档中没有明确描述的各种模糊的细微之处,我让客户停止抱怨"没有找到支持的密码套件"但现在服务器了。
在进一步搜索互联网之后,我发现了一个测试程序,它是测试RSA-PSK的GnuTLS CI的一部分,我意识到共享密钥仍然是对称的。 RSA-PSK不是我想象的那样。
我真的不喜欢使用对称密钥,因为它需要在服务器端以普通方式存储,因此不安全。
然而,简要介绍RSA密钥交换表明没有涉及用户名,它实际上是基于证书的,并且服务器使用自己的私钥,而所有客户端都使用相同的公钥。因此,不可能保证客户的身份。
花了一天时间试图让TLS工作,并且厌恶重新发明轮子(这总是存在安全风险)我在这里问以防万一有专家可以告诉我如何实现目标我正在寻求实现。
唯一可以解决的解决方案是相当脏和黑客(并重新发明轮子),即实现预TLS握手握手,其中客户端生成随机密钥,使用其私钥对其进行加密,然后发送它和服务器的用户名,然后使用公钥解密它。然后,GnuTLS可以使用随机密钥进行正常的对称PSK密钥交换。
我不明白为什么GnuTLS无法实现这样的事情。我期待的是GnuTLS客户端将用户名发送到服务器,然后服务器通过生成加密密钥来执行密钥交换,并使用客户端的公钥对其进行加密,并将加密密钥发送到客户端。客户端使用其私钥对密钥进行解密,然后,密钥交换安全完成,TLS通道打开。
总结如下:
1)我如何实现我需要达到的目标(最好使用GnuTLS)?
2)为什么RSA-PSK不像我预期的那样工作,而是使用对称密钥和证书?
答案 0 :(得分:0)
TLS不适合我试图提出的目的。 Libssh可能是最好的解决方案,但我已经使用libgcrypt完成了一个完整的解决方案,所以......