我创建了一个独立的可执行JAR程序,需要通过SSL连接发送私人信息 我无法使用证书建立SSL连接。得到这个:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path `building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target`
所以我发现某些代码创建了一个不验证证书链的信任管理器:
// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
}
}
};
这就是诀窍,我能够在没有任何证书的情况下建立SSL连接。
我担心的是,在交换私人信息时,数据是否仍会被加密。 这是一个执行JAR文件,客户端将下载到他们的计算机。
对于这种情况,真的有必要的证书吗?
答案 0 :(得分:4)
它仍然是加密但不值得信赖。最好修复证书验证问题。
基本上,SSL提供加密和信任机制。您绕过了信任部分,因此消息仍然会被加密,但很容易被拦截或窥探,例如使用中间人攻击。 MITM可以拦截请求,并使用完全不同的证书完成SSL握手。他们可以选择将您的消息转发到预期的服务器&回来了,所以你永远不会知道邮件被截获了。
您应该查看下载服务器证书并将其放入信任库中,该信任库可以在运行时加载。
见keytool。 keytool可执行文件与JDK捆绑在一起,您可以使用此命令行工具创建“密钥库”(在本例中称为“信任库”),并将证书导入其中。
有很多方法可以告诉Java使用密钥库,您的选择取决于您用于建立SSL连接的库等。 一种方法是使用启动选项,例如:
-Djavax.net.ssl.trustStore = mySrvKeystore -Djavax.net.ssl.trustStorePassword = 123456
最好google for“keystore java”加上您的图书馆名称(如果您使用的是)
HTH
答案 1 :(得分:2)
使用这样的信任管理器(或匿名密码套件),连接仍将被加密(假设您没有启用使用空密码的密码套件,默认情况下永远不应启用该密码套件。)
但是,客户端不知道它与哪个实体交换秘密信息:它可能是一名中间人攻击者。
加密还不够:你需要知道你在和谁说话。客户需要验证: