使用带有HTTPS的javax.xml.ws.Endpoint

mar*_*tur 10 java https soap

我正在开展一个控制建筑物光照和供暖的项目.后端(用Java编写)将在Mac Mini上运行,并且应该可以通过SOAP访问.

我希望将此项目的复杂性保持在最低限度,因为我不希望每个人都使用它来设置应用程序服务器.到目前为止,我一直在使用javax.xml.ws.Endpoint:

 Endpoint endpoint = Endpoint.create(frontendInterface);
 String uri = "http://"+config.getHost()+":"+config.getPort()+config.getPath();

 endpoint.publish(uri);
Run Code Online (Sandbox Code Playgroud)

这种方法效果非常好(嘿,你们上次在Java中看到的东西只用了3行代码吗?),但现在我正在寻找一种使用HTTPS而不是HTTP的方法.

有没有办法在不使用应用程序服务器的情况下执行此操作,还是有另一种方法来保护此连接?

问候,马雷克

小智 17

对于服务器:

SSLContext ssl = SSLContext.getInstance("TLS");

KeyManagerFactory keyFactory = KeyManagerFactory                    .getInstance(KeyManagerFactory.getDefaultAlgorithm());
KeyStore store = KeyStore.getInstance("JKS");

store.load(new FileInputStream(keystoreFile),keyPass.toCharArray());

keyFactory.init(store, keyPass.toCharArray());


TrustManagerFactory trustFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());

trustFactory.init(store);

ssl.init(keyFactory.getKeyManagers(),
trustFactory.getTrustManagers(), new SecureRandom());

HttpsConfigurator configurator = new HttpsConfigurator(ssl);

HttpsServer httpsServer = HttpsServer.create(new InetSocketAddress(hostname, port), port);

httpsServer.setHttpsConfigurator(configurator);

HttpContext httpContext = httpsServer.createContext(uri);

httpsServer.start();

endpoint.publish(httpContext);
Run Code Online (Sandbox Code Playgroud)

对于客户,请确保执行此操作:

System.setProperty("javax.net.ssl.trustStore", "path");
System.setProperty("javax.net.ssl.keyStore", "password");
System.setProperty("javax.net.ssl.keyStorePassword", "password");
System.setProperty("javax.net.ssl.keyStoreType", "JKS");
//done to prevent CN verification in client keystore
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
   @Override
   public boolean verify(String hostname, SSLSession session) {
     return true;
   }
});
Run Code Online (Sandbox Code Playgroud)

  • 不验证主机名(使用"HostnameVerifier"允许任何操作)正在删除保护通信的重要步骤.不要这样做! (4认同)
  • 请注意,根据http://docs.oracle.com/javase/6/docs/jre/api/net,HttpsServer.create中的第二个参数是“允许在侦听套接字上排队的传入连接的最大数量” /httpserver/spec/com/sun/net/httpserver/HttpsServer.html (2认同)