title: Can't create secure websocket in Spring application
body: <p>I have a spring-boot application and I am trying to open a secure websocket connection to a server, but I keep getting an error due to: No subject alternative names present. </p>
  
  <p>Here is what I have tried:</p>
  
  <pre><code>StandardWebSocketClient client = new StandardWebSocketClient();
  SSLContext sslContext = this.getSslContext("path/to/truststore", "path/to/keystore.p12", "password");
  client.getUserProperties().put(SSL_CONTEXT_PROPERTY, sslContext);
  WebSocketHttpHeaders headers = new WebSocketHttpHeaders();
  headers.add("Sec-WebSocket-Key", "SGVsbG8sIHdvcmxkIQ==");
  headers.add("Origin", "https://192.168.1.132:8445");
  headers.add("Sec-WebSocket-Version", "13");
  String url = "wss://192.168.1.132:8445/websocket";
  URI uri = new URI(url);
  ListenableFuture&lt;WebSocketSession&gt; future = client.doHandshake(new AbstractWebSocketHandler() {
      @Override
      public void handleMessage(WebSocketSession session, WebSocketMessage&lt;?&gt; message) throws Exception {
          receivedMessages += message.getPayload();
          System.out.println(message.getPayload());
      }
  }, headers, uri);
  WebSocketSession socketSession = future.get();
  </code></pre>
  
  <p>And here is the getSslContext method:</p>
  
  <pre><code>private SSLContext getSslContext(String trustStoreFile, String keystoreFile, String password)
          throws GeneralSecurityException, IOException {
      KeyStore keystore = KeyStore.getInstance("JKS");
      try (InputStream in = new FileInputStream(keystoreFile)) {
          keystore.load(in, password.toCharArray());
      }
      try (InputStream in = new FileInputStream(trustStoreFile)) {
          keystore.load(in, password.toCharArray());
      }
  
      KeyManagerFactory keyManagerFactory =
              KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
      keyManagerFactory.init(keystore, password.toCharArray());
  
      TrustManagerFactory trustManagerFactory =
              TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
      trustManagerFactory.init(keystore);
  
      SSLContext sslContext = SSLContext.getInstance("TLS");
      sslContext.init(
              keyManagerFactory.getKeyManagers(),
              trustManagerFactory.getTrustManagers(),
              new SecureRandom());
  
      return sslContext;
  }
  </code></pre>
  
  <p>Given this code, I am always getting the following error:</p>
  
  <pre><code>Caused by: java.security.cert.CertificateException: No subject alternative names present
      at java.base/sun.security.util.HostnameChecker.matchIP(HostnameChecker.java:141)
      at java.base/sun.security.util.HostnameChecker.match(HostnameChecker.java:100)
      at java.base/sun.security.ssl.X509TrustManagerImpl.checkIdentity(X509TrustManagerImpl.java:455)
      at java.base/sun.security.ssl.X509TrustManagerImpl.checkIdentity(X509TrustManagerImpl.java:429)
      at java.base/sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:283)
      at java.base/sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:141)
      at java.base/sun.security.ssl.CertificateMessage$T13CertificateConsumer.checkServerCerts(CertificateMessage.java:1302)
  </code></pre>
  
  <p>I have also tried to replicate the request using the following curl command:</p>
  
  <pre><code>curl --include --no-buffer --header "Connection: Upgrade" --header "Upgrade: websocket" --header "Sec-WebSocket-Key: SGVsbG8sIHdvcmxkIQ==" --header "Origin: https://192.168.1.132:8445" --header "Sec-WebSocket-Version: 13" -Ss --cacert myCA.pem --cert SSLCert.pem:`cat SSLCert.pass` https://192.168.1.132:8445/websocket
  </code></pre>
  
  <p>The handshake seems to be successful:</p>
  
  <pre><code>HTTP/1.1 101
  X-Content-Type-Options: nosniff
  X-XSS-Protection: 1; mode=block
  Cache-Control: no-cache, no-store, max-age=0, must-revalidate
  Pragma: no-cache
  Expires: 0
  X-Frame-Options: DENY
  X-Application-Context: panel-command-server:default,postgres,cassandra,kafka:8080
  Upgrade: websocket
  Connection: upgrade
  Sec-WebSocket-Accept: qGEgH3En71di5rrssAZTmtRTyFk=
  </code></pre>
  
  <p>Any ideas on what might be the reason behind the No subject alternative names present error from the spring application?</p>