通过代理和另一个域连接到 mqtt.googleapis.com:8883

Connect to mqtt.googleapis.com:8883 via proxy and another domain

由于某些原因,我们的基础设施阻塞了 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, 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) 强制客户端不验证服务器名称,但这是一个非常糟糕的主意,应该只用于测试,切勿用于生产。