如何在Python脚本中自动输入PEM密码短语?
解决Python中websockets连接时自动输入PEM密码的问题
你的pexpect用法完全错误——你spawn的是Python代码片段,这不是可执行的系统命令,所以根本拦截不到当前进程中SSL模块弹出的密码提示。正确的做法是在创建SSL上下文时,直接为加密的PEM证书提供密码,无需外部输入。
正确实现方法
方法1:硬编码密码(简单直接,适合测试场景)
在加载证书链时,通过passphrase参数直接传入密码(注意是字节类型):
import ssl import websockets import asyncio async def connect_to_service(): serviceURL = "wss://your-target-url" # 初始化SSL上下文 ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) # 加载带密码的PEM证书,passphrase传字节格式的密码 ssl_context.load_cert_chain( certfile="path/to/your/certificate.pem", passphrase=b"ggadmin123" ) # 启用服务器证书验证(生产环境建议开启) ssl_context.check_hostname = True ssl_context.load_default_certs() # 建立websocket连接 async with websockets.connect(serviceURL, ssl=ssl_context) as websocket: print("连接成功") # 这里添加你的业务逻辑,比如收发消息 asyncio.run(connect_to_service())
方法2:使用密码回调(更安全,适合密码需要动态获取的场景)
如果不想硬编码密码,可以定义一个回调函数,当SSL模块需要密码时自动返回:
import ssl import websockets import asyncio def get_pem_passphrase(): # 这里可以从环境变量、配置文件或其他安全存储中获取密码 return b"ggadmin123" async def connect_to_service(): serviceURL = "wss://your-target-url" ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) ssl_context.load_cert_chain( certfile="path/to/your/certificate.pem", passphrase=get_pem_passphrase ) ssl_context.check_hostname = True ssl_context.load_default_certs() async with websockets.connect(serviceURL, ssl=ssl_context) as websocket: print("连接成功") # 业务逻辑代码 asyncio.run(connect_to_service())
关键说明
密码提示的本质是SSL模块在加载加密的PEM证书时,没有获取到解密密码,所以才会触发交互式输入。只要在load_cert_chain时传入正确的密码,就能完全避免这个提示。
内容的提问来源于stack exchange,提问作者Subhash Tiwari
相关产品推荐
相关产品推荐

