我正在尝试使用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: FATAL: connection requires a valid client certificate
似乎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
谢谢thomasbjones2。你的评论真的帮助了我。这就是我如何让我的pyspark连接postgredb。
这是在启用SSL的Google cloudsql中:
我的客户端和服务器证书是。pem格式。在阅读了thomasbjons2的建议后,我将我的密钥文件更改为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_path
}
# Read data from PostgreSQL into a DataFrame
df = spark.read
.jdbc(jdbc_url, "your_table_name", properties=properties)