“握手期间远程主机关闭连接”错误的原因是啥?
Posted
技术标签:
【中文标题】“握手期间远程主机关闭连接”错误的原因是啥?【英文标题】:What is the cause of the error "Remote host closed connection during handshake"?“握手期间远程主机关闭连接”错误的原因是什么? 【发布时间】:2011-07-12 15:04:32 【问题描述】:我想使用 SSL 连接到 Oracle 数据库 11.2。但我收到的唯一错误是:
Exception in thread "main" java.sql.SQLException: I/O-Fehler: Remote host closed connection during handshake
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:465)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:534)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:217)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:28)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:527)
at java.sql.DriverManager.getConnection(DriverManager.java:582)
at java.sql.DriverManager.getConnection(DriverManager.java:154)
at TestOracle.testSSL(TestOracle.java:157)
at TestOracle.main(TestOracle.java:131)
Caused by: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:808)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1112)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:623)
at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:59)
at oracle.net.ns.Packet.send(Packet.java:420)
at oracle.net.ns.ConnectPacket.send(ConnectPacket.java:169)
at oracle.net.ns.NSProtocol.connect(NSProtocol.java:301)
at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1406)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:327)
... 8 more
Caused by: java.io.EOFException: SSL peer shut down incorrectly
at com.sun.net.ssl.internal.ssl.InputRecord.read(InputRecord.java:333)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:789)
... 16 more
我已将自签名证书添加到创建的钱包中。但是我不明白Oracle服务器如何使用它,因为它需要一个Oracle服务器不知道的密码。我必须看到密码吗?我必须在哪里设置?
在网络上,我可以看到 Oracle 服务器没有发送任何字节。它在客户端开始握手后关闭套接字。我认为问题出在服务器端。
我的听众.ora
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = C:\app\Administrator\product\11.2.0\dbhome_2)
(PROGRAM = extproc)
(ENVS = "EXTPROC_DLLS=ONLY:C:\app\Administrator\product\11.2.0\dbhome_2\bin\oraclr11.dll")
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = ora11.inetsoftware.local)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCPS)(HOST = ora11.inetsoftware.local)(PORT = 2484))
)
)
ADR_BASE_LISTENER = C:\app\Administrator
WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=C:\app\Administrator\product\11.2.0\dbhome_2\BIN\owm\wallets\Administrator)))
SSL_CLIENT_AUTHENTICATION=FALSE
我的 sqlnet.ora:
SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=C:\app\Administrator\product\11.2.0\dbhome_2\BIN\owm\wallets\Administrator)))
SSL_CLIENT_AUTHENTICATION=FALSE
【问题讨论】:
【参考方案1】:证书没有密码。证书所在的东西有一个密码。您的客户端知道密码,从事物中获取证书,然后将证书发送到服务器。
如果服务器由于某种原因不喜欢证书,它可能会关闭连接而不是继续握手。如果您不按请求发送它也是如此,如果您的证书不满足服务器在证书请求中指定的约束,就会发生这种情况。例如,如果服务器无法识别自签名者。您是否已将证书导出到服务器的信任库?
【讨论】:
客户端不知道证书或者钱包密码。信任商店是什么意思?自签名证书仅存储在受密码保护的钱包中。 @Horcrux7 我不明白你的第一句话。服务器在它信任的证书签名者的某个地方有一个存储库。如果自签名者不在该存储库中,则服务器将不信任它。如果证书是由 CA 签署的,您不会有问题,但您选择使用自签名证书,因此您可以让同行信任它。如果您不知道这意味着什么,您最好支付 50 美元并由公认的 CA 签署。 啊哈,我知道钱包是可信证书的存储。在 MS SQL Server 上只有一个商店。我存储在其中的所有证书都是可信的。 @Horcrux7 是的,但是您是否将所有受信任的证书存储在其中?这不是一回事。【参考方案2】:我找到了解决方案。这很简单。首先你需要设置自动登录。这会在钱包目录中创建一个文件 cwallet.sso。而且最重要的是你在启动TNS监听服务的时候已经在钱包管理器中关闭了钱包。否则侦听器无法加载文件 cwallet.sso。在跟踪文件中您可以看到错误:
ntzlogin:Wallet open failed with error 28759
如果您稍后关闭钱包,这将无效。看起来监听器只读取了一次文件。
【讨论】:
嗨@Horcrux7,面临同样的异常消息的相同问题,但无法理解您的解决方案 - “在您启动 TNS 侦听器服务时关闭钱包管理器中的钱包。”你指的是钱包管理器,你建议关闭哪个文件。我的服务器或客户端钱包证书都没有在任何编辑器中打开。请为我的情况提出一些解决方案。 如果你还没有打开钱包,那么你没有同样的问题。如果 TNS 侦听器写入一些错误,请查看跟踪文件。以上是关于“握手期间远程主机关闭连接”错误的原因是啥?的主要内容,如果未能解决你的问题,请参考以下文章
创建 AIR 文件时出错:无法生成时间戳:握手期间远程主机关闭连接
100 个用户工作正常,对于 200 个用户,它会给出“javax.net.ssl.SSLHandshakeException”错误,并显示“握手期间远程主机关闭连接”消息
SSLHandshakeException:握手期间远程主机关闭连接
javax.net.ssl.SSLHandshakeException:握手期间远程主机关闭连接