[SPRING] SSL을 사용하여 Spring WebSocketClient를 사용하는 방법은 무엇입니까?
SPRINGSSL을 사용하여 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.각 websocket 컨테이너 구현은이 작업을 수행하는 방법을 제공한다고 생각합니다. StandardWebSocketClient .setUserProperties를 사용하여이 구성을 설정해야합니다. 모든 속성은 클라이언트가 사용하는 ClientEndpointConfig에서 내부적으로 설정됩니다.
각 websocket 컨테이너 구현은이 작업을 수행하는 방법을 제공한다고 생각합니다. StandardWebSocketClient .setUserProperties를 사용하여이 구성을 설정해야합니다. 모든 속성은 클라이언트가 사용하는 ClientEndpointConfig에서 내부적으로 설정됩니다.
다음은 Tomcat을 공급자로 사용한 예입니다.
StandardWebSocketClient wsClient = //...; SSLContext sslContext = //...; wsClient.setUserProperties(WsWebSocketContainer.SSL_CONTEXT_PROPERTY, sslContext);
어쨌든 당신이 사용해야하는 설정 키를 알기 위해서는 당신의 공급자 참조 문서를 참조해야합니다.
from https://stackoverflow.com/questions/32177803/how-to-use-spring-websocketclient-with-ssl by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 컨트롤러에서 유효성 검사 (@Valid) 전에 보안 액세스 (@Secured 또는 @PreAuthorize)를 확인하는 방법은 무엇입니까? (0) | 2019.07.17 |
---|---|
[SPRING] 동기화를 사용할 때 Spring 파티션에서 예기치 않은 오류가 발생했습니다. (0) | 2019.07.17 |
[SPRING] Spring MVC 누락 행렬 변수 (0) | 2019.07.17 |
[SPRING] `WebTestClient` 자동 - 자동 설정 없음 (0) | 2019.07.17 |
[SPRING] 기본 시스템 인증 / 사용자가있는 SecurityContext (0) | 2019.07.17 |