SSL-соединение клиента веб-сокета Javax

У меня проблема с javax.websocket (с использованием Eclipse IDE и сервера Jetty 9). Я написал ClientEnpdoint (со всеми аннотациями). Этот код отлично работает с "ws://", но у меня возникают проблемы при попытке использовать "wss://".

Я пытаюсь сделать это с помощью SSLContext, но не знаю, как я могу добавить SSLContextFactory в свой контейнер сеанса или сокета.

import java.io.FileInputStream;
import java.io.IOException;
import java.net.URI;
import java.security.KeyStore;
import java.util.Date;
import java.text.SimpleDateFormat;

import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;
import javax.websocket.*;
import javax.websocket.CloseReason.CloseCodes;
import javax.websocket.ClientEndpointConfig;
import javax.websocket.WebSocketContainer;

@ClientEndpoint
public class ScriptSocketJavax extends Thread{

    final static Logger logger = LogManager.getLogger(ScriptSocketJavax.class);

public int checkWork;
private String type;
private String opertr;
private String client;
private Date date = new Date();
private SimpleDateFormat formatForDateNow = new SimpleDateFormat("MM/dd/yyyy");
private Session session;
private URI uri;
WebSocketContainer container;
ClientEndpointConfig endpointConfig;

public ScriptSocketJavax(String opertr, String client, String type) throws Exception{

    this.checkWork = 0;
    this.uri = URI.create("wss://*****"); //ws://****
    this.type = type;
    this.client = client;
    this.opertr = opertr;
    this.container = ContainerProvider.getWebSocketContainer();
    this.container.setDefaultMaxTextMessageBufferSize(1024*1024);
    this.container.setDefaultMaxBinaryMessageBufferSize(1024*1024);

    try {

        String STORETYPE = "JKS";
        String KEYSTORE = "C:\\****";
        String STOREPASSWORD = "123456";
        String KEYPASSWORD = "123456";

        KeyStore ks = KeyStore.getInstance(STORETYPE);
        ks.load(new FileInputStream(KEYSTORE), STOREPASSWORD.toCharArray());
        KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
        kmf.init(ks, KEYPASSWORD.toCharArray());
        TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
        tmf.init(ks);

        SSLContext sslContext = null;
        sslContext = SSLContext.getInstance( "TLS" );
        sslContext.init( kmf.getKeyManagers(), tmf.getTrustManagers(), null );
        sslContext.getSocketFactory();
        SSLSocketFactory factory = sslContext.getSocketFactory();

        this.session = this.container.connectToServer(this, this.uri);  //obj, not class

или как я могу сделать все соединения доверенными?

Трассировки стека:

java.io.IOException: Connect failure
at org.eclipse.jetty.websocket.jsr356.ClientContainer.connect(ClientContainer.java:231)
at org.eclipse.jetty.websocket.jsr356.ClientContainer.connectToServer(ClientContainer.java:261)
at com.stepanov.utils.ScriptSocketJavax.<init>(ScriptSocketJavax.java:80)
...
at java.lang.Thread.run(Unknown Source)
Caused by: org.eclipse.jetty.websocket.api.UpgradeException: 0 null
...
at org.eclipse.jetty.websocket.client.WebSocketUpgradeRequest.onComplete(WebSocketUpgradeRequest.java:513)
... 3 more
Caused by: javax.net.ssl.SSLHandshakeException: General SSLEngine problem
...
... 15 more
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(Unknown Source)
at sun.security.validator.PKIXValidator.engineValidate(Unknown Source)
at sun.security.validator.Validator.validate(Unknown Source)
at sun.security.ssl.X509TrustManagerImpl.validate(Unknown Source)
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(Unknown Source)
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
... 23 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.build(Unknown Source)
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source)
at java.security.cert.CertPathBuilder.build(Unknown Source)
... 29 more

person Mikhail Stepanov    schedule 03.04.2018    source источник
comment
все связи? Его задавали много раз, см. этот вопрос, который содержит код вокруг TrustManager : stackoverflow.com/q/49454296/7748072 .   -  person Eugène Adell    schedule 03.04.2018


Ответы (1)


Прежде всего, ваш JAVA должен доверять сертификату URI. Чтобы JAVA доверяла ему, вам нужно добавить сертификат в хранилище ключей Java.

person Karnabanu Ashalagari    schedule 03.04.2018
comment
да я сделал это. но как я могу связать веб-сокет с сертификатом? - person Mikhail Stepanov; 04.04.2018
comment
Было бы лучше, если бы вы могли опубликовать полную трассировку стека ошибки - person Karnabanu Ashalagari; 04.04.2018
comment
Добавлена ​​трассировка стека. Я думаю это связано с тем, что я поставил в аргумент обычный вебсокет, к которому сертификат никак не привязан - person Mikhail Stepanov; 04.04.2018
comment
не могли бы вы попробовать этот вариант с java -Djavax.net.ssl.trustStore=trustStore - person Karnabanu Ashalagari; 04.04.2018