如何通过Web服务创建“简单SSL”?


问题内容

我知道如何使用证书保护Web服务。那是我的客户代码:

  SSLContext ssl = SSLContext.getInstance("SSLv3");
  KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
  KeyStore store = KeyStore.getInstance(KeyStore.getDefaultType());
  String password = Configuration.getConfig("keyStorePassword");
  store.load(new FileInputStream(new File(Configuration.getConfig("keyStore"))), password.toCharArray());
  kmf.init(store, password.toCharArray());
  KeyManager[] keyManagers = new KeyManager[1];
  keyManagers = kmf.getKeyManagers();
  TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
  tmf.init(store);
  TrustManager[] trustManagers = tmf.getTrustManagers();
  ssl.init(keyManagers, trustManagers, new SecureRandom());

  HttpsConfigurator configurator = new HttpsConfigurator(ssl);
  Integer port = Integer.parseInt(Configuration.getConfig("port"));
  HttpsServer httpsServer = HttpsServer.create(new InetSocketAddress(Configuration.getConfig("host"), port), 0);
  httpsServer.setHttpsConfigurator(configurator);

  Implementor implementor = new Implementor(); // class with @WebService etc.
  HttpContext context = (HttpContext) httpsServer.createContext("/EventWebService");
  Endpoint endpoint = Endpoint.create( implementor );
  endpoint.publish(context);

现在,如何制作“简单SSL”?如何进行SSL连接而不在客户端存储证书。(就像通过浏览器中的HTTPS连接一样)


问题答案:

Java Runtime
Environment确实在cacerts文件中附带了很多(使用最广泛的)证书颁发机构。如果您用来保护服务安全的证书是由那些根CA之一签名的,则您不必担心与客户端共享任何证书。

但是,如果您使用自签名证书,并且不想在信任库中通过/导入证书,则可以实现自定义X509TrustManager并为连接创建自定义SSLContext。在此博客中有更多详细信息。

自签名证书对于开发和测试环境很有用,但是您确实应该考虑从公认的证书颁发机构(例如Verisign,Thwate等)获取服务器证书的签名。