【问题标题】:ignore verifying SSL certificates python sockets忽略验证 SSL 证书 python 套接字
【发布时间】:2021-01-19 14:12:48
【问题描述】:

当我在一些随机 ip 上运行 main.py 时,我如何忽略使用 python 套接字验证 ssl 证书,它不响应任何东西,而在其他随机 ip 上它工作得很好 我该怎么做相当于 requests.get('https://51.83.254.xxx/', verify=False)。

ma​​in.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)

【问题讨论】:

  • “我忽略验证 ssl 证书” 为什么?这样做会使 TLS 几乎无用,您也可以直接使用 HTTP。如果您无法对远程方进行身份验证,即使您发送加密的内容,您也不知道您将其发送给谁,因此您也可以明文发送。换一种说法:永远不要那样做。
  • 另外,你应该使用相关的 Python 库来进行 HTTP 调用,而不是尝试自己手动生成字符串,因为你会陷入许多陷阱。

标签: python python-3.x sockets ssl


【解决方案1】:

很遗憾,您根本没有提供有关发生的实际错误的详细信息。看起来您甚至对这些错误根本不感兴趣,因为您对许多类型的错误都进行了简单的pass。但是很可能您的问题首先不是由 SSL 验证引起的。举几个你的代码中可能发生的并且你忽略的问题中的几个:

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

这些问题都不能通过禁用证书验证来解决。

【讨论】:

    猜你喜欢
    • 2016-08-04
    • 1970-01-01
    • 2013-10-16
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2018-03-25
    相关资源
    最近更新 更多