Redshift 连接问题:致命:用户密码验证失败
Redshift connection issue: FATAL: password authentication failed for user
我们正在远程连接到 AWS Redshift 实例。
我们可以成功连接 Aginity workbench。
但是,我们无法连接基于 JDBC 的工具 (DBVisualizer)。
我们正在使用 Postgresql 驱动程序 8.4-703(来自 Redshift 文档)。
需要 SSL。
我们使用非标准端口 (1433)。
返回的消息是
FATAL: password authentication failed for user xxxx
JDBC 字符串是
jdbc:postgresql://xxxxxxx.us-west-2.redshift.amazonaws.com:1433/dev?tcpKeepAlive=true
调试是:
org.postgresql.util.PSQLException: FATAL: password authentication failed for user "xxxx"
at org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:291)
at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:108)
at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:66)
at org.postgresql.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:125)
at org.postgresql.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:30)
at org.postgresql.jdbc3g.AbstractJdbc3gConnection.<init>(AbstractJdbc3gConnection.java:22)
at org.postgresql.jdbc4.AbstractJdbc4Connection.<init>(AbstractJdbc4Connection.java:30)
at org.postgresql.jdbc4.Jdbc4Connection.<init>(Jdbc4Connection.java:24)
at org.postgresql.Driver.makeConnection(Driver.java:393)
at org.postgresql.Driver.connect(Driver.java:267)
at sun.reflect.GeneratedMethodAccessor55.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.onseven.dbvis.g.B.D.?(Z:1413)
at com.onseven.dbvis.g.B.F$A.call(Z:1474)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
SQLException: SQLState(28000)
更新:我在 JDBC 字符串中添加了 SSL=true ..
新字符串:
jdbc:postgresql://xxxxxxx.us-west-2.redshift.amazonaws.com:1433/dev?tcpKeepAlive=true&ssl=true
新调试是:
org.postgresql.util.PSQLException: The connection attempt failed.
at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:150)
at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:66)
at org.postgresql.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:125)
at org.postgresql.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:30)
at org.postgresql.jdbc3g.AbstractJdbc3gConnection.<init>(AbstractJdbc3gConnection.java:22)
at org.postgresql.jdbc4.AbstractJdbc4Connection.<init>(AbstractJdbc4Connection.java:30)
at org.postgresql.jdbc4.Jdbc4Connection.<init>(Jdbc4Connection.java:24)
at org.postgresql.Driver.makeConnection(Driver.java:393)
at org.postgresql.Driver.connect(Driver.java:267)
at sun.reflect.GeneratedMethodAccessor55.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.onseven.dbvis.g.B.D.?(Z:1413)
at com.onseven.dbvis.g.B.F$A.call(Z:1474)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
SQLException: SQLState(08001)
显然我们已经对密码进行了四次检查。
要为 JDBC 启用 SSL 选项,您必须下载 redshift 证书并将其添加到计算机上的 Java 系统信任库中。
步骤如下:
从 here 下载 Amazon Redshift 证书文件。
将 Redshift 证书注册到您的 Java 系统信任库。
- 运行
${JAVA_HOME}/bin/keytool -keystore ${JAVA_HOME}/lib/security/cacerts -import -alias <alias> -file <certificate_filename>
- 运行
${JAVA_HOME}/bin/keytool -keystore <keystore_name> -alias <alias> -import -file <certificate_filename>
创建您自己的信任库,如果您没有访问 cacerts 的权限。
- 默认密码为
changeit
- 在 java VM 属性中指定密钥库和密码
- 打开 [DbVisualizer] -> [首选项] -> [常规] 选项卡 -> [常规]
- 编辑 "Java VM Properties" 部分
-Djavax.net.ssl.trustStore=key_store_name_or_path
Djavax.net.ssl.trustStorePassword=password
- 应用并重启
上述命令中的某些路径可能需要根据您的环境进行更改。有关详细信息,请参阅 Amazon Redshift Management Guide。
至于身份验证错误,应用程序级别可能存在不支持的密码符号。值得尝试更改密码以使其变得简单,例如仅包含“_”符号。
我们正在远程连接到 AWS Redshift 实例。
我们可以成功连接 Aginity workbench。
但是,我们无法连接基于 JDBC 的工具 (DBVisualizer)。
我们正在使用 Postgresql 驱动程序 8.4-703(来自 Redshift 文档)。
需要 SSL。
我们使用非标准端口 (1433)。
返回的消息是
FATAL: password authentication failed for user xxxx
JDBC 字符串是
jdbc:postgresql://xxxxxxx.us-west-2.redshift.amazonaws.com:1433/dev?tcpKeepAlive=true
调试是:
org.postgresql.util.PSQLException: FATAL: password authentication failed for user "xxxx"
at org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:291)
at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:108)
at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:66)
at org.postgresql.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:125)
at org.postgresql.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:30)
at org.postgresql.jdbc3g.AbstractJdbc3gConnection.<init>(AbstractJdbc3gConnection.java:22)
at org.postgresql.jdbc4.AbstractJdbc4Connection.<init>(AbstractJdbc4Connection.java:30)
at org.postgresql.jdbc4.Jdbc4Connection.<init>(Jdbc4Connection.java:24)
at org.postgresql.Driver.makeConnection(Driver.java:393)
at org.postgresql.Driver.connect(Driver.java:267)
at sun.reflect.GeneratedMethodAccessor55.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.onseven.dbvis.g.B.D.?(Z:1413)
at com.onseven.dbvis.g.B.F$A.call(Z:1474)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
SQLException: SQLState(28000)
更新:我在 JDBC 字符串中添加了 SSL=true ..
新字符串:
jdbc:postgresql://xxxxxxx.us-west-2.redshift.amazonaws.com:1433/dev?tcpKeepAlive=true&ssl=true
新调试是:
org.postgresql.util.PSQLException: The connection attempt failed.
at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:150)
at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:66)
at org.postgresql.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:125)
at org.postgresql.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:30)
at org.postgresql.jdbc3g.AbstractJdbc3gConnection.<init>(AbstractJdbc3gConnection.java:22)
at org.postgresql.jdbc4.AbstractJdbc4Connection.<init>(AbstractJdbc4Connection.java:30)
at org.postgresql.jdbc4.Jdbc4Connection.<init>(Jdbc4Connection.java:24)
at org.postgresql.Driver.makeConnection(Driver.java:393)
at org.postgresql.Driver.connect(Driver.java:267)
at sun.reflect.GeneratedMethodAccessor55.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.onseven.dbvis.g.B.D.?(Z:1413)
at com.onseven.dbvis.g.B.F$A.call(Z:1474)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
SQLException: SQLState(08001)
显然我们已经对密码进行了四次检查。
要为 JDBC 启用 SSL 选项,您必须下载 redshift 证书并将其添加到计算机上的 Java 系统信任库中。
步骤如下:
从 here 下载 Amazon Redshift 证书文件。
将 Redshift 证书注册到您的 Java 系统信任库。
- 运行
${JAVA_HOME}/bin/keytool -keystore ${JAVA_HOME}/lib/security/cacerts -import -alias <alias> -file <certificate_filename>
- 运行
${JAVA_HOME}/bin/keytool -keystore <keystore_name> -alias <alias> -import -file <certificate_filename>
创建您自己的信任库,如果您没有访问 cacerts 的权限。 - 默认密码为
changeit
- 运行
- 在 java VM 属性中指定密钥库和密码
- 打开 [DbVisualizer] -> [首选项] -> [常规] 选项卡 -> [常规]
- 编辑 "Java VM Properties" 部分
-Djavax.net.ssl.trustStore=key_store_name_or_path
Djavax.net.ssl.trustStorePassword=password
- 应用并重启
上述命令中的某些路径可能需要根据您的环境进行更改。有关详细信息,请参阅 Amazon Redshift Management Guide。
至于身份验证错误,应用程序级别可能存在不支持的密码符号。值得尝试更改密码以使其变得简单,例如仅包含“_”符号。