Python WWS 库需要整个证书链来验证服务器
Python WWS Library requires entire certificate chain to verify server
我正在使用 ssl.py 连接到网络服务器,我想验证服务器证书。
我有一个 ROOT_CA,它签署了一个 INTERMEDIATE_CA,这最终签署了 SERVER_CERTIFICATE。
我只想向客户端提供 INTERMEDIATE_CA 以便它可以验证由它签名的所有证书。但是,看来我需要提供整个证书链 ROOT_CA->INTERMEDIATE_CA 才能进行验证。
对此有何见解?
这是我正在使用的脚本:
import asyncio
import pathlib
import ssl
import websockets
ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
ssl_context.check_hostname = False
ssl_context.verify_mode = ssl.CERT_REQUIRED
server_cert = pathlib.Path(__file__).with_name("intermediate_ca_server.ca-chain.cert.pem")
ssl_context.load_verify_locations(server_cert)
async def hello():
uri = "wss://<url>"
async with websockets.connect(
uri, ssl=ssl_context
) as websocket:
await websocket.send('test data')
greeting = await websocket.recv()
print(f"< {greeting}")
默认情况下,OpenSSL 需要完整的证书链,包括根证书。使用 OpenSSL 1.0.2 添加了一个新的验证标志 X509_V_FLAG_PARTIAL_CHAIN
,这使得即使该证书不是根证书(即主题和颁发者不同)也可以让信任链以受信任的证书结束。
看起来 Python 还没有为此定义常量,因此需要使用整数表示:
ctx = ssl.create_default_context()
ctx.load_verify_locations(cafile='subca.pem') # contains only sub-CA
ctx.verify_flags |= 0x80000 # set X509_V_FLAG_PARTIAL_CHAIN
ctx.ssl_wrap(...)
我正在使用 ssl.py 连接到网络服务器,我想验证服务器证书。
我有一个 ROOT_CA,它签署了一个 INTERMEDIATE_CA,这最终签署了 SERVER_CERTIFICATE。
我只想向客户端提供 INTERMEDIATE_CA 以便它可以验证由它签名的所有证书。但是,看来我需要提供整个证书链 ROOT_CA->INTERMEDIATE_CA 才能进行验证。
对此有何见解?
这是我正在使用的脚本:
import asyncio
import pathlib
import ssl
import websockets
ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
ssl_context.check_hostname = False
ssl_context.verify_mode = ssl.CERT_REQUIRED
server_cert = pathlib.Path(__file__).with_name("intermediate_ca_server.ca-chain.cert.pem")
ssl_context.load_verify_locations(server_cert)
async def hello():
uri = "wss://<url>"
async with websockets.connect(
uri, ssl=ssl_context
) as websocket:
await websocket.send('test data')
greeting = await websocket.recv()
print(f"< {greeting}")
默认情况下,OpenSSL 需要完整的证书链,包括根证书。使用 OpenSSL 1.0.2 添加了一个新的验证标志 X509_V_FLAG_PARTIAL_CHAIN
,这使得即使该证书不是根证书(即主题和颁发者不同)也可以让信任链以受信任的证书结束。
看起来 Python 还没有为此定义常量,因此需要使用整数表示:
ctx = ssl.create_default_context()
ctx.load_verify_locations(cafile='subca.pem') # contains only sub-CA
ctx.verify_flags |= 0x80000 # set X509_V_FLAG_PARTIAL_CHAIN
ctx.ssl_wrap(...)