Python 2.7基于标准库实现网站SSL/TLS版本检测的技术问询
检测网站SSL/TLS版本的Python 2.7实现(仅依赖标准库)
我帮你完善并整理了这个Python 2.7程序,它完全使用标准库就能检测目标网站支持的SSL/TLS版本。下面是完整可运行的代码:
#encoding=utf-8 import ssl import socket import traceback import logging import sys import json # 配置基础日志 logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') logger = logging.getLogger(__name__) class AnalyseSSL: # 指定兼容旧SSL版本的加密套件(部分老服务器需要) cipher_list = "RC4-SHA:AES128-SHA".split(":") # 定义要检测的SSL/TLS版本及对应的禁用参数 list_version_ssl_tls = [ ("SSLv2", ssl.OP_ALL | ssl.OP_NO_SSLv3 | ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1 | ssl.OP_NO_TLSv1_2), ("SSLv3", ssl.OP_ALL | ssl.OP_NO_SSLv2 | ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1 | ssl.OP_NO_TLSv1_2), ("TLSv1", ssl.OP_ALL | ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3 | ssl.OP_NO_TLSv1_1 | ssl.OP_NO_TLSv1_2), ("TLSv1.1", ssl.OP_ALL | ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3 | ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_2), ("TLSv1.2", ssl.OP_ALL | ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3 | ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1) ] @classmethod def check_ssl_version(cls, hostname, port=443, timeout=10): supported_versions = [] for version_name, ssl_opts in cls.list_version_ssl_tls: try: # 创建socket并设置超时 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(timeout) # 配置SSL上下文,仅启用当前要检测的版本 context = ssl.SSLContext(ssl.PROTOCOL_SSLv23) context.options = ssl_opts context.set_ciphers(':'.join(cls.cipher_list)) # 建立SSL连接 ssl_sock = context.wrap_socket(sock, server_hostname=hostname) ssl_sock.connect((hostname, port)) # 连接成功则标记该版本为支持 supported_versions.append(version_name) logger.info(f"✅ {hostname} supports {version_name}") ssl_sock.close() except Exception as e: logger.debug(f"❌ {hostname} does not support {version_name}: {str(e)}") # 如需调试可取消注释以下行,查看详细错误栈 # traceback.print_exc() continue return supported_versions if __name__ == "__main__": if len(sys.argv) < 2: print("Usage: python ssl_checker.py <hostname> [port]") sys.exit(1) hostname = sys.argv[1] port = int(sys.argv[2]) if len(sys.argv) > 2 else 443 result = AnalyseSSL.check_ssl_version(hostname, port) print(json.dumps({"hostname": hostname, "supported_ssl_tls_versions": result}, indent=2))
关键细节说明:
- 版本精准检测:每个版本通过
ssl.OP_NO_*参数禁用其他所有SSL/TLS版本,确保每次检测只验证目标版本的兼容性,避免干扰。 - 兼容旧服务器:指定
RC4-SHA等老旧加密套件,适配不支持现代加密算法的服务器。 - 异常容错:捕获握手失败、超时等所有连接异常,合理判定版本不被支持。
- 命令行易用性:直接通过命令行传入目标主机和端口(默认443),输出结构化的JSON结果。
使用示例:
python ssl_checker.py example.com
输出示例:
{ "hostname": "example.com", "supported_ssl_tls_versions": [ "TLSv1", "TLSv1.1", "TLSv1.2" ] }
内容的提问来源于stack exchange,提问作者SWIT ER
相关产品推荐
相关产品推荐

