복붙노트

[SPRING] SSL을 사용하여 Spring WebSocketClient를 사용하는 방법은 무엇입니까?

SPRING

SSL을 사용하여 Spring WebSocketClient를 사용하는 방법은 무엇입니까?

SSL을 사용하지 않는 엔드 포인트에 내 websocket 클라이언트를 아무런 문제없이 연결할 수 있습니다. 그러나 wss (SSL) 끝점에 연결하는 방법을 찾을 수 없습니다. SSL factory 등을 정의 할 수있는 곳은 없습니다. 어떤 객체도 set 메소드와 관련이없는 것 같습니다.

WebSocketClient transport = new StandardWebSocketClient();
WebSocketStompClient stompClient = new WebSocketStompClient(transport);
stompClient.setMessageConverter(new MappingJackson2MessageConverter());
String url = cfg.getWebsocketEndpoint();
StompSessionHandler handler = new MySessionHandler();
WebSocketHttpHeaders headers = new WebSocketHttpHeaders();
stompClient.connect(url, handler);

나는 wss : // url을 사용하고 있고 다른쪽에는 자체 서명 된 인증서가있는 서버가 있습니다. 그러나이 코드는 연결하는 동안 예외를 throw하지 않지만 세션은 설정되지 않습니다.

편집 : 웹 추적을 설정 한 후. * 표준 오류가 있습니다.

sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

자체 서명 된 인증서로 서버에 연결할 때 발생합니다. 그러나 RestTemplate에 대해이 코드로 SSLContext를 이미 업데이트했으며 REST 호출은 정상적으로 작동하지만 SSWontext를 무시하는 이유는 모르겠다. 왜?

    String keystoreType = "JKS";
    InputStream keystoreLocation = new FileInputStream("src/main/resources/aaa.jks");
    char [] keystorePassword = "zzz".toCharArray();
    char [] keyPassword = "zzz".toCharArray();

    KeyStore keystore = KeyStore.getInstance(keystoreType);
    keystore.load(keystoreLocation, keystorePassword);
    KeyManagerFactory kmfactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
    kmfactory.init(keystore, keyPassword);

    InputStream truststoreLocation = new FileInputStream("src/main/resources/aaa.jks");
    char [] truststorePassword = "zzz".toCharArray();
    String truststoreType = "JKS";

    KeyStore truststore = KeyStore.getInstance(truststoreType);
    truststore.load(truststoreLocation, truststorePassword);
    TrustManagerFactory tmfactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    tmfactory.init(truststore);

    KeyManager[] keymanagers = kmfactory.getKeyManagers();
    TrustManager[] trustmanagers =  tmfactory.getTrustManagers();

    SSLContext sslContext = SSLContext.getInstance("TLS");
    sslContext.init(keymanagers, trustmanagers, new SecureRandom());
    SSLContext.setDefault(sslContext);

업데이트 : 불행히도, 나는 커스텀 트러스트 스토어로 이것을 처리하지 못했습니다. InstallCert.java로 인증서를 설치했습니다.

해결법

  1. ==============================

    1.각 websocket 컨테이너 구현은이 작업을 수행하는 방법을 제공한다고 생각합니다. StandardWebSocketClient .setUserProperties를 사용하여이 구성을 설정해야합니다. 모든 속성은 클라이언트가 사용하는 ClientEndpointConfig에서 내부적으로 설정됩니다.

    각 websocket 컨테이너 구현은이 작업을 수행하는 방법을 제공한다고 생각합니다. StandardWebSocketClient .setUserProperties를 사용하여이 구성을 설정해야합니다. 모든 속성은 클라이언트가 사용하는 ClientEndpointConfig에서 내부적으로 설정됩니다.

    다음은 Tomcat을 공급자로 사용한 예입니다.

    StandardWebSocketClient wsClient = //...;
    SSLContext sslContext = //...;
    wsClient.setUserProperties(WsWebSocketContainer.SSL_CONTEXT_PROPERTY, sslContext);
    

    어쨌든 당신이 사용해야하는 설정 키를 알기 위해서는 당신의 공급자 참조 문서를 참조해야합니다.

  2. from https://stackoverflow.com/questions/32177803/how-to-use-spring-websocketclient-with-ssl by cc-by-sa and MIT license