Dataproc提交Sqoop作业连接Postgres报错:未找到证书路径信任锚点
问题根因
你的错误是PostgreSQL服务端使用了自签名/私有CA签发的SSL证书,而Dataproc集群节点的JRE默认信任库中没有对应的根证书,导致SSL握手时证书校验失败。你无法关闭SSL是因为PG端的pg_hba.conf配置了强制要求客户端使用SSL连接,所以不能直接移除ssl=true参数。
方案1:测试环境快速跳过证书校验(生产不推荐)
直接修改你的JDBC连接串,新增两个参数关闭证书校验,修改后如下:
JDBC_STR=jdbc:postgresql://xxxxx:5432/YYYY?ssl=true&sslmode=require&sslfactory=org.postgresql.ssl.NonValidatingFactory
注意:该方案会跳过服务端证书合法性校验,存在中间人攻击风险,仅适合测试验证使用。
方案2:生产环境标准配置
需将PG的根CA证书导入到所有Dataproc节点的JRE信任库中,步骤如下:
- 向PostgreSQL管理员获取服务端SSL对应的根CA证书文件(一般命名为
root.crt) - 编写Dataproc初始化脚本,内容如下,上传到你的GCS存储桶:
#!/bin/bash # 先将你上传到GCS的证书下载到节点本地 gsutil cp gs://你的存储桶路径/root.crt /tmp/root.crt # 导入证书到JRE默认信任库 keytool -import -alias postgres-ca -file /tmp/root.crt \ -keystore $JAVA_HOME/jre/lib/security/cacerts \ -storepass changeit -noprompt
- 重新创建Dataproc集群,指定使用上述初始化脚本即可;原有集群也可以手动登录每个节点执行上述命令完成导入,集群扩容时新节点会自动执行初始化脚本导入证书。
额外注意事项
你提交作业的命令中,--password=xxxx 后面缺少空格,会导致和后面的--driver参数拼接错误,修改后对应部分应为:
--password=xxxx --driver=org.postgresql.Driver
日志开头的HADOOP变量名警告为Dataproc已知的非致命警告,不影响作业正常运行,无需处理。
内容的提问来源于stack exchange,提问作者sacoder
相关产品推荐
相关产品推荐

