【问题标题】:How to debug a TLS implementation如何调试 TLS 实现
【发布时间】:2014-05-30 15:11:13
【问题描述】:

我正在编写一个 TLS 实现,并且已经在服务器完成消息中停留了数周。 Openssl s_client 报错:

5820:错误:1408F119:SSL 例程:SSL3_GET_RECORD:解密失败或 坏记录 mac:.\ssl \s3_pkt.c:483:

这不是很有帮助,因为我无法追踪 MAC 或加密过程的任何错误。
Chrome 报错:

5820:错误:1408F119:SSL 例程:SSL3_GET_RECORD:解密失败或 坏记录 mac:.\ssl \s3_pkt.c:483:

而 Firefox 说:

无法与对等方安全通信:没有通用加密 算法。 (错误代码:ssl_error_no_cypher_overlap)

GNUtls-debug 更糟糕

拉取函数出错。

我已将可疑列表缩小到错误的 des3/aes256 实现(迄今为止我尝试过的唯一一个)或错误的 MAC,但我不能确定,并且已经检查过代码,感觉像是一千次都没有发现任何邪恶的事情发生。
问题
有没有办法让任何浏览器给出完整而详细的 SSL 错误?我只需要一份详细可靠的错误消息/调试日志。 是否有任何工具可用于调试 TLS 实现?

【问题讨论】:

  • 我认为对低级 TLS 协议工具的需求并不大,因为实现 TLS 的人并不多。我将在启用调试的情况下构建openssl 可执行文件,在调试器中运行s_client,并在ssl3_get_record() 中的每个decryption_failed_or_bad_record_mac = 1 上设置一个断点。 Wireshark 会做一些 SSL/TLS 解析,但我的猜测不是你想要的深度。您的服务器在互联网上吗?
  • 我的服务器目前不在线。我将在启用调试的情况下构建 openssl。
  • 我感受到你的痛苦。我前段时间写了一个 TLS 1.0/1.1 代理,并在这一步上挣扎了很长时间。我最终对我的交易进行了数据包捕获,然后手动计算所有值应该是什么。这花了很长时间,但是通过在我的代码中记录所有相关值,我可以手动计算出哪里出错了。我遇到的一些问题:
  • ... 我遇到的一些问题:正确捕获所有握手消息(但不是更改密码规范消息),从密钥材料中获取正确的加密密钥和 MAC 密钥,调用加密库正确用于加密和 MAC 功能,并使用来自客户端的解密完成消息来计算来自服务器的完成消息。也许这里的某些东西会触发一个对您有帮助的想法。

标签: google-chrome debugging firefox ssl openssl


【解决方案1】:

我在同一条船上,将嵌入式 TLS 1.0 实现更新为 TLS 1.2。我发现 Wireshark 非常适合我进行故障排除。

进入协议/SSL 的 Wireshark 首选项。从 RSA 密钥列表中,您可以为其指定您在服务器上使用的私钥的路径(在我的例子中,是一个 .pem 文件)。使用 SSL 调试文件配置 Wireshark,它会转储它解密的每个数据包的扩展调试信息。

现在,我发现我的 AES256 解密被破坏了,因为 Wireshark 的解码方式与我的实现方式不同。早些时候,我在 AES128 连接上获得了正确的明文,并且不得不解决我的 MAC 计算(或完成的消息,不记得是哪个)的一些问题。如果没有 Wireshark,很难知道解密或 MAC 步骤是否失败。

【讨论】:

    【解决方案2】:

    先tcpdump全部连接,确保没有遗漏一些协议如握手,Change Cipher Spec等,然后打开firfox调试选项和gdb火狐打印masterkey,6键对,并在你自己的实现中打印这些东西,然后你可能会找到答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-05
      • 1970-01-01
      • 1970-01-01
      • 2012-08-21
      • 1970-01-01
      • 1970-01-01
      • 2018-10-28
      • 2019-06-06
      相关资源
      最近更新 更多