我正在尝试编写此代码,该代码将从设备中提取证书并解析出来。此代码适用于某些设备,但适用于其他设备,但出现此错误
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')
我已经阅读了很多关于与证书验证失败相关的类似文章,但是上面的代码使用的方法被描述为解决该问题的方法。本质上是使用ssl.get_server_certificate来提取证书,然后通过OpenSSL.crypto.load_certificate解析pem,但是即使代码确实可以在某些设备上运行,也不能给失败的设备带来好运。
有什么想法吗?
... sslv3 alert bad record mac ...
...我已经阅读了很多关于与证书验证失败相关的类似文章,但是上面的代码使用的方法被描述为解决该问题的方法。
您看到的错误与证书验证无关,因此,此区域中的解决方法在这里不起作用。服务器很可能一开始无法正确说出TLS,或者太破损而无法处理现代TLS。一些较旧的和/或嵌入式系统存在这些问题。
如果知道这种损坏的系统是以哪种方式损坏的,则有可能解决它。如果您设法使用浏览器连接到设备,则可以查看TLS握手中的差异并尝试适应Python连接的方式。如果连浏览器都无法连接,您很可能会迷路。