2011-02-04 6 views
18

imap을 사용하여 imap 서버에 연결할 때 실패합니다.javamail에서 서버 인증서 오류를 무시하는 방법

당신은 당신이 imaps 저장소를 사용하고 있기 때문에 JavaMail에

Exception in thread "main" 
javax.mail.MessagingException: 
sun.security.validator.ValidatorException: 
PKIX path building failed: 
sun.security.provider.certpath.SunCertPathBuilderException: 
unable to find valid certification 
path to requested target; 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.imap.IMAPStore.protocolConnect(IMAPStore.java:665) 
    at javax.mail.Service.connect(Service.java:295) 
    at javax.mail.Service.connect(Service.java:176) 
    at App20110204.main(App20110204.java:31) 
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 com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1623) 
    at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:198) 
    at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:192) 
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1074) 
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:128) 
    at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:529) 
    at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:465) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:884) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1120) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1147) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1131) 
    at com.sun.mail.util.SocketFetcher.configureSSLSocket(SocketFetcher.java:507) 
    at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:238) 
    at com.sun.mail.iap.Protocol.<init>(Protocol.java:113) 
    at com.sun.mail.imap.protocol.IMAPProtocol.<init>(IMAPProtocol.java:110) 
    at com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:632) 
    ... 3 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:294) 
    at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:200) 
    at sun.security.validator.Validator.validate(Validator.java:218) 
    at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:126) 
    at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:209) 
    at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:249) 
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1053) 
    ... 15 more Caused by: 
sun.security.provider.certpath.SunCertPathBuilderException: 
unable to find valid certification 
path to requested target at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:174) 
    at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:238) 
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:289) 
    ... 21 more 

에 서버 인증서 오류를 무시하고 내 소스 코드

Properties prop = new Properties(); 
prop.put("mail.imap.ssl.checkserveridentity", "false"); 
prop.put("mail.imap.ssl.trust", "*"); 

Session session = Session.getDefaultInstance(prop); 
Store store = session.getStore("imaps"); 
store.connect("mail.xxx.com", "xxxx", "[email protected]"); 
System.out.println(store.getFolder("INBOX").getMessageCount()); 
+0

가능한 한 http://stackoverflow.com/questions/4062307/pkix-path-building-failed-unable-to-find-valid-certification-path-to-requested-t – Raghuram

답변

43

사용 prop.put("mail.imaps.ssl.trust", "*");하는 방법을 말해 수 있습니다.

smtp의 경우 시도해 볼 수 있습니다. prop.put("mail.smtp.ssl.trust", "*");.

4

javamail 1.4.2 이상을 사용하는 경우 서버 인증서를 무시할 수있는 소켓 팩토리가 있습니다.

MailSSLSocketFactory socketFactory= new MailSSLSocketFactory(); 
socketFactory.setTrustAllHosts(true); 
prop.put("mail.imap.ssl.socketFactory", socketFactory); 
+6

가능한 경우 SSL을 사용하면 어쨌든 모든 호스트를 신뢰할 의향이 있습니다 ... 프로덕션 환경에서는 사용하지 마십시오. – Bruno

+0

프로덕션 환경에서는 절대로 사용해서는 안된다는 것에 동의합니다. 대개 자체 서명 된 인증서입니다. 자체 서명 된 인증서를 사용하는 imaps 서버를 테스트 할 때 동일한 문제가 발생합니다. 이것은 나를 위해 그것을 고정. –

+0

감사합니다. 기능 테스트 프레임 워크의 일부로 IMAP를 통해 Gmail에 연결해야했습니다. –

28

테스트 환경을 제외하고는 인증서 확인 오류를 무시하지 마십시오. 이는 SSL/TLS 사용의 이점을 무효화합니다.

대신 신뢰할 수있는 서버 인증서를 트러스트 저장소 (예 : JRE의 글로벌 트러스트 저장소 또는 javax.net.ssl.trustStore* 시스템 속성으로 지정한 로컬 인증서 저장소)에서 가져옵니다.

MailSSLSocketFactory socketFactory= new MailSSLSocketFactory(); 
socketFactory.setTrustAllHosts(true); 
prop.put("mail.pop3s.ssl.socketFactory", socketFactory); 

com.sun.mail.util.MailSSLSocketFactory를 사용하여 상자의 예외

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: Path does not chain with any of the trust anchors 
exception 
+7

Ahh, StackOverflow : 보안에 관한 질문에 대한 보안 답변이 downvoted되고 안전하지 않은 대답이 upvoted가됩니다. 한숨 .... –

+0

이것은 훌륭한 대답입니다. 제 3 자 코드를 사용한다면 어떨까요? 다른 답변에서 제시되는 더러운 해킹을 사용할 수 없습니다. 이 방법이 효과적 이었지만 인증서를 추가하는 방법은 좀 더 구체적 일 수 있습니다. 이것이 나에게 도움이 된 것은이 조언을 사용하여 jre/lib/security/cacerts를 변경해야한다는 것을 깨닫는 것이 었습니다. http://www.martin-probst.com/blog/2008/03/14/installing-importing-a -root-certificate-in-java/간단히 말해,'keytool -import -file your_cert.cer/path/to/cacerts'를 사용하면 암호는 * changeit *입니다. –

