Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试通过JavaMail连接到gmail时发生SSL握手错误_Java_Gmail_Jakarta Mail_Truststore_Jsse - Fatal编程技术网

尝试通过JavaMail连接到gmail时发生SSL握手错误

尝试通过JavaMail连接到gmail时发生SSL握手错误,java,gmail,jakarta-mail,truststore,jsse,Java,Gmail,Jakarta Mail,Truststore,Jsse,尝试使用JavaMail库通过POP3从gmail获取邮件并输出,但出现SSL握手错误。如何实现SSL握手 任何帮助都将不胜感激 代码: import java.util.Properties; 导入javax.mail.Folder; 导入javax.mail.Message; 导入javax.mail.MessaginException; 导入javax.mail.NoSuchProviderException; 导入javax.mail.Session; 导入javax.mail.Stor

尝试使用JavaMail库通过POP3从gmail获取邮件并输出,但出现SSL握手错误。如何实现SSL握手

任何帮助都将不胜感激

代码:

import java.util.Properties;
导入javax.mail.Folder;
导入javax.mail.Message;
导入javax.mail.MessaginException;
导入javax.mail.NoSuchProviderException;
导入javax.mail.Session;
导入javax.mail.Store;
公共类检查邮件{
公共静态无效检查(字符串主机、字符串存储类型、字符串用户、,
字符串(密码)
{
试一试{
属性=新属性();
properties.put(“mail.pop3.host”,host);
properties.put(“mail.pop3.port”,“995”);
properties.put(“mail.pop3.starttls.enable”、“true”);
会话emailSession=Session.getDefaultInstance(属性);
Store Store=emailSession.getStore(“pop3s”);
store.connect(主机、用户、密码);
文件夹emailFolder=store.getFolder(“收件箱”);
emailFolder.open(文件夹只读);
Message[]messages=emailFolder.getMessages();
System.out.println(“messages.length----”+messages.length);
for(int i=0,n=messages.length;i
输出:

javax.mail.MessagingException: Connect failed;
  nested exception is:
    javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at com.sun.mail.pop3.POP3Store.protocolConnect(POP3Store.java:213)
    at javax.mail.Service.connect(Service.java:366)
    at javax.mail.Service.connect(Service.java:246)
    at reademail.CheckingMails.check(CheckingMails.java:30)
    at reademail.CheckingMails.main(CheckingMails.java:70)
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
    at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1937)
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302)
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:296)
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1478)
    at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:212)
    at sun.security.ssl.Handshaker.processLoop(Handshaker.java:979)
    at sun.security.ssl.Handshaker.process_record(Handshaker.java:914)
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1050)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1363)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1391)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1375)
    at com.sun.mail.util.SocketFetcher.configureSSLSocket(SocketFetcher.java:598)
    at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:372)
    at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:238)
    at com.sun.mail.pop3.Protocol.<init>(Protocol.java:112)
    at com.sun.mail.pop3.POP3Store.getPort(POP3Store.java:265)
    at com.sun.mail.pop3.POP3Store.protocolConnect(POP3Store.java:207)
    ... 4 more
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:387)
    at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292)
    at sun.security.validator.Validator.validate(Validator.java:260)
    at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324)
    at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229)
    at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124)
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1460)
    ... 17 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:145)
    at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:131)
    at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280)
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382)
    ... 23 more
javax.mail.MessaginException:连接失败;
嵌套异常是:
javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径生成失败:sun.security.provider.certpath.SunCertPathBuilderException:找不到请求目标的有效证书路径
在com.sun.mail.pop3.POP3Store.protocolConnect(POP3Store.java:213)上
在javax.mail.Service.connect(Service.java:366)
在javax.mail.Service.connect(Service.java:246)
在reademail.CheckingMails.check(CheckingMails.java:30)
位于reademail.CheckingMails.main(CheckingMails.java:70)
原因:javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径生成失败:sun.security.provider.certpath.SunCertPathBuilderException:找不到请求目标的有效证书路径
位于sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
位于sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1937)
位于sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302)
位于sun.security.ssl.Handshaker.fatalSE(Handshaker.java:296)
位于sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1478)
位于sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:212)
位于sun.security.ssl.Handshaker.processLoop(Handshaker.java:979)
位于sun.security.ssl.Handshaker.process_记录(Handshaker.java:914)
位于sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1050)
位于sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1363)
位于sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1391)
位于sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1375)
位于com.sun.mail.util.SocketFetcher.configureSSLSocket(SocketFetcher.java:598)
在com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:372)
位于com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:238)
位于com.sun.mail.pop3.Protocol.(Protocol.java:112)
位于com.sun.mail.pop3.POP3Store.getPort(POP3Store.java:265)
在com.sun.mail.pop3.POP3Store.protocolConnect(POP3Store.java:207)上
... 4更多
原因:sun.security.validator.validator异常:PKIX路径生成失败:sun.security.provider.certpath.SunCertPathBuilderException:找不到请求目标的有效证书路径
位于sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:387)
位于sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292)
位于sun.security.validator.validator.validate(validator.java:260)
位于sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324)
位于sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229)
位于sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124)
位于sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1460)
... 还有17个
原因:sun.security.provider.certpath.SunCertPathBuilderException:找不到请求目标的有效证书路径
位于sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:145)
位于sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:131)
位于java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280)
位于sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382)
... 23多

如果有人后来遇到这个问题,像我一样,解决办法是:

properties.put("mail.pop3.host", host);
properties.put("mail.pop3.port", "995");
properties.put("mail.pop3.starttls.enable", "true");
props.put( "mail.pop3s.ssl.trust", host); // add this line
Session emailSession = Session.getDefaultInstance(properties);
您可以添加第四行以信任您尝试连接的主机。切勿将主机参数替换为“*”

解决此问题的另一种方法是将ssl证书添加到java cacerts中

为此,您必须:

  • 使用Firefox,从页面(例如gmail.com)中导出“.crt”文件,方法是点击Adress上的绿色挂锁
    properties.put("mail.pop3.host", host);
    properties.put("mail.pop3.port", "995");
    properties.put("mail.pop3.starttls.enable", "true");
    props.put( "mail.pop3s.ssl.trust", host); // add this line
    Session emailSession = Session.getDefaultInstance(properties);