已验证的AZ pg require_secure_transport =“on”
没有任何 ssl
且没有 SET PGSSLMODE=require
,Windows cmd 中的以下命令成功:
pg_restore --format=custom -d "port=5432 host=mypg.postgres.database.azure.com user=myuser dbname=mydb" my.dump
检查 AZ 的 Log Analytics 工作区显示
connection authorized: user=myuser database=mydb application_name=pg_restore SSL enabled (protocol=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384, bits=256, compression=off)
那么这个 SSL/Secure 是如何建立或启用但操作不在 SSL channel 上的呢?
最佳答案
pg_restore 基于 libpq,并遵循其在这方面的约定。未设置的 sslmode 具有默认行为“prefer”。它首先尝试建立 SSL 连接,然后仅在第一次尝试失败时尝试不使用 SSL。因此,只要第一次尝试成功,“首选”与“要求”相同。如果您想证明服务器设置 require_secure_transport = "on"
正在执行某些操作,则应尝试在客户端上设置 sslmode=disable
。然后您应该会看到由客户端和服务器之间的不匹配导致的失败。
在您的评论中提到了 sslcert 和 sslkey。这些仅用于客户端证书身份验证。这是可选的,不寻常的,据我所知,Azure 托管的 PostgreSQL 甚至不支持。 SSL 通常仅使用服务器证书完成,而不使用客户端证书(例如,几乎所有通过 https 的 Web 都仅使用服务器证书,而不仅仅是 PostgreSQL)。
libpq(在 SSL 领域)的不同寻常之处在于,默认情况下,不需要验证服务器的证书。默认情况下,证书仅用作协商类似 Diffie-Hellman 的 key 交换的方式,可保护您免遭窃听,但不能防止假冒。如果您想验证连接的服务器是否正确,则需要设置 sslmode=verify-full 并配置 sslrootcert。这一切都由客户端控制。虽然服务器可以坚持要求客户端使用 SSL,但它无法坚持要求客户端实际验证服务器的证书。
关于postgresql - 那么这个SSL/Secure是如何建立的呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70280463/