在没有出现PKIX认证路径错误的情况下访问Gmail(或安全网站)

tm1*_*701 5 java email ssl openssl certificate

通过gmail发送电子邮件导致收到PKIX认证路径错误。从Tomcat发送电子邮件也是如此。

解决此问题后,希望您对这篇文章有用。这篇文章为您提供了针对此类错误的逐步诊断。

第1步:我尝试使用此帖子另一个帖子来解决问题,但这并没有帮助我。在大多数情况下,这就足够了。您可以使用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时,出现错误。因此,这证明使用了“证书”。

原因: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();
        }
Run Code Online (Sandbox Code Playgroud)

步骤4:信任的存储区可能已损坏?我安装了v152的JDK1.8的较新版本。我重新启动了应用程序,但没有成功。这与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步:释放病毒扫描程序网络防护后,使用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帐户”,这是您在Google帐户中的一项设置,最终可以正确发送电子邮件。这是指向您的Google帐户安全设置的链接。

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

注意:mkyong示例是我的简单测试应用程序的基础。

tm1*_*701 5

最后我找到了答案。

1 - 当然,google/gmail 证书没问题;-) 第 1 步是执行这些类型的检查。尝试手动添加证书 CA 等。见上文。

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

3 - 检查以上所有检查后,执行“ openssl ”表明我的病毒扫描程序电子邮件屏蔽阻止了流量。停止这种防御一段时间是第 3 步。

4 - 然后我从 Gmail 收到“未验证”错误。允许' gmail 帐户可从弱身份验证的应用程序访问',最终提供了正确发送的电子邮件。这是Google 帐户安全设置