使用凭证连接NGS Global NATS服务器报错:nats: no ssl context provided
问题
使用凭证连接NGS Global NATS服务器时触发异常,报错信息如下:
2022-08-22 11:46:51,755 ERROR: nats: encountered error Traceback (most recent call last): File "/home/devaxe/.pyenv/versions/3.10.4/lib/python3.10/site-packages/nats/aio/client.py", line 419, in connect await self._process_connect_init() File "/home/devaxe/.pyenv/versions/3.10.4/lib/python3.10/site-packages/nats/aio/client.py", line 1792, in _process_connect_init raise errors.Error('nats: no ssl context provided')
触发错误的核心代码:
async def init_nats(): global ns try: ns = await nats.connect('connect.ngs.global', user_credentials=NATS_CREDS) if not _DEBUG \ else await nats.connect("nats://localhost:4222") return ns except Exception as e: print(f"[init_nats] Could not connect to NATS server. {e}") return None
_DEBUG常量定义:
def main(): global _DEBUG if len(sys.argv) == 2 and sys.argv[1] == '-d': _DEBUG = True
本地NATS服务器可正常连接,但远程NGS Global连接失败,搜索该错误无有效结果。
解决方案
报错原因是NGS Global的NATS服务要求SSL/TLS加密连接,但当前代码连接远程服务器时未提供SSL上下文,有两种修复方式:
方式1:使用tls=True快捷参数
直接在连接远程服务器时添加tls=True参数,nats.py库会自动创建默认的SSL上下文:
async def init_nats(): global ns try: # 远程连接添加tls=True参数 ns = await nats.connect('connect.ngs.global', user_credentials=NATS_CREDS, tls=True) if not _DEBUG \ else await nats.connect("nats://localhost:4222") return ns except Exception as e: print(f"[init_nats] Could not connect to NATS server. {e}") return None
方式2:显式创建SSL上下文
如果需要自定义SSL配置(比如指定CA证书),可以手动创建SSL上下文后传入:
import ssl async def init_nats(): global ns try: if not _DEBUG: # 创建默认SSL上下文 ssl_ctx = ssl.create_default_context() # 若需验证服务器证书,可加载CA证书文件 # ssl_ctx.load_verify_locations('/path/to/ca.crt') ns = await nats.connect('connect.ngs.global', user_credentials=NATS_CREDS, ssl=ssl_ctx) else: ns = await nats.connect("nats://localhost:4222") return ns except Exception as e: print(f"[init_nats] Could not connect to NATS server. {e}") return None
内容的提问来源于stack exchange,提问作者Houston_Ashford
相关产品推荐
相关产品推荐

