【问题标题】:How to connect to the SSL server in android [duplicate]如何在android中连接到SSL服务器[重复]
【发布时间】:2014-04-14 04:42:08
【问题描述】:

我需要连接具有如下 URL 的服务器:

https://www.abc.xxx/

当我尝试通过默认 httpClient 连接它时,它会抛出 SSL 证书异常。而且我也不想绕过 SSL 证书。

有人可以告诉我连接到具有自签名 SSL 证书的 Web 服务器的程序是什么。我需要从服务器获取证书/密钥吗? 如果我获得了密钥/证书,如何在发出 HTTP 请求时使用该密钥。

【问题讨论】:

  • 抛出 what SSLCertificate 异常?
  • 您可能需要将自签名证书安装到受信任的证书存储中。

标签: java android ssl


【解决方案1】:

您可以将您的 CA 证书放在 res/raw 中,并使用它来连接自签名 Web 服务器,如下所示:

sslSocketFactory = new MySSLSocketFactory(context);
schemeRegistry.register(new Scheme("https", sslSocketFactory, 443));
ClientConnectionManager cm = new ThreadSafeClientConnManager(params,
            schemeRegistry);
mHttpClient = new DefaultHttpClient(cm, params);

还有 MySSLSocketFactory:

public class MySSLSocketFactory extends SSLSocketFactory {
private SSLContext sslContext;

public MySSLSocketFactory(Context context)
        throws NoSuchAlgorithmException, KeyManagementException,
        KeyStoreException, UnrecoverableKeyException, CertificateException,
        IOException {
    super(null);
    sslContext = SSLContext.getInstance("TLS");
    sslContext.init(null, new TrustManager[] {
        new MyTrustManager(context)
    }, null);
}

@Override
public Socket createSocket() throws IOException {
    // TODO Auto-generated method stub
    return sslContext.getSocketFactory().createSocket();
}

@Override
public Socket createSocket(Socket socket, String host, int port,
        boolean autoClose) throws IOException, UnknownHostException {
    // TODO Auto-generated method stub
    return sslContext.getSocketFactory().createSocket(socket, host, port,
            autoClose);
}

}

现在是 MyTrustManager:

public class MyTrustManager implements X509TrustManager {
private X509TrustManager defaultTrustManager;
private X509TrustManager myTrustManager;
private X509Certificate[] acceptedIssuers;

public MyTrustManager(Context context) throws KeyStoreException,
        NoSuchAlgorithmException, CertificateException, IOException {
    defaultTrustManager = getDefaultManager();
    myTrustManager = getLocalManager(context);
    if (defaultTrustManager == null || myTrustManager == null) {
        throw new IOException("Couldn't load X509TrustManager");
    }
    ArrayList<X509Certificate> acceptedIssuersList = new ArrayList<X509Certificate>();
    this.addToAccepted(acceptedIssuersList, defaultTrustManager);
    this.addToAccepted(acceptedIssuersList, myTrustManager);
    acceptedIssuers = acceptedIssuersList
            .toArray(new X509Certificate[acceptedIssuersList.size()]);
}

private void addToAccepted(
        ArrayList<X509Certificate> x509Certificates,
        X509TrustManager x509TrustManager) {
    for (X509Certificate x509Certificate : x509TrustManager
            .getAcceptedIssuers()) {
        x509Certificates.add(x509Certificate);
    }
}

private X509TrustManager getX509TrustManager(
        TrustManagerFactory trustManagerFactory) {
    TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
    for (TrustManager trustManager : trustManagers) {
        if (trustManager instanceof X509TrustManager) {
            return (X509TrustManager) trustManager;
        }
    }
    return null;
}

private X509TrustManager getDefaultManager() throws KeyStoreException,
        NoSuchAlgorithmException {
    TrustManagerFactory trustManagerFactory = TrustManagerFactory
            .getInstance(TrustManagerFactory.getDefaultAlgorithm());
    trustManagerFactory.init((KeyStore) null);
    return getX509TrustManager(trustManagerFactory);
}

private X509TrustManager getLocalManager(Context context)
        throws CertificateException, NoSuchAlgorithmException,
        KeyStoreException, IOException {
    if (context == null) {
        return null;
    }
    InputStream inputStream = context
            .getResources().openRawResource(
                    R.raw.ca);
    CertificateFactory certificateFactory = CertificateFactory
            .getInstance("X.509");
    X509Certificate x509Certificate = (X509Certificate) certificateFactory
            .generateCertificate(inputStream);
    TrustManagerFactory trustManagerFactory = TrustManagerFactory
            .getInstance(TrustManagerFactory.getDefaultAlgorithm());
    KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
    keyStore.load(null);
    keyStore.setCertificateEntry("ca", x509Certificate);
    trustManagerFactory.init(keyStore);
    return getX509TrustManager(trustManagerFactory);
}

@Override
public void checkClientTrusted(X509Certificate[] ax509certificate, String s)
        throws CertificateException {
    // TODO Auto-generated method stub
    try {
        myTrustManager.checkClientTrusted(ax509certificate, s);
    } catch (CertificateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        defaultTrustManager.checkClientTrusted(ax509certificate, s);
    }
}

@Override
public void checkServerTrusted(X509Certificate[] ax509certificate, String s)
        throws CertificateException {
    // TODO Auto-generated method stub
    try {
        myTrustManager.checkServerTrusted(ax509certificate, s);
    } catch (CertificateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        defaultTrustManager.checkServerTrusted(ax509certificate, s);
    }
}

public X509Certificate[] getAcceptedIssuers() {
    // TODO Auto-generated method stub
    return acceptedIssuers;
}

}

【讨论】:

    猜你喜欢
    • 2018-08-31
    • 2018-01-26
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-02
    • 1970-01-01
    相关资源
    最近更新 更多