gpt4 book ai didi

通过 ssl 的 android javamail api imap

转载 作者:行者123 更新时间:2023-11-29 14:34:15 25 4
gpt4 key购买 nike

我想在 android 上获取我的 Exchange 电子邮件,为此我正在使用 android 的 javamail api...它在使用 imap 的 gmail 和 yahoo 上运行良好。问题是我的交换服务器有自签名证书,所以 android 不太喜欢这个,我得到 03-14 12:46:13.698: WARN/System.err(281): javax.mail.MessagingException:不受信任的服务器证书;

我看过这个例子:Sending Email in Android using JavaMail API without using the default/built-in app有人通过 ssl 发送示例。我想我可以使用 JSSEProvider 来接受我的自签名证书,但我不知道如何使用它。

请帮帮我!

最佳答案

我一直遇到同样的问题,并设法通过配置信任管理器来绕过它,详见 http://java.sun.com/products/javamail/javamail-1.4.2/SSLNOTES142.txt .

我所做的是创建我自己的 TrustManager:

package com.myapp;
import javax.net.ssl.X509TrustManager;
import java.security.cert.X509Certificate;

/**
* DummyTrustManager - NOT SECURE
*/
public class DummyTrustManager implements X509TrustManager {

public void checkClientTrusted(X509Certificate[] cert, String authType) {
// everything is trusted
}

public void checkServerTrusted(X509Certificate[] cert, String authType) {
// everything is trusted
}

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

并在我自己的 SSLSocketFactory 中使用它:

package com.myapp;

import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;

import javax.net.SocketFactory;
import javax.net.ssl.*;


/**
* DummySSLSocketFactory
*/
public class DummySSLSocketFactory extends SSLSocketFactory {
private SSLSocketFactory factory;

public DummySSLSocketFactory() {
try {
SSLContext sslcontext = SSLContext.getInstance("TLS");
sslcontext.init(null,
new TrustManager[] { new DummyTrustManager()},
null);
factory = (SSLSocketFactory)sslcontext.getSocketFactory();
} catch(Exception ex) {
// ignore
}
}

public static SocketFactory getDefault() {
return new DummySSLSocketFactory();
}

public Socket createSocket() throws IOException {
return factory.createSocket();
}

public Socket createSocket(Socket socket, String s, int i, boolean flag)
throws IOException {
return factory.createSocket(socket, s, i, flag);
}

public Socket createSocket(InetAddress inaddr, int i,
InetAddress inaddr1, int j) throws IOException {
return factory.createSocket(inaddr, i, inaddr1, j);
}

public Socket createSocket(InetAddress inaddr, int i)
throws IOException {
return factory.createSocket(inaddr, i);
}

public Socket createSocket(String s, int i, InetAddress inaddr, int j)
throws IOException {
return factory.createSocket(s, i, inaddr, j);
}

public Socket createSocket(String s, int i) throws IOException {
return factory.createSocket(s, i);
}

public String[] getDefaultCipherSuites() {
return factory.getDefaultCipherSuites();
}

public String[] getSupportedCipherSuites() {
return factory.getSupportedCipherSuites();
}
}

要让它在 javamail-android 中工作,您需要在获取 Session 实例之前指定新的 SSLSocketFactory:

    Properties props = new Properties();
props.setProperty( "mail.imaps.socketFactory.class", "com.myapp.DummySSLSocketFactory" );
session = Session.getDefaultInstance( props );

现在使用我们定义的 TrustManager 而不是默认的,所有证书都将被接受。

显然,盲目接受所有证书存在一些安全问题,我建议在您的 TrustManager 中进行一些检查,否则您可能会面临各种安全问题(例如中间人攻击) .此外,我只会在您真正需要的地方使用它:例如,您说 GMail 和 Ymail 正在运行,所以在连接到它们时我不会使用这种机制。

我会放入一个异常处理程序来捕获“证书不受信任”异常,并在实际覆盖 TrustManager 之前提示用户接受一个不受信任的证书(带有必要的警告,仅对绝对受信任的服务器执行此操作) .

关于通过 ssl 的 android javamail api imap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5297770/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com