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

问题描述 投票:4回答:1

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

解决问题后,我希望你发现这篇文章很有用。这篇文章为您提供了对这些错误的逐步诊断。

第1步:我尝试使用this postanother post解决问题,但这对我没有帮助。在大多数情况下,这就足够了。您可以使用keytool通过'keytool -list -keystore“%JAVA_HOME%/ jre / lib / security / cacerts”'列出证书

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

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

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

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

步骤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。

第3步:我尝试使用公开的“SSLPoke”Java类来查看我是否可以与Google和/或smtp.gmail.com连接。结果在列表中:我可以通过端口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();
        }

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

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

java.lang.RuntimeException:javax.mail.AuthenticationFailedException

步骤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帐户可以通过弱验证的应用程序访问”,即谷歌帐户中的设置,最终在正确发送电子邮件时产生。这是qazxsw poi的链接。

步骤7:从另一台服务器发送电子邮件可能是个问题。验证错误(仍然)是结果。要克服这些错误,您可以:

注意:https://accounts.google.com/b/0/DisplayUnlockCaptcha是我的简单测试应用程序的基础。

java email ssl openssl certificate
1个回答
3
投票

最后我找到了答案。

1 - 当然谷歌/ gmail证书已开启;-)第1步正在执行这些检查。尝试手动添加证书CA等。见上文。

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

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

4 - 然后我从Gmail收到了“未经过身份验证”的错误。允许“从经过弱验证的应用程序访问gmail帐户”,最终提供正确发送的电子邮件。这是一个mkyong example

© www.soinside.com 2019 - 2024. All rights reserved.