在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

上一篇: Verify Peer in python

下一篇: ASP .NET MVC sensitive data