首页 文章

访问Gmail(或安全网站)而不会收到PKIX证书路径错误

提问于
浏览
4

通过Gmail发送电子邮件导致获得PKIX证书路径错误 . 这同样适用于从Tomcat发送电子邮件 .

After solving the issue ,我希望你发现这篇文章很有用 . 这篇文章为您提供了对这些错误的逐步诊断 .

Step 1 :我试图使用this postanother post解决问题,但这对我没有帮助 . 在大多数情况下,这就足够了 . 您可以使用keytool通过'keytool -list -keystore 2871290 '列出证书

我通过单击gmail URL的锁定图标并将证书导出/导入到我使用的JDK版本的cacert文件来添加证书 . 我可以通过keytool -list看到证书已添加 . 这个过程在(链接)帖子中有很好的描述 .

Step 2A :我使用的是正确的信任库吗?我添加了JVM参数来指导证书搜索,例如-Djavax.net.ssl.trustStore = "..../jre/lib/security/cacerts" -Djavax.net.ssl.trustStorePassword = "changeit" .

Step 2B :当我将cacerts文件的值更改为cacertsXYZ时,我收到错误 . 因此,这证明使用了'cacert' .

引起:javax.mail.MessagingException:无法向SMTP主机发送命令;嵌套异常是:javax.net.ssl.SSLException:java.lang.RuntimeException:意外错误:java.security.InvalidAlgorithmParameterException:trustAnchors参数必须为非空

Step 2C :我的Tomcat网络服务器也是如此吗?我在JRE_HOME的cacerts中验证了证书在那里 . 在Tomcat中,我的JRE_HOME是"C:\Program Files\Java\jdk1.8.0_144\jre" . 我的JAVA_HOME = C:\ Program Files \ Java \ jdk1.8.0_144 .

Step 3 :我尝试使用公开的' SSLPoke 'Java类来查看我是否可以连接Google和/或smtp.gmail.com . 结果在列表中:我 could 通过端口443与SSL连接到google.com和mail.google.com .

try {
            SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
            // **Fail** TLS - SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket("smtp.gmail.com", 587);
            // **Fail** SSL - SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket("smtp.gmail.com", 465);
            // **OK**
            SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket("google.com", 443);
            // OK
            SSLSocket sslsocket2 = (SSLSocket) sslsocketfactory.createSocket("mail.google.com", 443);

            InputStream in = sslsocket.getInputStream();
            OutputStream out = sslsocket.getOutputStream();
            out.write(1); // write test byte to get reaction.
            while (in.available() > 0) {
                System.out.print(in.read());
            }
            System.out.println("Successfully connected");
        } catch (Exception exception) {
            exception.printStackTrace();
        }

Step 4 :受信任的商店可能已损坏?我安装了更新版本的JDK1.8是v152 . 我没有成功地重新启动应用程序 . 这与JDK和JRE之间的区别有关吗?只有JRE具有lib \ security \ cacerts文件 . 我尝试了SSL(465)和TLS(587)端口 . 不 .

Step 5 :运行 openssl (使用s_client -connect smtp.gmail.com:587-starttls smtp)显示我的病毒扫描程序(Avast)禁止发送安全邮件 . 所以,有一会儿我禁用了这个电子邮件盾牌 . 这给出了以下错误:

java.lang.RuntimeException:javax.mail.AuthenticationFailedException

Step 6 :释放virusscanner网盾后,使用openssl发出以下错误:CN = Google Internet Authority G3验证错误:num = 20:无法获得本地颁发者证书 .

OpenSSL> s_client -connect smtp.gmail.com:587 -starttls smtp CONNECTED(00000280)depth = 1 C = US,O = Google Trust Services,CN = Google Internet Authority G3验证错误:num = 20:无法获取本地发行人证书....

允许'gmail account to be accessable from weakly authenticated apps'(谷歌帐户中的设置)最终在正确发送电子邮件时产生 . 这是security settings of your Google account的链接 .

Step 7 :从其他服务器发送电子邮件可能有问题 . 验证错误(仍然)是结果 . 要克服这些错误,您可以:

注意:mkyong example是我的简单测试应用程序的基础 .

1 回答

  • 3

    最后我找到了答案 .

    1 - 当然google / gmail证书是好的;-)第1步是执行这些检查 . 尝试手动添加证书CA等 . 见上文 .

    2 - 步骤2检查已知的' SSLPoke 'Java类Java类是否可以与安全网站联系 .

    3 - 检查完所有上述检查后,执行' openssl '显示我的病毒扫描程序电子邮件屏蔽阻止了流量 . 停止这种防守一段时间是第3步 .

    4 - 然后我从Gmail收到'not authenticated'错误 . 允许' gmail account accessable from weakly authenticated apps ',最终给出了正确发送的电子邮件 . 这是Google account security setting

相关问题