首页 > 解决方案 > 通过代理和另一个域连接到 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?(根据我在此处和其他资源上阅读的信息 - 否)

标签: nginxsslgoogle-cloud-platformpaho

解决方案


如果您只是进行流代理,则不能随意更改域名,它需要与远程代理在证书中提供的域名相匹配,或者如您所见,它不会验证。

您可以通过设置强制客户端不验证服务器名称,client.tls_insecure_set(True)但这是一个非常糟糕的主意,应该只用于测试,而不能用于生产。


推荐阅读