我正在构建被动侦察工具,其功能之一是获取有关域的证书信息。我的机器的哪些详细信息要发送到Web服务器?以下代码用于获取证书信息。
from OpenSSL import SSL
from cryptography import x509
from cryptography.x509.oid import NameOID
import idna
from socket import socket
from collections import namedtuple
HostInfo = namedtuple(field_names='cert hostname peername', typename='HostInfo')
HOSTS = [
('google.com', 443),
('yahoo.com', 443),
('yahoo.com', 443),
]
def get_certificate(hostname, port):
hostname_idna = idna.encode(hostname)
sock = socket()
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)
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):
print_basic_info(hostinfo)
虽然Python并未明确发送您的IP,但它始终与任何TCP请求一起发送。如果未发送,则无法从服务器接收响应。
根据http://evanhahn.com/python-requests-library-useragent,用户代理为使用python-requests时,python-requests/{package version} {runtime}/{runtime version} {uname}/{uname -r}
,但是您可以通过设置请求标头来覆盖它。
但是,您不是使用python-requests,而是使用原始套接字,因此除了您告诉它的内容(以及您的IP和TCP连接的某些元数据)之外,没有数据传输。