+0

타사 상업용 단일 루트 CA의 제한 사항을 감안할 때, 자신의 CA 만 소유하고있는 트러스트 스토어보다 작은 것이 전부입니다. 상업용 인증서를 지불했는지 여부에 관계없이 클라이언트가 원격 종단점을 원하는 멀티 테넌트 웹 응용 프로그램의 경우, MITM 위험은 종종 잘 정의 된 종점에 대해 수용 가능한 것으로 간주됩니다. – LateralFractal

3
 Properties propsSSL = new Properties(); 
    propsSSL.put("mail.transport.protocol", "smtps"); 
    propsSSL.put("mail.smtps.host", "hostname"); 
    propsSSL.put("mail.smtps.auth", "true"); 
    propsSSL.put("mail.smtps.ssl.checkserveridentity", "false"); 
    propsSSL.put("mail.smtps.ssl.trust", "*"); 

위의 변경,

그것은 작동합니다!

1

저도 같은 문제 였기 javax.mail.MessagingException: Could not connect to SMTP host: hostname, port: 465;가 해결됩니다

0
Properties pr = new Properties(); 
    MailSSLSocketFactory socketFactory= new MailSSLSocketFactory(); 
    socketFactory.setTrustAllHosts(true); 
    pr.put("mail.pop3s.ssl.socketFactory", socketFactory); 
    Session ses = Session.getInstance(pr); 
    ses.setDebug(true); 
    URLName url = new URLName("pop3s://username:[email protected]:posrt"); 
    Store store = ses.getStore(url.getProtocol()); 
    store.connect(url.getHost(), url.getPort(), url.getUsername(), url.getPassword()); 
    Folder inbox = store.getFolder("INBOX"); 
    inbox.open(Folder.READ_ONLY); 
    try { 
     int i = inbox.getMessageCount(); 
     com.sun.mail.pop3.POP3Message mes; 
     while (i > 0) { 
      mes = (com.sun.mail.pop3.POP3Message) inbox.getMessage(i); 
      System.out.println(mes.getContentID()); 
      i--; 
     } 
    } finally { 
     inbox.close(false); 
     store.close(); 
    } 

DEBUG : setDebug : JavaMail에 버전 1.4.5
Exchange 서버 2010
PlainTextLogin
http://technet.microsoft.com/ru-ru/library/bb124498(v=exchg.141).aspx

0

이렇게하면 인증 과정을 거치지 및 SSL 호스트에 직접 얻을 도움이 될 것입니다

MailSSLSocketFactory sf = null; 
try 
{ 
    sf = new MailSSLSocketFactory(); 
} 
catch (GeneralSecurityException e) 
{ 
    e.printStackTrace(); 
} 
     sf.setTrustAllHosts(true); 

Properties pop3Props = new Properties(); 
pop3Props.setProperty("mail.pop3.ssl.enable", "true"); 
pop3Props.setProperty("mail.protocol.ssl.trust", "pop3.live.com"); 
pop3Props.put("mail.pop3s.ssl.socketFactory", sf); 
pop3Props.setProperty("mail.pop3s.port", "995"); 

Session session = Session.getInstance(pop3Props); 

try 
{ 
/* Get a Store object*/ 
    Store store = session.getStore("pop3s"); 
//process further activity 
} 
2

@ 브루노가 admoni에 맞다고 생각합니다. SH 당신은 맹목적으로 해킹으로 모든 서버를 신뢰하지가 안전하지 않은 전 세계 신뢰하여 응용 프로그램을 시작하지 않고 신뢰할 수있는 목록에 dev에 메일 호스트를 추가하는 방법을 보여 docs at Oracle에서 setTrustAllHosts(true)

:

MailSSLSocketFactory sf = new MailSSLSocketFactory(); 
sf.setTrustedHosts(new String[] { "my-server" }); 
props.put("mail.smtp.ssl.enable", "true"); 
// also use following for additional safety 
props.put("mail.smtp.ssl.checkserveridentity", "true"); 
props.put("mail.smtp.ssl.socketFactory", sf); 
0

을 나는 같은 문제였다.

MailSSLSocketFactory socketFactory = new MailSSLSocketFactory(); socketFactory.setTrustedHosts (새 문자열 [] { "my-server"});

socketFactory.setTrustAllHosts (true); props.put ("mail.smtps.socketFactory", socketFactory);

1

Java 6에서 문제가 지속되면 솔루션은 간단합니다. Java 7이 출시되면서 간단합니다. machine.java의 java 7을 설치하면 인증서 인증을 무시할 수있는 인증서 파일을 가질 수 있습니다. \ 프로그램 파일 \ 자바 \ jdk1.7.0_79 \ JRE \ lib 디렉토리 \ 보안

에 붙여 넣습니다 :

이 C 자바 7 디렉토리 아래에서 "인 cacerts"파일을 복사

C : \ 프로그램 파일 \ 자바 \ jdk1.6.0 \ JRE \ lib 디렉토리 \ 보안

이제 인증서 인증 문제가 해결됩니다.

관련 문제