通过JDBC从Heroku应用外连接Heroku Postgres数据库的SSL报错咨询
该报错本质是Wolfram内置JVM默认信任证书库中没有Heroku数据库的SSL根证书,你提到的手动导入证书生成自定义truststore的方案完全可行,完整操作步骤如下:
操作步骤
1. 导出Heroku数据库的SSL证书
使用openssl工具导出目标数据库的证书,执行以下命令:
openssl s_client -connect <你的Heroku数据库域名>:<数据库端口> < /dev/null | sed -n '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/p' > heroku-db.crt
Heroku PostgreSQL数据库默认端口为5432,域名、端口、库名等信息均可从Heroku控制台对应数据库的DATABASE_URL配置项中拆解获取。
2. 生成自定义truststore文件
使用JDK自带的keytool工具将导出的证书导入到自定义信任库中,执行以下命令:
keytool -import -alias heroku-db -file heroku-db.crt -keystore heroku-truststore.jks
执行命令后按提示设置truststore密码,确认导入证书时输入yes即可,生成的heroku-truststore.jks即为自定义信任库文件。
3. 配置Wolfram JVM参数并建立连接
在Wolfram中执行以下代码完成连接配置:
(* 加载DatabaseLink包 *) Needs["DatabaseLink`"] (* 配置JVM加载自定义truststore *) JavaBlock[ (* 若未提前导入PostgreSQL JDBC驱动,先添加驱动路径到类路径 *) AddToClassPath["<你的PostgreSQL JDBC驱动jar包本地路径>"]; jvmSystem = JavaNew["java.lang.System"]; jvmSystem@setProperty["javax.net.ssl.trustStore", "<heroku-truststore.jks的本地绝对路径>"]; jvmSystem@setProperty["javax.net.ssl.trustStorePassword", "<你设置的truststore密码>"]; ] (* 建立数据库连接 *) conn = OpenSQLConnection[ JDBC["org.postgresql.Driver", "jdbc:postgresql://<你的Heroku数据库域名>:<端口>/<库名>?ssl=true&sslmode=verify-full"], "Username" -> "<你的数据库用户名>", "Password" -> "<你的数据库密码>" ]
执行完成后若没有报错,即代表连接成功,后续可直接使用conn进行数据库操作。
注意事项
- 所有代码中尖括号
<>包裹的占位符都需要替换为你自己的实际配置值 - 推荐使用42.2.23及以上版本的PostgreSQL JDBC驱动,避免版本兼容问题
- 若需要长期使用该连接,可以将两个JVM系统属性配置添加到Wolfram的JVM启动配置文件中,无需每次执行代码前重复设置
内容的提问来源于stack exchange,提问作者Daniel Bigham
相关产品推荐
相关产品推荐

