Java 如何制作';简单SSL';通过网络服务?
我知道如何使用证书保护Web服务。这是我的客户代码: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
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服务数据交换包含敏感信息的情况下。但我感觉你已经意识到了后果,所以不用担心:-)