You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 18:20:34