【发布时间】:2021-01-19 14:12:48
【问题描述】:
当我在一些随机 ip 上运行 main.py 时,我如何忽略使用 python 套接字验证 ssl 证书,它不响应任何东西,而在其他随机 ip 上它工作得很好 我该怎么做相当于 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)
【问题讨论】:
-
“我忽略验证 ssl 证书” 为什么?这样做会使 TLS 几乎无用,您也可以直接使用 HTTP。如果您无法对远程方进行身份验证,即使您发送加密的内容,您也不知道您将其发送给谁,因此您也可以明文发送。换一种说法:永远不要那样做。
-
另外,你应该使用相关的 Python 库来进行 HTTP 调用,而不是尝试自己手动生成字符串,因为你会陷入许多陷阱。
标签: python python-3.x sockets ssl