通过Nginx反向代理访问Neptune DB时遭遇SSL证书错误
解决GremlinPython连接Nginx反向代理Neptune的SSL证书不匹配问题
问题根源
你遇到的SSLCertVerificationError核心原因是证书域名不匹配:
- 浏览器访问用的是Nginx所在EC2的公网IP(或对应域名),但代码里用的是Neptune的内部域名
xxxx.compute-1.amazonaws.com - Nginx配置的SSL证书对应EC2公网IP/域名,和Neptune内部域名不匹配,导致客户端SSL验证失败;浏览器可手动跳过警告,但GremlinPython默认严格验证证书有效性。
另外你修改hosts的方式错误:hosts文件不能带端口,且将Neptune域名指向127.0.0.1完全不符合需求,这只会让请求发向本地而非EC2反向代理。
可行解决方案
方案1:修改代码使用EC2公网IP作为Endpoint(推荐,符合反向代理逻辑)
既然通过Nginx反向代理访问Neptune,代码里应直接用EC2公网IP作为neptune_endpoint,而非Neptune内部域名:
from gremlin_python.driver import client import os import ssl # 替换为EC2的公网IP neptune_endpoint = os.environ.get('NEPTUNE_ENDPOINT', 'EC2_PUBLIC_IP') neptune_port = os.environ.get('NEPTUNE_PORT') neptune_uri = f'wss://{neptune_endpoint}:{neptune_port}/gremlin' # 若Nginx用自签名/不被信任的证书,添加ssl_context跳过验证(仅限测试环境) ssl_context = ssl.create_default_context() ssl_context.check_hostname = False ssl_context.verify_mode = ssl.CERT_NONE # 初始化客户端时传入ssl_context conn = client.Client(neptune_uri, 'g', ssl_context=ssl_context) # 执行查询 query_existing_IDs = """ g.V().hasLabel('Sentences').values('sentenceID').limit(2) """ response = conn.submit(query_existing_IDs) result = response.all().result() print(result)
注意:跳过SSL验证仅适合测试环境,生产环境必须配置域名匹配的合法SSL证书(比如给EC2公网IP绑定域名并申请对应证书)。
方案2:配置Nginx使用匹配Neptune域名的证书(生产环境推荐)
若必须在代码中使用Neptune内部域名,需:
- 给
xxxx.compute-1.amazonaws.com申请合法SSL证书(但AWS Neptune内部域名无法直接申请公网证书,此方案可行性低) - 或在Nginx中配置SNI,使用对应Neptune域名的自签名证书,同时在客户端代码中导入该证书验证:
import ssl ssl_context = ssl.create_default_context(cafile='/path/to/nginx-self-signed.crt') conn = client.Client(neptune_uri, 'g', ssl_context=ssl_context)
需确保自签名证书的CN字段为xxxx.compute-1.amazonaws.com。
方案3:修正hosts文件配置(仅本地测试用)
若坚持用Neptune内部域名访问,需修改hosts文件为:
EC2_PUBLIC_IP xxxx.compute-1.amazonaws.com
注意:hosts里不能加端口,需指向EC2公网IP而非127.0.0.1,之后结合方案1的
ssl_context跳过验证(因证书仍对应EC2,与Neptune域名不匹配)。
额外说明
浏览器能访问是因为手动跳过了SSL警告,但GremlinPython基于aiohttp实现,默认严格验证证书的域名匹配性和有效性,因此必须通过上述方式解决。生产环境强烈建议使用域名匹配的合法SSL证书,避免跳过验证带来的安全风险。
内容的提问来源于stack exchange,提问作者Péricles Serotini
相关产品推荐
相关产品推荐

