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

使用Java独立应用程序的SSL连接,java,encryption,ssl,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 cer

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


那么,这种情况下真的需要证书吗?

它仍然是加密的,但不可信。最好改为修复证书验证问题

本质上,SSL提供了加密和信任机制。您绕过了信任部分,因此消息仍将被加密,但容易被拦截或窥探,例如使用中间人攻击。MITM可以拦截请求,并使用完全不同的证书完成SSL握手。他们可以选择将您的消息转发到预期的服务器&返回,这样您就永远不会知道消息被截获了

您应该考虑下载服务器证书并将其放入信任库,该信任库可以在运行时加载

看。 keytool可执行文件与JDK捆绑在一起,您可以使用此命令行工具创建“密钥库”(在本例中称为“信任库”),并将证书导入其中

告诉Java使用密钥库的方法有很多,您的选择取决于您使用什么库等来建立SSL连接。 一种方法是使用启动选项,例如:

-Djavax.net.ssl.trustStore=mySrvKeystore-Djavax.net.ssl.trustStorePassword=123456

最好在谷歌上搜索“keystorejava”加上你的库名(如果你正在使用的话)


HTH

它仍然是加密的,但不可信。最好改为修复证书验证问题

本质上,SSL提供了加密和信任机制。您绕过了信任部分,因此消息仍将被加密,但容易被拦截或窥探,例如使用中间人攻击。MITM可以拦截请求,并使用完全不同的证书完成SSL握手。他们可以选择将您的消息转发到预期的服务器&返回,这样您就永远不会知道消息被截获了

您应该考虑下载服务器证书并将其放入信任库,该信任库可以在运行时加载

看。 keytool可执行文件与JDK捆绑在一起,您可以使用此命令行工具创建“密钥库”(在本例中称为“信任库”),并将证书导入其中

告诉Java使用密钥库的方法有很多,您的选择取决于您使用什么库等来建立SSL连接。 一种方法是使用启动选项,例如:

-Djavax.net.ssl.trustStore=mySrvKeystore-Djavax.net.ssl.trustStorePassword=123456

最好在谷歌上搜索“keystorejava”加上你的库名(如果你正在使用的话)

HTH

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

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

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

  • 它信任服务器证书是真实的(这是信任管理器的目的,但不是这个特定的实现,因为它从不拒绝任何东西)
  • 此证书对于客户端要联系的主机名有效
使用此类信任管理器(或匿名密码套件),连接仍将被加密(假设您未启用使用空密码的密码套件,默认情况下不应启用空密码)

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

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

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

感谢您的回复,非常有帮助。因此,由于这个JAR将下载/安装到客户机的计算机中,我想有一种方法可以下载证书并将其保存在密钥库中。那么证书需要下载并存储在客户端计算机中吗?要做到这一点,我必须使用本机代码在客户端计算机上执行keytool命令吗?不,您只需在自己的计算机上执行keytool一次,然后将密钥库(通常是..jks文件)与应用程序一起交付。我很确定您可以将密钥库包装到jar文件中,并通过类路径引用它。。。很抱歉,Java的ssl客户端实现不容易理解,需要一些阅读和实践才能理解好……非常感谢。现在我清楚地知道我必须做什么了。“如果拦截方拥有必要的私钥来解密消息”。那是不对的。没有私钥来解密消息-对等方之间动态协商会话密钥。所谓的信任经理的问题在于,它阻止你知道你在和谁说话。所以你和任何人都有完全安全的通信。没有身份验证,SSL是不安全的。请参阅RFC 2246。@amir75:SSL使用会话密钥。数据i