- ff_log: [tls @ 0x5b19021280] error:1408F119:SSL routines:SSL3_GET_RECORD:decryption failed or bad record mac
- 解决思路
- 你遇到的 SSL alert fatal: bad record mac 错误通常表示在 SSL/TLS 记录的加密或解密过程中出现了问题。这意味着消息认证码(MAC)验证失败,表明接收到的数据可能被篡改或损坏。导致此问题的可能原因有以下几个:
- 密码套件不匹配
客户端和服务器可能在协商不兼容的密码套件,导致加密或解密数据时失败。
确保客户端和服务器支持相同的密码套件,并且使用现代、强大的加密算法。
解决方法:可以使用 SSL_CTX_set_cipher_list 设置具体的密码套件,例如:
SSL_CTX_set_cipher_list(p->ctx, "HIGH:!aNULL:!MD5");
- TLS 版本不兼容
客户端和服务器可能使用了不同的 TLS/SSL 版本(例如,客户端使用 TLSv1.2,而服务器期望其他版本)。
确保客户端和服务器支持并协商相同的 TLS 版本。你可以通过 SSL_CTX_set_min_proto_version 和 SSL_CTX_set_max_proto_version 来显式设置 TLS 版本。
解决方法:例如,如果你想强制只使用 TLS 1.2,可以这样设置:
SSL_CTX_set_min_proto_version(p->ctx, TLS1_2_VERSION);
SSL_CTX_set_max_proto_version(p->ctx, TLS1_2_VERSION);
- 服务器端配置问题
服务器可能配置不正确,在握手过程中发送了错误或不完整的响应,这可能导致消息损坏并失败 MAC 检查。
查看服务器日志,确认是否有配置问题或不匹配的地方。
- 会话票据问题
可能问题出现在服务器发放会话票据时,错误正好出现在 SSLv3 read server session ticket A 消息之后。
会话票据用于客户端和服务器恢复 SSL 会话,但如果会话票据或其加密处理存在问题,可能会导致此类错误。
解决方法:你可以尝试禁用会话票据,看是否能解决问题:
SSL_CTX_set_options(p->ctx, SSL_OP_NO_TICKET);
- 证书或密钥文件问题
确保服务器的证书和私钥配置正确,并且文件的完整性没有问题。
检查证书和私钥是否匹配,并且已被正确加载到服务器中。
- MTU 或数据包分段问题
有时候,这类错误可能是由网络问题引起的,例如 MTU(最大传输单元)不匹配或 SSL/TLS 数据包的分段问题。
如果你所在的网络 MTU 较小,可以尝试使用 SSL_CTX_set_options 禁用压缩(SSL_OP_NO_COMPRESSION),以避免相关问题。
- 总结
由于我们使用的版本比较低,
通过这段代码,明确指定了 SSL/TLS 上下文只能使用 TLS 1.2 协议。这对于确保安全性非常重要,
因为旧版本的协议(如 SSL 3.0、TLS 1.0、TLS 1.1)存在许多已知的安全漏洞,而 TLS 1.2 是目前广泛使用的安全协议之一,通过设置1.2 解决
SSL_CTX_set_ssl_version(p->ctx, TLSv1_2_method());