В чем причина ошибки «Закрытое соединение удаленного хоста во время рукопожатия»? - PullRequest
1 голос
/ 12 июля 2011

Я хочу подключиться к базе данных Oracle 11.2 с помощью SSL.Но единственная ошибка, которую я получаю:

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 не отправляет байты.Он закрывает сокет после того, как клиент начал рукопожатие.Я думаю, что проблема на стороне сервера.

Мой listener.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

Ответы [ 2 ]

1 голос
/ 13 июля 2011

Сертификат не имеет пароля.У вещи, в которой находится сертификат, есть пароль.Ваш клиент знает пароль, получает сертификат от внешнего источника, отправляет сертификат на сервер.

Если серверу по какой-то причине не нравится сертификат, он может затем закрыть соединение, а не продолжать рукопожатие,То же самое, если вы не отправляете его по запросу, что произойдет, если ваш сертификат не удовлетворяет ограничениям, указанным сервером в запросе сертификата.Например, если сервер не распознает самозаверяющего.Вы экспортировали сертификат в хранилище доверенных сертификатов сервера?

0 голосов
/ 13 июля 2011

Я нашел решение. Это очень просто. Для начала вам нужно установить авто логин. Это создает файл cwallet.sso в каталоге кошелька. И самое главное, что вы закрыли кошелек в менеджере кошельков при запуске службы прослушивания TNS. В противном случае слушатель не может загрузить файл cwallet.sso. В файле трассировки вы можете увидеть ошибку:

ntzlogin:Wallet open failed with error 28759

Если вы закроете кошелек позже, это не повлияет. Похоже, слушатель прочитал файл только один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...