忽略验证SSL证书python套接字

时间:2020-10-04 15:10:59

标签: python python-3.x sockets ssl

当我在某些随机ip上运行main.py而不响应任何内容而在其他随机ip上运行完美时,如何忽略使用python套接字验证ssl证书 我该怎么做等同于 requests.get('https://51.83.254.xxx/',verify = False)的事情。

main.py

#!/usr/bin/env python3
#coding:utf-8

from bs4 import BeautifulSoup
from termcolor import colored
import concurrent.futures
import argparse
import socket
import json
import ssl
import sys

parser = argparse.ArgumentParser()

parser.add_argument("-f", "--file", help = "<inputfilename>: Input from list of hosts")
parser.add_argument("-p", "--port", help = "The port to which you want to receive a response from")
parser.add_argument("-w", "--workers", help = "The number of threads you want to use", default='5')
if len(sys.argv)==1:
    parser.print_help()
    sys.exit(1)

args = parser.parse_args()


IP = open(args.file)
IP = [x.strip('\n') for x in IP.readlines()]
port = int(args.port)
workers = int(args.workers)


def HTTPS(IP):
    try:
        context = ssl.SSLContext(ssl.PROTOCOL_TLS)
        context.verify_mode = ssl.CERT_NONE
        ssock = context.wrap_socket(socket.socket())
        socket.setdefaulttimeout(0.5)
        ssock.connect((IP, port))
        hostname = socket.getfqdn(IP)
        request = ("GET / HTTP/1.1\r\nHost: " + IP + "\r\nUser-Agent: Mozilla/5.0\r\nAccept: */*\r\n\r\n").encode('utf-8')
        ssock.sendall(request)
        while True:
            response = ssock.recv(2048).decode('utf-8')
            if ( len(response) < 1 ):
                break
            (headers, body) = response.split("\r\n\r\n")
            soup = BeautifulSoup(body, 'html.parser')
            if hostname == IP:
                print(colored(IP, 'green'), colored(port, 'yellow'), colored(soup.title.string, 'blue'),  json.dumps(headers))
            else:
                print(colored(IP, 'green'), colored(port, 'yellow'), colored(hostname, 'magenta'), colored(soup.title.string, 'blue'), json.dumps(headers))
        ssock.close()
    except (socket.timeout, socket.error, ssl.SSLError):
        pass


with concurrent.futures.ThreadPoolExecutor(max_workers=workers) as executor:
    executor.map(HTTPS, IP)

1 个答案:

答案 0 :(得分:0)

很遗憾,您根本没有提供任何有关发生的实际错误的详细信息。您似乎根本对这些错误都不感兴趣,因为您对多种错误都进行了简单的Number.parseInt("1", 1) 处理。但是,很可能您的问题最初不是由SSL验证引起的。列举一些可能在您的代码中发生的问题,您只需忽略它们即可:

  • SSL握手失败,因为服务器需要SNI扩展名(即目标主机名),但您未提供任何扩展名。这将是一个非常常见的错误。
  • SSL握手失败,因为没有共享密码或共享协议版本。
  • SSL握手失败,因为服务器需要客户端证书。
  • 当然,可能已经发生TCP到指定IP:端口的连接失败的情况。

禁用证书验证可以解决所有这些问题。

相关问题