Не получается создать SSL подключение к Bitstamp на java с помощью протокола Fix

240
09 января 2020, 03:20

Всем привет! Возникла проблема при подключении к Bitstamp для получения мгновенной информации с биржи. Делаю простенькое sslsocket соединение, но выдает exception типа "unable to find valid certification path to requested target". До этого я успешно смог подключаться к этой бирже и тягать данные по http (есть соединение с биржей). Они внесли мой айпи и ключ в вайтлист и с помощью FixSimulator успешно обменивался fix сообщениями с биржей (есть соединение с помощью Fix-протокола). Но при соединении через java код у меня вылезает странный exception. Теоретически это может быть и не моя ошибка (хотя, это наиболее вероятно), а их, потому что у этой биржи есть ошибки в API, странные ограничения для подключения и неполная документация. Подскажите что-то дельное, в какую сторону копать. Мой код:

public static void main(String[] args) throws IOException {
        SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
        SSLSocket sslSocket = (SSLSocket) sslsocketfactory.createSocket("fix.bitstamp.net", 8905);
        sslSocket.startHandshake();
        PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(sslSocket.getOutputStream())));
        String logonText = FixLibrary.getLogon(1);
        System.out.println(logonText);
        out.print(logonText);
        out.flush();
        BufferedReader in = new BufferedReader(new InputStreamReader(sslSocket.getInputStream()));
        String inputLine;
        while ((inputLine = in.readLine()) != null) {
            System.out.println(inputLine);
        }
        in.close();
        out.close();
        sslSocket.close();
}

Exception следующего вида:

"C:\Program Files\Java\jdk1.8.0_201\bin\java" -Didea.launcher.port=7534 "-Didea.launcher.bin.path=C:\Program Files (x86)\JetBrains\IntelliJ IDEA Community Edition 2016.2.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_201\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\rt.jar;F:\JAVA\Проекты\BitstampConnection\target\classes;C:\Users\Nikita\.m2\repository\com\squareup\okhttp3\okhttp\3.14.0\okhttp-3.14.0.jar;C:\Users\Nikita\.m2\repository\com\squareup\okio\okio\2.2.2\okio-2.2.2.jar;C:\Users\Nikita\.m2\repository\org\jetbrains\kotlin\kotlin-stdlib\1.2.60\kotlin-stdlib-1.2.60.jar;C:\Users\Nikita\.m2\repository\org\jetbrains\kotlin\kotlin-stdlib-common\1.2.60\kotlin-stdlib-common-1.2.60.jar;C:\Users\Nikita\.m2\repository\org\jetbrains\annotations\13.0\annotations-13.0.jar;C:\Users\Nikita\.m2\repository\com\squareup\moshi\moshi\1.8.0\moshi-1.8.0.jar;C:\Users\Nikita\.m2\repository\com\google\code\gson\gson\2.8.5\gson-2.8.5.jar;C:\Program Files (x86)\JetBrains\IntelliJ IDEA Community Edition 2016.2.4\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain FirstTest
Exception in thread "main" javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
    at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1946)
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:316)
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:310)
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1639)
    at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:223)
    at sun.security.ssl.Handshaker.processLoop(Handshaker.java:1037)
    at sun.security.ssl.Handshaker.process_record(Handshaker.java:965)
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1064)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1367)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1395)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1379)
    at FirstTest.main(FirstTest.java:79)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:397)
    at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:302)
    at sun.security.validator.Validator.validate(Validator.java:262)
    at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324)
    at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229)
    at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124)
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1621)
    ... 13 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141)
    at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126)
    at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280)
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:392)
    ... 19 more
Process finished with exit code 1

К сожалению метод FixLibrary.getLogon() показать не могу, так как он содержит в себе ключи, но я уверен в том, что он возвращает гарантированно правильную строку для подключения, я ее перепроверял на стороннем приложении (FixSimulator). Что я делаю не так?

Answer 1

Надо добавить сертификат сервера в локальный trust store и указать путь при помощи Java-property: -Djavax.net.ssl.trustStore=<path_to_your_jks_file>

READ ALSO
Книги и учебные ресурсы по Java

Книги и учебные ресурсы по Java

Собираем подборку качественной литературы по Java

246
Как вытащить id видео ссылки YouTube?

Как вытащить id видео ссылки YouTube?

Как ссылки, например https://youtube/KYukvjnHxo и https://youtube

212
Как из .java сделать .class?

Как из .java сделать .class?

Я декомпилировал плагин в одной игре, изменил в нем пару слов и он стал форматаjava, как мне его скомпилировать обратно в формат

216
Java, InstelliJ и ошибка Error:(24, 39) java: illegal start of expression

Java, InstelliJ и ошибка Error:(24, 39) java: illegal start of expression

Помогите избавиться от ошибкиВот код:

202