web-dev-qa-db-ja.com

javamailでサーバー証明書エラーを無視する方法

imapsを使用してimapサーバーに接続すると失敗します。

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", "p@ssw0rd");
System.out.println(store.getFolder("INBOX").getMessageCount());
21
ncowboy

imapsストアを使用しているため、prop.put("mail.imaps.ssl.trust", "*");を使用します。

smtpの場合は、次を試してください:prop.put("mail.smtp.ssl.trust", "*");

46
Vishwanath

証明書の検証エラーを無視しないでください(おそらくテスト環境にある場合を除きます)。これは、SSL/TLSを使用するポイントを無効にします。

代わりに、そのサーバー証明書が信頼できることがわかっている場合は、それをトラストストア(たとえば、JREのグローバルトラストストアまたはjavax.net.ssl.trustStore*システムプロパティで指定したローカルトラストストア)にインポートします。

30
Bruno

Javamail 1.4.2+を使用している場合は、サーバー証明書を無視するために使用できるソケットファクトリがあります。

MailSSLSocketFactory socketFactory= new MailSSLSocketFactory();
socketFactory.setTrustAllHosts(true);
prop.put("mail.imap.ssl.socketFactory", socketFactory);
5
Lawrence Song
     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", "*");

上記の変更で修正されますjavax.mail.MessagingException: Could not connect to SMTP Host: hostname, port: 465;ネストされた例外

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 
4
Chandana Buduru

@Brunoはハックですべてのサーバーを盲目的に信頼しないように警告するのが正しいと思いますsetTrustAllHosts(true)

Oracleのドキュメント では、アプリで全世界を安全に信頼せずに、信頼できるリストに開発メールホストを追加する方法を示しています。

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);
2
Adam

私は同じ問題でした

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

com.Sun.mail.util.MailSSLSocketFactory

うまくいきました!

1
user1425743
    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:password@Host: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();
    }

デバッグ:setDebug:JavaMailバージョン1.4.5
Exchangeサーバー2010
PlainTextLogin
http://technet.Microsoft.com/ru-ru/library/bb124498(v = exchg.141).aspx

1
olegnyr

Java 6に続く問題である場合、解決策は単純です。Java 7がリリースされたように、それは単純です。インストールJava 7 in machine.Java 7には、証明書認証を無視する機能を持つ証明書ファイルがあります。

次のJava 7ディレクトリから「cacerts」ファイルをコピーします

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

それを貼り付けます

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

これで、証明書認証の問題が解決されます。

1
Baji Shaik

私も同じ問題でした。

MailSSLSocketFactory socketFactory = new MailSSLSocketFactory(); socketFactory.setTrustedHosts(new String [] {"my-server"});

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

うまくいきました!

0
perpanb0

これは、証明書プロセスをバイパスして、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 
}
0