如何解决通过代理和另一个域连接到 mqtt.googleapis.com:8883
由于某些原因,我们的基础设施阻塞了 mqtt.googleapis.com
。这就是为什么用这样的配置部署nginx代理
stream {
upstream google_mqtt {
server mgtt.googleapis.com:8883;
}
server {
listen 8883;
proxy_pass google_mqtt;
}
}
还有外部IP,域名为fake.mqtt.com
使用示例 here 我正在测试连接性。
如果脚本针对 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)
设置 JWT
client.username_pw_set(
username='unused',password=create_jwt(project_id,algorithm))
TLS 配置:
client.tls_set(ca_certs='roots.pem',tls_version=ssl.PROTOCOL_TLSv1_2,)
您能否建议在 nginx/paho-client 端配置什么,它是否有效?
或者可能是 3party brokers 可以连接到 mqtt.googleapis.com
? (来自我在这里阅读的信息和其他资源 - 没有)
解决方法
如果您只是流代理,则不能随意更改域名,它需要与远程代理在证书中提供的域名匹配,否则将无法验证。
您可以通过设置 client.tls_insecure_set(True)
来强制客户端不验证服务器名称,但这是一个非常糟糕的主意,应仅用于测试,切勿用于生产。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。