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