我正在尝试使用 ssl 通过 jdbc 连接到 postgres 服务器,但我很难弄清楚如何连接。现在我有:
jdbcDF = spark.read \
.format("jdbc") \
.option("url", "jdbc:postgresql:<URL>") \
.option("dbtable", "schema.tablename") \
.option("user", "postgress") \
.option("password", "<Password>") \
.option("driver", "org.postgresql.Driver") \
.option("useSSL", "true") \
.option("ssl", "true") \
.option("sslmode", "verify-ca") \
.load()
我的本地计算机上有证书、根目录和密钥,但收到错误:
Py4JJavaError:调用 o3419.load 时发生错误。 :org.postgresql.util.PSQLException:致命:连接需要有效的客户端证书
似乎 pyspark 上的 jdbc 需要证书采用非常特定的格式。它们必须是 DER 格式(并且密钥必须是 pk8 格式)。要获取 DER 格式的密钥,在 ubuntu 上您可以运行:
openssl pkcs8 -topk8 -inform PEM -in dev-client-key.pem -outform DER -out dev-client-key.pk8 -v1 PBE-MD5-DES
对于根证书和客户端证书,请使用类似以下内容:
openssl x509 -in ssl-key.key -out ssl-cert.der -outform DER
谢谢托马斯琼斯2。你的评论对我很有帮助。这就是我如何让 pyspark 连接 postgredb。
这是在启用 ssl 的 google cloudsql 中:
我的客户端和服务器证书采用 .pem 格式。我将密钥更改为 pk8 并且连接正常。
openssl rsa -noout -modulus -in private-key.pem | openssl sha256
这是完整的代码(希望这对某人有帮助)
# url
jdbc_url = "jdbc:postgresql://privateip:5432/database"
# Connection properties
properties = {
"user": user,
"password": password,
"driver": "org.postgresql.Driver",
"sslmode": "require",
"sslcert": pk8_client_cert_path,
"sslkey": client_key_path,
"sslrootcert": server_ca_enter code herepath
}
# Read data from PostgreSQL into a DataFrame
df = spark.read \
.jdbc(jdbc_url, "your_table_name", properties=properties)