访问 Gmail(或安全网站)而不会出现 PKIX 证书路径错误
Accessing Gmail (or a secure website) without getting a PKIX certification path error
通过 gmail 发送电子邮件导致出现 PKIX 证书路径错误。这同样适用于从 Tomcat 发送电子邮件。
问题解决后,希望这篇post对你有用。此 post 为您提供了针对此类错误的逐步诊断。
步骤 1:我尝试使用 this post and another post 解决问题,但这对我没有帮助。在大多数情况下,这就足够了。您可以使用密钥工具通过 'keytool -list -keystore "%JAVA_HOME%/jre/lib/security/cacerts"'
列出证书
我通过单击 gmail URL 的锁定图标添加了证书,并且 exporting/importing 将证书添加到我使用的 JDK 版本的 cacert 文件中。我可以使用 keytool -list 看到证书已添加。这个过程在 (linked) post 中有很好的描述。
步骤 2A:我是否使用了正确的信任库?我添加了 JVM 参数来指导证书搜索,例如 -Djavax.net.ssl.trustStore="..../jre/lib/security/cacerts"
-Djavax.net.ssl.trustStore密码="changeit"。
步骤 2B:当我将 cacerts 文件的值更改为 cacertsXYZ 时,出现错误。所以,这证明 'cacert' 被使用了。
Caused by: javax.mail.MessagingException: Can't send command to SMTP
host; nested exception is: javax.net.ssl.SSLException:
java.lang.RuntimeException: Unexpected error:
java.security.InvalidAlgorithmParameterException: the trustAnchors
parameter must be non-empty
步骤 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 class 看看我是否可以连接 Google 和或 smtp.gmail.com。结果在清单中:我可以通过端口 443 使用 SSL 连接到 google.com 和邮件。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 web shield后,使用openssl出现如下错误:CN = Google Internet Authority G3 verify error: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 verify error:num=20:unable to get local
issuer certificate ....
允许 'gmail account to be accessable from weakly authenticated apps',您 google 帐户中的一个设置,最终导致正确发送电子邮件。这是 link 到 security settings of your Google account。
步骤 7:从另一台服务器发送电子邮件可能有问题。身份验证错误(仍然)是结果。要克服这些错误,您可以这样做:
- 检查两步验证是否关闭(Google 设置)。
- 允许从 https://accounts.google.com/b/0/DisplayUnlockCaptcha
访问 Google 帐户
注意:mkyong example 是我的简单测试应用程序的基础。
终于找到答案了。
1 - 当然 google/gmail 证书没问题 ;-) 第 1 步执行此类检查。尝试手动添加证书 CA 等。见上文。
2 - 第 2 步检查已知的“SSLPoke”Java class Java class 是否可以联系与安全网站。
3 - 检查以上所有检查后,执行“openssl”表明我的病毒扫描程序电子邮件屏蔽阻止了流量。停止这种防御一段时间是第 3 步。
4 - 然后我收到来自 Gmail 的 'not authenticated' 错误。允许“gmail 帐户可从弱身份验证的应用程序访问”,这最终给出了正确发送的电子邮件。这是一个Google account security setting
通过 gmail 发送电子邮件导致出现 PKIX 证书路径错误。这同样适用于从 Tomcat 发送电子邮件。
问题解决后,希望这篇post对你有用。此 post 为您提供了针对此类错误的逐步诊断。
步骤 1:我尝试使用 this post and another post 解决问题,但这对我没有帮助。在大多数情况下,这就足够了。您可以使用密钥工具通过 'keytool -list -keystore "%JAVA_HOME%/jre/lib/security/cacerts"'
列出证书我通过单击 gmail URL 的锁定图标添加了证书,并且 exporting/importing 将证书添加到我使用的 JDK 版本的 cacert 文件中。我可以使用 keytool -list 看到证书已添加。这个过程在 (linked) post 中有很好的描述。
步骤 2A:我是否使用了正确的信任库?我添加了 JVM 参数来指导证书搜索,例如 -Djavax.net.ssl.trustStore="..../jre/lib/security/cacerts" -Djavax.net.ssl.trustStore密码="changeit"。
步骤 2B:当我将 cacerts 文件的值更改为 cacertsXYZ 时,出现错误。所以,这证明 'cacert' 被使用了。
Caused by: javax.mail.MessagingException: Can't send command to SMTP host; nested exception is: javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
步骤 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 class 看看我是否可以连接 Google 和或 smtp.gmail.com。结果在清单中:我可以通过端口 443 使用 SSL 连接到 google.com 和邮件。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 web shield后,使用openssl出现如下错误:CN = Google Internet Authority G3 verify error: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 verify error:num=20:unable to get local issuer certificate ....
允许 'gmail account to be accessable from weakly authenticated apps',您 google 帐户中的一个设置,最终导致正确发送电子邮件。这是 link 到 security settings of your Google account。
步骤 7:从另一台服务器发送电子邮件可能有问题。身份验证错误(仍然)是结果。要克服这些错误,您可以这样做:
- 检查两步验证是否关闭(Google 设置)。
- 允许从 https://accounts.google.com/b/0/DisplayUnlockCaptcha 访问 Google 帐户
注意:mkyong example 是我的简单测试应用程序的基础。
终于找到答案了。
1 - 当然 google/gmail 证书没问题 ;-) 第 1 步执行此类检查。尝试手动添加证书 CA 等。见上文。
2 - 第 2 步检查已知的“SSLPoke”Java class Java class 是否可以联系与安全网站。
3 - 检查以上所有检查后,执行“openssl”表明我的病毒扫描程序电子邮件屏蔽阻止了流量。停止这种防御一段时间是第 3 步。
4 - 然后我收到来自 Gmail 的 'not authenticated' 错误。允许“gmail 帐户可从弱身份验证的应用程序访问”,这最终给出了正确发送的电子邮件。这是一个Google account security setting