nginx - 通过代理和另一个域连接到 mqtt.googleapis.com:8883
问题描述
由于某些原因,我们的基础设施块mqtt.googleapis.com
。这就是为什么使用这样的配置部署 nginx 代理
stream {
upstream google_mqtt {
server mgtt.googleapis.com:8883;
}
server {
listen 8883;
proxy_pass google_mqtt;
}
}
它还具有带域名的外部 IPfake.mqtt.com
在这里使用示例我正在测试连接性。如果针对所有内容运行的脚本mgtt.googleapis.com:8883
都可以正常工作。但是,如果域切换fake.mqtt.com
出现错误:
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Hostname mismatch, certificate is not valid for 'fake.mqtt.com'
用于客户端实现paho.mqtt.client
。
使用 JWT 实现对 mqtt 代理的身份验证。
def create_jwt(project_id, private_key_file, algorithm):
token = {
# The time that the token was issued at
"iat": datetime.datetime.utcnow(),
# The time the token expires.
"exp": datetime.datetime.utcnow() + datetime.timedelta(minutes=20),
# The audience field should always be set to the GCP project id.
"aud": project_id,
}
# Read the private key file.
with open(private_key_file, "r") as f:
private_key = f.read()
print(
"Creating JWT using {} from private key file {}".format(
algorithm, private_key_file
)
)
return jwt.encode(token, private_key, algorithm=algorithm)
设置智威汤逊
client.username_pw_set(
username='unused',
password=create_jwt(project_id, private_key_file, algorithm))
TLS 配置:
client.tls_set(ca_certs='roots.pem', tls_version=ssl.PROTOCOL_TLSv1_2,)
你能建议在 nginx/paho-client 端配置什么吗?它是有效的解决方案吗?
或者可能是 3party 经纪人可以连接到mqtt.googleapis.com
?(根据我在此处和其他资源上阅读的信息 - 否)
解决方案
如果您只是进行流代理,则不能随意更改域名,它需要与远程代理在证书中提供的域名相匹配,或者如您所见,它不会验证。
您可以通过设置强制客户端不验证服务器名称,client.tls_insecure_set(True)
但这是一个非常糟糕的主意,应该只用于测试,而不能用于生产。
推荐阅读
- javascript - Google 跟踪代码管理器:提取 URL 的最后一部分
- javascript - 为什么即使一切都正确,快递服务器仍会响应错误
- r - 按列汇总:均值和总和
- javascript - 在 React 中渲染子后设置父状态
- python - 头肩交易策略
- javascript - Mobx 类无法读取未定义的属性“正在加载”
- javascript - 在 Vue 中以编程方式更改自动完成所选项目
- python-3.x - 为什么第二次迭代总是失败?
- amazon-web-services - AWS:Lambda:以编程方式添加 SNS 触发器
- bluetooth - 在 macOS Catalina 中更改蓝牙设备(魔术鼠标)的名称?