2011-02-04 29 views
18

khi tôi kết nối với máy chủ imap của mình bằng imaps, nó không thành công.cách bỏ qua lỗi máy chủ cert trong javamail

bạn có thể cho tôi biết làm thế nào để bỏ qua lỗi máy chủ cert trong 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 

và mã nguồn của tôi

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

Bản sao có thể có của http://stackoverflow.com/questions/4062307/pkix-path-building-failed-unable-to-find-valid-certification-path-to-requested-t – Raghuram

Trả lời

43

sử dụng prop.put("mail.imaps.ssl.trust", "*"); kể từ khi bạn đang sử dụng imaps cửa hàng.

và cho smtp bạn có thể thử: prop.put("mail.smtp.ssl.trust", "*");.

4

Nếu bạn đang sử dụng javamail 1.4.2+, có một nhà máy sản xuất ổ cắm mà bạn có thể sử dụng để bỏ qua chứng chỉ máy chủ.

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

Tại sao phải quan tâm đến SSL nếu bạn 's sẵn sàng tin tưởng tất cả các máy chủ anyway ... Không sử dụng này trong sản xuất. – Bruno

+0

Tôi đồng ý rằng chúng tôi không bao giờ nên sử dụng điều này trong sản xuất. Điều này thường dành cho chứng chỉ tự ký. Tôi gặp vấn đề tương tự khi kết nối với máy chủ imaps thử nghiệm sử dụng chứng chỉ tự ký. CÁi này đã sửa nó giúp tôi. –

+0

Cảm ơn, tôi cần điều này để kết nối với Gmail qua IMAP như một phần của khung kiểm tra chức năng. –

28

Đừng bỏ qua lỗi xác minh chứng chỉ (trừ khi có thể trong môi trường thử nghiệm): điều này đánh bại điểm sử dụng SSL/TLS. Thay vào đó, nếu bạn biết bạn tin tưởng rằng chứng chỉ máy chủ, hãy nhập nó vào kho lưu trữ tin cậy của bạn (cửa hàng tin cậy toàn cầu của JRE hoặc cửa hàng địa phương mà bạn chỉ định với thuộc tính hệ thống javax.net.ssl.trustStore* chẳng hạn).

+7

Ahh, StackOverflow: nơi các câu trả lời bảo mật cho các câu hỏi về bảo mật bị giảm giá và các câu trả lời không an toàn được upvoted. Sigh .... –

+0

Đây là một câu trả lời tuyệt vời. Điều gì sẽ xảy ra nếu bạn đang sử dụng mã của bên thứ ba? Bạn không thể sử dụng bất kỳ hacks bẩn được trình bày trong câu trả lời khác. Điều này làm việc, nhưng nó có thể cụ thể hơn về cách thêm chứng chỉ. Điều gì đã giúp tôi với điều này, là nhận ra tôi đã phải thay đổi jre/lib/security/cacerts, sử dụng lời khuyên này: http://www.martin-probst.com/blog/2008/03/14/installing-importing-a -root-certificate-in-java/Tóm lại: sử dụng 'keytool -import -file your_cert.cer/path/to/cacerts', mật khẩu là * changeit *. –

+0

Với những giới hạn của CA đơn lẻ thương mại của bên thứ ba, bất cứ điều gì ít hơn một cửa hàng tin cậy mà chỉ có CA là bản thân bạn chưa đầy đủ. Vấn đề là, đối với các ứng dụng web nhiều bên thuê, nơi khách hàng mong muốn thiết bị đầu cuối từ xa bất kể họ trả tiền cho một chứng chỉ thương mại, rủi ro MITM thường được chấp nhận cho các điểm cuối được xác định rõ. – 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", "*"); 

thay đổi trên sẽ khắc phục javax.mail.MessagingException: Could not connect to SMTP host: hostname, port: 465; cho ngoại trừ lồng nhau

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 
1

Tôi đã cùng một vấn đề, sử dụng

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

com.sun.mail.util.MailSSLSocketFactory

nó hoạt động !!

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: phiên bản 1.4.5 JavaMail
Exchange Server 2010
PlainTextLogin
http://technet.microsoft.com/ru-ru/library/bb124498(v=exchg.141).aspx

0

này sẽ giúp bạn vượt qua quá trình chứng chỉ và được trực tiếp đến máy chủ 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

Tôi nghĩ @Bruno đúng với admoni sh bạn không nên mù quáng tin tưởng tất cả các máy chủ với hack setTrustAllHosts(true)

Trong docs at Oracle họ thấy làm thế nào để thêm máy chủ email dev của bạn vào danh sách đáng tin cậy mà không buộc ứng dụng của bạn để không an toàn tin tưởng trên toàn thế giới:

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

Tôi là vấn đề tương tự.

MailSSLSocketFactory socketFactory = new MailSSLSocketFactory(); socketFactory.setTrustedHosts (chuỗi mới [] {"my-server"});

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

nó hoạt động !!

1

Nếu vấn đề tồn tại trong Java 6 thì giải pháp đơn giản. Nó chỉ đơn giản như Java 7 đã được phát hành. Cài đặt java 7 trong máy.java 7 có tệp chứng chỉ có khả năng bỏ qua xác thực chứng chỉ.

sao chép "cacerts" tập tin từ sau java 7 thư mục

C: \ Program Files \ Java \ jdk1.7.0_79 \ jre \ lib \ security

và dán nó vào

C: \ Program Files \ Java \ jdk1.6.0 \ jre \ lib \ security

bây giờ vấn đề xác thực chứng chỉ sẽ được giải quyết.

Các vấn đề liên quan