Я не уверен, что не так с кодом ниже.Я пытаюсь установить соединение через сокет и хочу обработать все ошибки, используя попытку, но получаю ошибку.В этом случае происходит ошибка TimeoutError.
Ошибка:
<ipython-input-101-07e71cdc89b9> in get_certificate(hostname, port)
24 sock.close()
25 return HostInfo(cert=crypto_cert, peername=peername, hostname=hostname)
---> 26 except socket.error as error:
27 return
28
AttributeError: type object 'socket' has no attribute 'error'
Код:
from OpenSSL import SSL
from cryptography import x509
from cryptography.x509.oid import NameOID
import idna
import socket
from socket import socket
from collections import namedtuple
def get_certificate(hostname, port):
hostname_idna = idna.encode(hostname)
sock = socket()
try:
sock.connect((hostname, port))
peername = sock.getpeername()
ctx = SSL.Context(SSL.SSLv23_METHOD) # most compatible
ctx.check_hostname = False
ctx.verify_mode = SSL.VERIFY_NONE
sock_ssl = SSL.Connection(ctx, sock)
sock_ssl.set_connect_state()
sock_ssl.set_tlsext_host_name(hostname_idna)
sock_ssl.do_handshake()
cert = sock_ssl.get_peer_certificate()
crypto_cert = cert.to_cryptography()
sock_ssl.close()
sock.close()
return HostInfo(cert=crypto_cert, peername=peername, hostname=hostname)
except socket.error as error:
return
import concurrent.futures
if __name__ == '__main__':
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as e:
for hostinfo in e.map(lambda x: get_certificate(x[0], x[1]), HOSTS):
if hostinfo == None:
print("Data Not Available")
continue
else:
print_basic_info(hostinfo)