【问题标题】:ssl.SSLError: [SSL: SSLV3_ALERT_BAD_RECORD_MAC] sslv3 alert bad record macssl.SSLError: [SSL: SSLV3_ALERT_BAD_RECORD_MAC] sslv3 警报坏记录 mac
【发布时间】:2020-08-15 07:52:50
【问题描述】:

我要做的是编写这段代码,该代码将从设备中提取证书并将其解析出来。此代码适用于某些设备,但适用于其他设备我收到此错误

PS C:\NetDevOps> & "C:/Program Files (x86)/Python38-32/python.exe" c:/NetDevOps/Cert/test6a.py
Traceback (most recent call last):
  File "c:/NetDevOps/Cert/test6a.py", line 17, in <module>
    pull = ssl.get_server_certificate((phoneip, 443))
  File "C:\Program Files (x86)\Python38-32\lib\ssl.py", line 1484, in get_server_certificate
    with context.wrap_socket(sock) as sslsock:
  File "C:\Program Files (x86)\Python38-32\lib\ssl.py", line 500, in wrap_socket
    return self.sslsocket_class._create(
  File "C:\Program Files (x86)\Python38-32\lib\ssl.py", line 1040, in _create
    self.do_handshake()
  File "C:\Program Files (x86)\Python38-32\lib\ssl.py", line 1309, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [SSL: SSLV3_ALERT_BAD_RECORD_MAC] sslv3 alert bad record mac (_ssl.c:1108)

这是我的代码:

import ssl
import OpenSSL.crypto

phonelist = ["10.129.157.30"]

for phoneip in phonelist:
    pull = ssl.get_server_certificate((phoneip, 443))
    x509 = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, pull)

output = open(str('C:/NetDevOps/Cert/certs.txt'), 'a+')
output.write(str(phoneip) + ' Certificate' + '\n')
output.write('Issuer: ' + str(x509.get_issuer()) + '\n')
output.write('Serial Number (cert): ' + str(x509.get_serial_number()) + '\n')
output.write('Subject: ' + str(x509.get_subject()) + '\n')
output.write('Not Valid Before: ' + str(x509.get_notBefore()) + '\n')
output.write('Not Valid After: ' + str(x509.get_notAfter()) + '\n')
output.write('\n')

我已经阅读了一堆关于证书验证失败的类似问题的 SO 文章,但是上面的代码正在使用描述为解决该问题的方法。本质上是使用 ssl.get_server_certificate 提取证书,然后通过 OpenSSL.crypto.load_certificate 解析 pem,但遗憾的是在故障设备上没有运气,即使代码确实适用于某些设备。

有什么想法吗?

【问题讨论】:

  • 尝试其他客户端,例如openssl s_client,看看您是否有同样的问题。问题可能与握手的完成方式和设备支持的内容有关。因此,查看 TLS 帧也会有所帮助。

标签: python ssl openssl cryptography x509


【解决方案1】:
... sslv3 alert bad record mac ...   

... 我已经阅读了一堆关于与证书验证失败相关的类似的 SO 文章,但是上面的代码正在使用描述为解决该问题的方法。

您看到的错误与证书验证无关,因此该区域的解决方法在这里不起作用。很可能服务器一开始就不能正确使用 TLS,或者服务器太坏而无法处理现代 TLS。一些较旧的和/或嵌入式系统存在这些问题。

如果知道这些损坏的系统以何种方式损坏,则可以解决这些损坏的系统。如果您设法使用浏览器连接到设备,可能会查看 TLS 握手中的差异并尝试调整 Python 连接方式。如果连浏览器都无法连接,您很可能会迷路。

【讨论】:

  • 当我使用网络浏览器通过 HTTPS 连接到它时,我得到了基本相同的错误。当我尝试使用 Web 浏览器通过 HTTP 连接到它时,它工作正常。它可能使用的是 Web 浏览器支持的旧版本的 TLS。目前尚不清楚 SSL 和 OpenSSL.crypto 包支持哪些 TLS 版本。 TLS 不匹配会导致此错误吗?
  • @RobertPhillips:一个简单的 TLS 不匹配可能会导致不同的错误。正如我已经说过的,可能是服务器根本不支持 TLS,或者实现被破坏了。过去有几个 TLS 堆栈,作者实际上并没有遵循标准,并做出了当时对大多数客户都适用的假设,但对现代客户来说不再适用。
  • openssl s_client 的输出在这里:pastebin.com/G97Y5SEp 看起来设备正在使用 TLSv1?
  • @RobertPhillips:看起来服务器在发送证书后中止握手并出现错误。但是get_server_certificate 需要一个完整的握手,没有办法。对我来说,这仍然看起来像是一些损坏的服务器。
  • 是否有替代 get_server_certificate 的方法来在没有完成握手的情况下提取证书(就像我可以通过网络浏览器执行的操作一样)?
猜你喜欢
  • 2019-05-10
  • 1970-01-01
  • 1970-01-01
  • 2011-10-12
  • 2017-02-17
  • 2011-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多