2

Connectionwith MailServer(カスタムメールサーバー)を確立する必要があります。接続しようとすると、javax.net.SSLException, Not trusted server certificate例外がスローされます。

このための証明書を作成する方法がわかりません。また、メールサーバーとの安全な接続を確立するためにその証明書を渡すこともわかりません。

私のコードは次のとおりです。

Properties props;// = new Properties();
            Session session;

            props=new Properties();

            props.put("mail.imap.socketFactory.port", "993");   
            props.put("mail.imap.socketFactory.class",   
                    "javx.net.ssl.SSLSocketFactory");   
            session=Session.getDefaultInstance(props, null);
            Store store = session.getStore("imaps");
            store.connect(hostName,portNumber, emailId,password);
            //the above statement throws the Exception    
            Folder folder = store.getFolder("INBOX");

Androidアプリケーションの自己署名証明書を作成する方法を知りたいのですが。

4

2 に答える 2

1

不明な証明書の問題は、Javaの既知の問題です。ローカルキーストアに正しい証明書がないと、HTTPSサーバーに接続することはできません。

そうは言っても、私のアプリケーションの1つにApache HTTPクライアントのオーバーライド句があります(Androidで使用されているものと同じものです)。そこから始めて、Androidで実行するために構築することができます。

ClientConnectionManager cm = new SingleClientConnManager(params,     
    HttpsSecurityOverride.createAllowAllSchemeRegistry());
httpClient = new DefaultHttpClient(cm, params);

HttpsSecurityOverrideクラスは次のとおりです。

package net.milanaleksic.cuc.tools.async.http;

import java.io.IOException;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;

import javax.net.ssl.*;

import org.apache.http.conn.scheme.*;
import org.apache.http.conn.ssl.X509HostnameVerifier;

public class HttpsSecurityOverride {

    private static SchemeRegistry allowAllSchemeRegistry = null;

    private static class AllowAllTrustManager implements X509TrustManager {

        @Override public X509Certificate[] getAcceptedIssuers() {
            return new X509Certificate[] {};
        }

        @Override public void checkClientTrusted(X509Certificate[] certs, String authType) {
        }

        @Override public void checkServerTrusted(X509Certificate[] certs, String authType) {
        }
    }

    private static class AllowAllHostnameVerifier implements X509HostnameVerifier {

        @Override public void verify(String arg0, SSLSocket arg1) throws IOException {
        }

        @Override public void verify(String arg0, X509Certificate arg1) throws SSLException {
        }

        @Override public void verify(String arg0, String[] arg1, String[] arg2) throws SSLException {
        }

        @Override public boolean verify(String arg0, SSLSession arg1) {
            return true;
        }

    }

    public static SchemeRegistry createAllowAllSchemeRegistry() throws Exception {
        synchronized (HttpsSecurityOverride.class) {
            if (allowAllSchemeRegistry != null)
                return allowAllSchemeRegistry;

            SSLContext sslContext = SSLContext.getInstance("SSL");

            // set up a TrustManager that trusts everything
            sslContext.init(null, new TrustManager[] { new AllowAllTrustManager() }, new SecureRandom());

            org.apache.http.conn.ssl.SSLSocketFactory sf = new org.apache.http.conn.ssl.SSLSocketFactory(sslContext);
            sf.setHostnameVerifier(new AllowAllHostnameVerifier());
            Scheme httpsScheme = new Scheme("https", sf, 443);
            allowAllSchemeRegistry = new SchemeRegistry();
            allowAllSchemeRegistry.register(httpsScheme);

            return allowAllSchemeRegistry;
        }
    }

}

幸運を!

于 2011-06-09T13:14:19.950 に答える
1

自己署名証明書を作成しても問題は解決しません。接続しているサーバーが自己署名証明書を使用しているために、エラーが発生しているという事実があります。

信頼できる証明書を購入してメールサーバー(制御できない場合があります)にインストールするか、承認された機関によって署名されていない証明書を受け入れるようにjavamailの動作を変更する必要があります。

2番目のオプションを実装するのに役立つ可能性のあるssl上のandroidjavamailapiimapに対する私の答えを見てください。

于 2011-06-09T13:16:34.823 に答える