在Python中验证Peer
我正在尝试使用python创建套接字连接。
这是我的Python代码...
socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.settimeout(config['timeout'])
self.socket.connect((config['host'], config['port']))
self.ssl = ssl.wrap_socket(
self.socket,
certfile=config['certificate'],
keyfile=config['key']
)
它不起作用,因为远程服务器的证书似乎是自签名的或从信任存储库中丢失。 我是新来的python,并不知道如何禁用python中的verify_peer,所以连接可以工作。
我有工作代码在PHP中...
$context = stream_context_create([
'ssl' => [
'verify_peer' => false,
'local_cert' => $config['certificate'],
'local_pk' => $config['key']
]
]);
$socket = stream_socket_client(
'ssl://secure.test.com:700',
$errno, $errstr, $config['timeout'],
STREAM_CLIENT_CONNECT, $context
);
设置'verify_peer' => false
有助于建立连接。 我如何在Python中做类似的事情?
openssl调试
openssl s_client -connect secure.test.com:700
verify error:num=20:unable to get local issuer certificate
verify return:1
verify error:num=21:unable to verify the first certificate
verify return:1
请帮助和建议。 谢谢
禁用证书验证可以通过添加cert_reqs = ssl.CERT_NONE
来完成。 但是,只是禁用证书验证是一个非常糟糕的主意,因为您知道对中间人攻击敞开大门 。
因此您应该检查证书是否是预期的证书。 使用自签名证书(以及其他证书),您可以检查例如接收到的证书是否与期望的证书指纹相匹配,如下面的代码所示:
import socket
import ssl
import hashlib
dst = ('www.paypal.com',443)
fp_expected = '0722d46c216327bab8075f5db57ebed64d80e6699204c249c3f6ea9cc281c15b'
# connect to the target with TCP
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(dst)
# upgrade the socket to SSL without checking the certificate
s = ssl.wrap_socket(s,cert_reqs = ssl.CERT_NONE)
# get certificate, compute fingerprint and check against expected value
cert_bin = s.getpeercert(True)
fp = hashlib.sha256()
fp.update(cert_bin)
assert(fp.hexdigest() == fp_expected)
链接地址: http://www.djcxy.com/p/21749.html