使用Java独立应用程序的SSL连接

时间:2010-05-19 21:03:02

标签: java encryption ssl

我创建了一个独立的可执行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文件,客户端将下载到他们的计算机。

对于这种情况,真的有必要的证书吗?

2 个答案:

答案 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)

使用这样的信任管理器(或匿名密码套件),连接仍将被加密(假设您没有启用使用空密码的密码套件,默认情况下永远不应启用该密码套件。)

但是,客户端不知道它与哪个实体交换秘密信息:它可能是一名中间人攻击者。

加密还不够:你需要知道你在和谁说话。客户需要验证:

  • 它信任服务器证书是真实的(这是信任管理员的目的,但不是这个特定的实现,因为它从不拒绝任何东西),
  • 此证书对客户要联系的主机名有效。