Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何制作';简单SSL';通过网络服务?_Java_Web Services_Ssl - Fatal编程技术网

Java 如何制作';简单SSL';通过网络服务?

Java 如何制作';简单SSL';通过网络服务?,java,web-services,ssl,Java,Web Services,Ssl,我知道如何使用证书保护Web服务。这是我的客户代码: SSLContext ssl = SSLContext.getInstance("SSLv3"); KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); KeyStore store = KeyStore.getInstance(KeyStore.getDefaultType()); Str

我知道如何使用证书保护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进行连接)

只需使用HTTPS进行连接即可。只要客户端使用标准的可信证书,它就可以正常工作。如果他们有自签名证书,则需要将证书导入java密钥库

如果我理解正确,那么您希望只进行服务器端身份验证,就像您在浏览器中连接到https站点一样,而不需要客户端管理任何证书

您的客户端将像往常一样连接,只需在连接URL中将http替换为https即可。Java以
cacerts
的形式管理自己的一组“默认受信任根CA权限”,这是一个JKS密钥库文件,位于
$JRE HOME/lib/security
中。如果您从任何CA购买证书,其颁发的证书根于cacerts中包含的证书之一,则客户端的证书验证将自动成功。谷歌的“SSL/TLS服务器证书”,你会找到合适的供应商


另一方面,如果要使用自行颁发的证书,则除了在客户端的证书信任存储中导入自行颁发的证书外,无法在客户端上使证书验证成功。但这就是为什么一个“真正的”SSL/TLS证书需要花钱,而您自己颁发的证书却不需要花钱——任何人都可以生成他们自己开发的证书,但信任他们是完全不同的事情

Java运行时环境确实在cacerts文件中提供了大量(使用最广泛的)证书颁发机构。如果用于保护服务安全的证书由这些根CA之一签名,则无需担心与客户端共享任何证书

但是,如果您使用了自签名证书,并且不想在truststore中传递/导入证书,则可以实现自定义X509TrustManager并为您的连接创建自定义SSLContext。更多详细信息,请参阅本文


自签名证书对于开发和测试环境非常有用,但您确实应该考虑从一个公认的证书颁发机构签署的服务器证书,如VrISIGN、TWATE等

HTTPS在浏览器中工作,因为在客户机上有一个包含SSL证书的信任存储。换句话说:在客户端存储证书


如果您希望HTTPS不在客户端存储任何证书,我认为您应该看看,它解释了如何关闭HTTPS连接上的默认证书验证。

您可以通过以下方式控制HTTPS服务器是否需要客户端证书:

HttpsConfigurator cfg = new HttpsConfigurator(sslCtx){
  public void configure(HttpsParameters params) {
        SSLParameters sslparams = getSSLContext().getDefaultSSLParameters();

        // Modify the default params:
        // Using this, server will require client certs
        //sslparams.setNeedClientAuth(true);

        // Using this, server will request client certs. But if not available,
        // it will continue anyway.
        sslparams.setWantClientAuth(true);

        params.setSSLParameters(sslparams);
  }
};
HttpsServer httpsS = HttpsServer.create(new InetSocketAddress(8081), 50);
httpsS.setHttpsConfigurator(cfg);
如果不需要客户端证书,客户端可以在没有客户端证书的情况下进行连接,所以简单地调用https就可以了

在我的博客中,您可以看到如何绕过服务器证书和主机名验证的客户端示例(尽管不推荐,但对于测试非常有用)

我想创建安全的Web服务,但我不想在客户端计算机上放置任何证书。我想通过HTTPS像浏览器一样连接到服务器。客户端和服务器是我写的,我可以修改它。我的意思是:简单的TLS握手浏览器预装了公共可信证书,Java密钥库也是如此。他们不会动态地谈判……否则他们就不会被信任。我想,信任经理就是我要找的。我用精确的IP连接到服务器(所以不可能有人会欺骗)。我只是想保护连接不被窃听。我想得对吗?也许在将来,将需要生成客户端和服务器证书。啊……是的,但是如果您的web服务消费者在您的组织之外,他们就很难信任自签名证书。我建议你先付几美元,让你的客户感觉好些。我还建议获得一个合适的域,而不是共享一个包含IP地址的WSDL。自签名证书对于intranet应用程序和测试环境非常有用,但是对于外部客户机来说,额外的几块钱将大有帮助!客户在组织之外,为什么信任很难?你的意思是很难验证服务器?我知道CA的证书会更好,这个环境的管理员也知道这一点。现在,这不取决于我。也许,在未来,会有合适的证书(由CA颁发)等等。是的,我不是说技术上会更难。只是,对于提供自签名证书的站点,人们很难信任它,特别是在web服务数据交换包含敏感信息的情况下。但我感觉你已经意识到了后果,所以不用担心:-)