0

我正在创建一个需要接受自签名证书的 jax-ws 客户端应用程序。但是,当您尝试导入自签名证书时,就会出现这个常见的SSL 握手异常问题。因此,最常见的解决方法是扩展 JSSE 安全提供程序并初始化 SSL 上下文以接受所有证书,例如:

Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
TrustManager[] trustCerts = new TrustManager[]{new X509TrustManager() {
                        public X509Certificate[] getAcceptedIssuers() {
                            return null;
                        }

                       public void checkServerTrusted(X509Certificate[]
                       certs, String authType) throws CertificateException {
                            return;
                        }

                        public void checkClientTrusted(X509Certificate[]
                        certs, String authType) throws CertificateException {
                            return;
                        }
                    }
            }; 
SSLContext sc = SSLContext.getInstance("SSLv3");
sc.init(null, trustCerts, null);
SocketFactory factory = sc.getSocketFactory();
SSLSocket socket;
socket = (SSLSocket) factory.createSocket(mInstance.getHostName(),getSecureConnectionEndpoint().getPort());
socket.startHandshake();
setCerts(socket.getSession().getPeerCertificates());

这是我能找到的唯一解决方法。这里有许多类似的问题,例如导入 SSL 证书,它们都提出了相同的解决方案。

这显然很容易受到中间人攻击,而且这种解决方案似乎仅用于测试目的是合法的。

所以我的问题是,当您尝试以编程方式导入证书时,有没有办法让整个过程更加安全?

先感谢您!

4

3 回答 3

0

也许,与其使用自签名证书,不如创建一个证书颁发机构并信任它?

我使用 XCA 来运行我自己的私有 CA 并颁发证书——它非常易于使用和理解。

为了让 Java 信任您的 CA,您需要导入根证书 - 使用 keytool 创建信任库

keytool -importcert -file myca.crt -keystore mykeystore.jks

然后使用以下 JVM arg 导入信任库

-Djavax.net.ssl.trustStore=/home/user/mykeystore.jks
于 2015-07-30T09:41:04.980 回答
0

这显然很容易受到中间人攻击,而且这种解决方案似乎仅用于测试目的是合法的。

正确的。这是根本不安全的。

所以我的问题是,当您尝试以编程方式导入证书时,有没有办法让整个过程更加安全?

如果您通过您尝试保护的渠道进行操作,则不会。要信任的证书需要通过另一种方式交付。

注意您发布的代码不满足getAcceptedIssuers().它不能返回 null 的合同。

于 2015-07-30T09:34:51.097 回答
0

无论是自签名还是由 CA 签名,加密的工作原理都是一样的。唯一的区别是,如果您自行签名,它将显示一个警告,表明您是我们自己的,以便继续访问该网站,并且生成的服务器可以解密您的个人信息并用于恶意目的。对于自签名,您无法验证服务器是否就是它所说的那个人。无论数据是自签名还是由 CA 签名,数据都是加密的,对于中间人攻击,我发现没有区别。可能有人正在使用wireshark或nmap等嗅探数据包,但在这两种情况下,无论是自签名还是由CA签名,都是一样的。通常用于开发和测试自签名证书,并在生产中使用 CA 签名证书。您不希望最终用户为了节省几美元而接受与网站相关的风险。

  If you are consuming the service in Java code you need to import the self 
 signed certificate in cacerts present in <PATH_TO_JRE>\lib\security\cacerts by
 the following command >keytool -import -alias <Alias Name> -file "PATH_TO_.crt"
 -keystore "PATH_TO_cacerts" -ext san=ip:127.0.0.1 

您还可以在 san 中使用 www.mydomain.com 之类的域名而不是 ip

于 2015-08-30T19:45:18.880 回答