Neo4j - 由于身份验证失败,客户端未经授权
Neo4j - The client is unauthorized due to authentication failure
我目前 运行 Neo4j 版本 3.4.9 在 Google 云 VM 实例上,我遇到了无法解决的身份验证问题。
我的 Neo4j 服务器在云端 运行 正常,我可以使用 Neo4j 浏览器直接访问它。我已经更改了默认的 neo4j 用户密码。我也可以从 GraphQL 游乐场成功查询 Neo4j 服务器。
我检查了 neo4j-driver
和 neo4jgraphql-js
模块,它们都是最新版本。我还检查了我的 .env 文件,它具有与默认 neo4j
用户匹配的正确用户名和密码以及我从默认更改为的新密码。
我通过在 neo4j.conf
文件中将 dbms.security.auth_enabled
设置更改为 false
来尝试 运行 Neo4j 服务器而不进行身份验证,但这没有帮助。
我也检查了 Neo4j 服务器日志,这是服务器端的错误:
2020-07-21 17:59:48.830+0000 ERROR [o.n.b.t.TransportSelectionHandler] Fatal error occurred during protocol selection for connection: [id: 0x2434a10e, L:/10.154.0.2:7687 ! R:/86.151.231.207:63494] javax.net.ssl.SSLException: Received fatal alert: certificate_unknown
io.netty.handler.codec.DecoderException: javax.net.ssl.SSLException: Received fatal alert: certificate_unknown
at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:459)
at io.netty.handler.codec.ByteToMessageDecoder.channelInputClosed(ByteToMessageDecoder.java:392)
at io.netty.handler.codec.ByteToMessageDecoder.channelInputClosed(ByteToMessageDecoder.java:359)
at io.netty.handler.codec.ByteToMessageDecoder.channelInactive(ByteToMessageDecoder.java:342)
at io.netty.handler.ssl.SslHandler.channelInactive(SslHandler.java:1028)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:245)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:231)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:224)
at io.netty.channel.ChannelInboundHandlerAdapter.channelInactive(ChannelInboundHandlerAdapter.java:75)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:245)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:231)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:224)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelInactive(DefaultChannelPipeline.java:1429)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:245)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:231)
at io.netty.channel.DefaultChannelPipeline.fireChannelInactive(DefaultChannelPipeline.java:947)
at io.netty.channel.AbstractChannel$AbstractUnsafe.run(AbstractChannel.java:822)
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:404)
at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:309)
at io.netty.util.concurrent.SingleThreadEventExecutor.run(SingleThreadEventExecutor.java:884)
at java.lang.Thread.run(Thread.java:748)
Caused by: javax.net.ssl.SSLException: Received fatal alert: certificate_unknown
at sun.security.ssl.Alerts.getSSLException(Alerts.java:214)
at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1667)
at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1635)
at sun.security.ssl.SSLEngineImpl.recvAlert(SSLEngineImpl.java:1801)
at sun.security.ssl.SSLEngineImpl.readRecord(SSLEngineImpl.java:1090)
at sun.security.ssl.SSLEngineImpl.readNetRecord(SSLEngineImpl.java:913)
at sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:783)
at javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:626)
at io.netty.handler.ssl.SslHandler$SslEngineType.unwrap(SslHandler.java:294)
at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1275)
at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1177)
at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1221)
at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:489)
at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:428)
这表明存在证书错误,因此我已将 neo4j.conf
文件中的 config_dbms.connector.bolt.tls_level
设置更新为 OPTIONAL
,但我仍然收到此错误。我也试过将 config_dbms.connector.bolt.tls_level
设置为 DISABLED
,但它并没有解决问题,而且还产生了很多其他问题!
我探索过的一种解决方案是在 GCP 上为 Neo4j 服务器设置证书,但根据此 Neo4j 指南 here 您只能使用必须具有有效 DNS 地址的服务器来执行此操作,我的没有。我没有在创建时指定主机名,并且使用 GCP 您无法追溯添加主机名。
我能想到的唯一其他解决方案是在 GCP 上使用主机名构建一个新的 VM 实例,设置正确的 DNS 记录,获取证书并将我的应用程序指向新的 Neo4j 服务器。
您使用的是 neo4j-driver
和 neo4jgraphql-js
的最新版本,但您 运行 是旧的 neo4j 服务器版本 (3.4.9)。
您可能需要upgrade将neo4j服务器升级到最新版本。
或者,如果您不能这样做,您可以尝试使用与 neo4j 3.4.9 兼容的最新 JS 包。例如,neo4j-driver
version 1.7.7 声称是“for Neo4j 3.0.0+”。
我目前 运行 Neo4j 版本 3.4.9 在 Google 云 VM 实例上,我遇到了无法解决的身份验证问题。
我的 Neo4j 服务器在云端 运行 正常,我可以使用 Neo4j 浏览器直接访问它。我已经更改了默认的 neo4j 用户密码。我也可以从 GraphQL 游乐场成功查询 Neo4j 服务器。
我检查了 neo4j-driver
和 neo4jgraphql-js
模块,它们都是最新版本。我还检查了我的 .env 文件,它具有与默认 neo4j
用户匹配的正确用户名和密码以及我从默认更改为的新密码。
我通过在 neo4j.conf
文件中将 dbms.security.auth_enabled
设置更改为 false
来尝试 运行 Neo4j 服务器而不进行身份验证,但这没有帮助。
我也检查了 Neo4j 服务器日志,这是服务器端的错误:
2020-07-21 17:59:48.830+0000 ERROR [o.n.b.t.TransportSelectionHandler] Fatal error occurred during protocol selection for connection: [id: 0x2434a10e, L:/10.154.0.2:7687 ! R:/86.151.231.207:63494] javax.net.ssl.SSLException: Received fatal alert: certificate_unknown
io.netty.handler.codec.DecoderException: javax.net.ssl.SSLException: Received fatal alert: certificate_unknown
at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:459)
at io.netty.handler.codec.ByteToMessageDecoder.channelInputClosed(ByteToMessageDecoder.java:392)
at io.netty.handler.codec.ByteToMessageDecoder.channelInputClosed(ByteToMessageDecoder.java:359)
at io.netty.handler.codec.ByteToMessageDecoder.channelInactive(ByteToMessageDecoder.java:342)
at io.netty.handler.ssl.SslHandler.channelInactive(SslHandler.java:1028)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:245)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:231)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:224)
at io.netty.channel.ChannelInboundHandlerAdapter.channelInactive(ChannelInboundHandlerAdapter.java:75)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:245)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:231)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:224)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelInactive(DefaultChannelPipeline.java:1429)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:245)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:231)
at io.netty.channel.DefaultChannelPipeline.fireChannelInactive(DefaultChannelPipeline.java:947)
at io.netty.channel.AbstractChannel$AbstractUnsafe.run(AbstractChannel.java:822)
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:404)
at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:309)
at io.netty.util.concurrent.SingleThreadEventExecutor.run(SingleThreadEventExecutor.java:884)
at java.lang.Thread.run(Thread.java:748)
Caused by: javax.net.ssl.SSLException: Received fatal alert: certificate_unknown
at sun.security.ssl.Alerts.getSSLException(Alerts.java:214)
at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1667)
at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1635)
at sun.security.ssl.SSLEngineImpl.recvAlert(SSLEngineImpl.java:1801)
at sun.security.ssl.SSLEngineImpl.readRecord(SSLEngineImpl.java:1090)
at sun.security.ssl.SSLEngineImpl.readNetRecord(SSLEngineImpl.java:913)
at sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:783)
at javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:626)
at io.netty.handler.ssl.SslHandler$SslEngineType.unwrap(SslHandler.java:294)
at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1275)
at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1177)
at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1221)
at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:489)
at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:428)
这表明存在证书错误,因此我已将 neo4j.conf
文件中的 config_dbms.connector.bolt.tls_level
设置更新为 OPTIONAL
,但我仍然收到此错误。我也试过将 config_dbms.connector.bolt.tls_level
设置为 DISABLED
,但它并没有解决问题,而且还产生了很多其他问题!
我探索过的一种解决方案是在 GCP 上为 Neo4j 服务器设置证书,但根据此 Neo4j 指南 here 您只能使用必须具有有效 DNS 地址的服务器来执行此操作,我的没有。我没有在创建时指定主机名,并且使用 GCP 您无法追溯添加主机名。
我能想到的唯一其他解决方案是在 GCP 上使用主机名构建一个新的 VM 实例,设置正确的 DNS 记录,获取证书并将我的应用程序指向新的 Neo4j 服务器。
您使用的是 neo4j-driver
和 neo4jgraphql-js
的最新版本,但您 运行 是旧的 neo4j 服务器版本 (3.4.9)。
您可能需要upgrade将neo4j服务器升级到最新版本。
或者,如果您不能这样做,您可以尝试使用与 neo4j 3.4.9 兼容的最新 JS 包。例如,neo4j-driver
version 1.7.7 声称是“for Neo4j 3.0.0+”。