0

当 SMTP 客户端连接到远程 SMTP 服务器并发出具有自签名证书的 STARTTLS 命令时 - 我在客户端收到错误:

javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径

有一种解决方案可以信任所有证书,例如:

SSLContext trustAllSSLContext;

TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {

                @Override
                public X509Certificate[] getAcceptedIssuers() {
                    return null;
                }

                @Override
                public void checkClientTrusted(X509Certificate[] certs, String authType) {
                }

                @Override
                public void checkServerTrusted(X509Certificate[] certs, String authType) {
                }
            }};

            try {
                trustAllSSLContext = SSLContext.getInstance("SSL");
                trustAllSSLContext.init(null, trustAllCerts, null);
            } catch (NoSuchAlgorithmException | KeyManagementException ex) {
                //...
            }

但这会导致安全漏洞。我认为这可能比在这种情况下发送未加密的数据更好?

4

1 回答 1

1

与未加密相比,它确实可以防止只能窃听但不能主动攻击的被动攻击者。

基本上重复了如何使用 Apache HttpClient 处理无效的 SSL 证书?但这包括很多你不需要的东西。

最好的方法当然是让服务器获得“真正的”证书。否则,要信任他们的自签名证书而不是其他任何人的证书,请通过您确定没有被篡改的某个过程获取他们的证书并将其放入您的信任库中。

如果这是个人计算机或个人安装的 Java,则 JSSE 默认信任库是文件 JRELOC/lib/security/jssecacerts(如果存在),否则为 SAME/cacerts。cacerts 文件位于 Java 包中,包括几十个著名的公共 CA,如 Verisign、GoDaddy 等,因此您与 Internet 上几乎任何公共主机(使用这些 CA)的连接都可以工作,但您可以添加根据需要删除或删除。在这种情况下,在文件中以 DER 或 PEM 格式获取所需的证书,然后:

keytool -keystore JRELOC/lib/security/cacerts -importcert -file the_added_cert 
# or JRELOC/bin/keytool if that directory isn't in your search path
# enter changeit for the password, and confirm that you want to trust this cert

如果此(机器和)Java 与其他用户共享,则更改默认信任库也会影响他们。如果您或他们不希望这样做,请创建自己的文件(通过复制标准文件并进行修改),然后通过运行带有 -Djavax.net.ssl.trustStore=filename 的程序来使用该信任库(如http:// /docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/JSSERefGuide.html#Customization)或者如果您自己不运行“java”,请告诉您设置该系统属性的任何操作。

于 2014-03-09T14:08:29.867 回答