我正在尝试使用openssl
命令行工具进行一些手动数据提取/加密/解密。
我一直在查看 RFC5246 以找出我需要做什么。我不清楚我是否能够使用该工具完成此步骤。我假设说明中的私钥是我创建自签名证书时生成的私钥。
当使用 RSA 进行服务器身份验证和密钥交换时,客户端会生成一个 48 字节的 pre_master_secret,使用服务器的公钥进行加密,然后将其发送给服务器。服务器使用其私钥解密 pre_master_secret。然后双方将 pre_master_secret 转换为 master_secret,如上所述。
有人能告诉我我的假设是否正确吗?是否可以openssl
使用命令行工具并提供我的服务器私钥和来自客户端的加密 pre_master_secret 来为服务器生成 pre_master 密钥,以便可以使用它来创建主密钥?
如果是这样,我不确定该怎么做,因为我对该工具不太熟悉。
我应该指出的另一件事是,我正在使用的密码套件是 TLS_RSA_WITH_AES_256_CBC_SHA,并且我可以在 Wireshark 中看到来自客户端的 pre_master_secret 长为 256 个字节。
答案1
我不太确定,但我认为答案是否定的。openssl
命令行客户端是一个异构工具集合。X.509 命令可用于操作证书,但加密命令除了测试 OpenSSL 本身之外很少有用。
如果需要用常见算法进行加密计算,我推荐使用 Python 交互式命令行隐秘穹顶图书馆。
但要解密 SSL 连接,最简单的方法通常是使用 Wireshark。告诉 Wireshark 在哪里找到私钥它将解密使用 RSA 加密的 TLS 连接。对于使用临时 Diffie-Hellman 的连接,您不能仅使用密钥解密流量,您需要来自客户端或服务器的附加信息。
请注意,使用TLS_RSA_WITH_AES_256_CBC_SHA
密码套件不是一个好主意,原因如下:
- 它没有前向保密,因此如果服务器的私钥被泄露,则使用此密钥建立的所有连接也会被泄露。使用 Diffie-Hellman 密钥交换(名称中包含 EDH 或 ECDHE)的密码套件具有前向保密性。
- 它使用 RSA 解密,这涉及填充,这是实现错误和通过侧信道泄漏的典型来源。名称中除了 RSA 之外还带有 EDH 或 ECDHE 的密码套件,或者带有 DSA 或 ECDSA 的密码套件,使用签名而不是解密,并且不太可能遭受实现缺陷。
- 它使用 CBC 解密,这涉及填充,这是实现错误和通过侧信道泄漏的典型来源。名称中不包含 CBC 的密码套件不太可能出现实现缺陷。
答案2
SSL/TLS-through-1.2 纯 RSA 密钥交换使用的 RSAES-PKCS1v1_5 可以通过 OpenSSL 命令行操作解密rsautl
或者pkeyutl
(后者自 2010 年 1.1.0 版开始)。请参阅各自的手册页,如果您的系统不是 Windows,则应该有这些手册页,或者在线的。
请注意,这会为您提供预主密钥,它本身无法解密(或验证)流量。您必须使用预主密钥加上随机数来派生主密钥,然后使用主密钥加上随机数来派生工作密钥(复数)。派生函数“PRF”在 SSLv3(不再使用)、TLS 1.0 和 1.1(RFC 2246 和 4346)以及 TLS 1.2(RFC 5246)之间有所不同。(在起草的 TLS 1.3 中,PRF 再次有所不同,但这也将完全消除纯 RSA 密钥交换。)
命令行无法直接访问 SSL/TLS PRF,但可以执行构建它们的 HMAC(SSLv3 除外);请参阅与dgst
上述相同位置的手册页,并注意-hmac $key
只能处理从 shell/etc 传递的字节序列,这不是全部,因此您可能需要-mac hmac -macopt hexkey:$hexkey
。
话虽如此,我同意 Gilles 的观点,让 wireshark 来做这件事要容易得多。如果你的问题在于你拥有的数据不是以捕获文件的形式存在的,wireshark 发行版附带了几个辅助命令行工具,用于操作通常可以构造虚假捕获的文件,在这种情况下,wireshark 或 tshark main 可以解密。