接受带有自签名证书的HTTPS连接


153

我正在尝试使用HttpClientlib 进行HTTPS连接,但是问题在于,由于该证书不是由公认的证书颁发机构(CA)签名的,例如VerisignGlobalSIgn等,这些证书都列在Android可信证书中,我不断javax.net.ssl.SSLException: Not trusted server certificate

我已经看到了一些解决方案,您只接受所有证书,但是如果我想问用户该怎么办?

我想要一个类似于浏览器的对话框,让用户决定是否继续。最好是我想使用与浏览器相同的证书库。有任何想法吗?


这种接受的解决方案工作了我- stackoverflow.com/questions/2642777/...
文卡塔斯

Answers:


171

您需要做的第一件事是设置验证级别。这样的水平不是很多:

  • ALLOW_ALL_HOSTNAME_VERIFIER
  • BROWSER_COMPATIBLE_HOSTNAME_VERIFIER
  • STRICT_HOSTNAME_VERIFIER

尽管setHostnameVerifier()方法对于新库apache已过时,但对于Android SDK中的版本而言却是正常的。因此,我们将ALLOW_ALL_HOSTNAME_VERIFIER其设置在方法工厂中SSLSocketFactory.setHostnameVerifier()

接下来,您需要将协议的工厂设置为https。为此,只需调用该SchemeRegistry.register()方法。

然后,你需要创建一个DefaultHttpClientSingleClientConnManager。同样在下面的代码中,您可以看到默认情况下ALLOW_ALL_HOSTNAME_VERIFIER该方法还将使用我们的标志()HttpsURLConnection.setDefaultHostnameVerifier()

下面的代码对我有用:

HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;

DefaultHttpClient client = new DefaultHttpClient();

SchemeRegistry registry = new SchemeRegistry();
SSLSocketFactory socketFactory = SSLSocketFactory.getSocketFactory();
socketFactory.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier);
registry.register(new Scheme("https", socketFactory, 443));
SingleClientConnManager mgr = new SingleClientConnManager(client.getParams(), registry);
DefaultHttpClient httpClient = new DefaultHttpClient(mgr, client.getParams());

// Set verifier     
HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);

// Example send http request
final String url = "https://encrypted.google.com/";
HttpPost httpPost = new HttpPost(url);
HttpResponse response = httpClient.execute(httpPost);

6
不幸的是,我无法使此代码正常工作,但我仍然获得“不受信任的服务器证书”。我必须设置任何其他权限才能使其正常工作吗?
朱里(Juriy)2011年

1
此代码不只接受所有证书吗?我需要一个弹出窗口来接受它。
Morten

3
我正在使用org.apache.http.conn.ssl.SSLSocketFactory为什么要使用javax.net.ssl.HttpsURLConnection??
有人的地方

9
您能解释一下此代码比完全禁用证书验证更好吗?我对android的ssl API并不熟悉,但是乍一看,这似乎完全不适合主动攻击者。
CodesInChaos

3
我会建议使用ThreadSafeClientConnManager代替SingleClientConnManager
农场

124

需要以下主要步骤来实现来自证书颁发机构的安全连接,而该证书颁发机构不会被android平台信任。

根据许多用户的要求,我已经在我的博客文章中反映了最重要的部分:

  1. 获取所有必需的证书(根证书和任何中间CA)
  2. 使用keytool和BouncyCastle提供程序创建密钥库,并导入证书
  3. 将密钥库加载到您的android应用中,并将其用于安全连接(我建议使用Apache HttpClient而不是标准版本java.net.ssl.HttpsURLConnection(更易于理解,性能更高)

抓住证书

您必须获取所有从端点证书一直到根CA一直构建链的证书。这意味着,任何(如果存在)中间CA证书以及根CA证书。您不需要获取端点证书。

创建密钥库

下载BouncyCastle Provider并将其存储到已知位置。还要确保您可以调用keytool命令(通常位于JRE安装的bin文件夹下)。

现在,将获得的证书(不导入端点证书)导入到BouncyCastle格式的密钥库中。

我没有对其进行测试,但是我认为导入证书的顺序很重要。这意味着,首先导入最低的中间CA证书,然后一直导入根CA证书。

使用以下命令,将创建一个密码为mysecret的新密钥库(如果尚不存在),并将导入中间CA证书。我还定义了BouncyCastle提供程序,可以在我的文件系统和密钥库格式中找到它。对链中的每个证书执行此命令。

keytool -importcert -v -trustcacerts -file "path_to_cert/interm_ca.cer" -alias IntermediateCA -keystore "res/raw/mykeystore.bks" -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "path_to_bouncycastle/bcprov-jdk16-145.jar" -storetype BKS -storepass mysecret

验证证书是否正确导入到密钥库中:

keytool -list -keystore "res/raw/mykeystore.bks" -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "path_to_bouncycastle/bcprov-jdk16-145.jar" -storetype BKS -storepass mysecret

应该输出整个链:

RootCA, 22.10.2010, trustedCertEntry, Thumbprint (MD5): 24:77:D9:A8:91:D1:3B:FA:88:2D:C2:FF:F8:CD:33:93
IntermediateCA, 22.10.2010, trustedCertEntry, Thumbprint (MD5): 98:0F:C3:F8:39:F7:D8:05:07:02:0D:E3:14:5B:29:43

现在,您可以将密钥库作为原始资源复制到android应用中, res/raw/

在您的应用中使用密钥库

首先,我们必须创建一个自定义Apache HttpClient,它将我们的密钥库用于HTTPS连接:

import org.apache.http.*

public class MyHttpClient extends DefaultHttpClient {

    final Context context;

    public MyHttpClient(Context context) {
        this.context = context;
    }

    @Override
    protected ClientConnectionManager createClientConnectionManager() {
        SchemeRegistry registry = new SchemeRegistry();
        registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
        // Register for port 443 our SSLSocketFactory with our keystore
        // to the ConnectionManager
        registry.register(new Scheme("https", newSslSocketFactory(), 443));
        return new SingleClientConnManager(getParams(), registry);
    }

    private SSLSocketFactory newSslSocketFactory() {
        try {
            // Get an instance of the Bouncy Castle KeyStore format
            KeyStore trusted = KeyStore.getInstance("BKS");
            // Get the raw resource, which contains the keystore with
            // your trusted certificates (root and any intermediate certs)
            InputStream in = context.getResources().openRawResource(R.raw.mykeystore);
            try {
                // Initialize the keystore with the provided trusted certificates
                // Also provide the password of the keystore
                trusted.load(in, "mysecret".toCharArray());
            } finally {
                in.close();
            }
            // Pass the keystore to the SSLSocketFactory. The factory is responsible
            // for the verification of the server certificate.
            SSLSocketFactory sf = new SSLSocketFactory(trusted);
            // Hostname verification from certificate
            // http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html#d4e506
            sf.setHostnameVerifier(SSLSocketFactory.STRICT_HOSTNAME_VERIFIER);
            return sf;
        } catch (Exception e) {
            throw new AssertionError(e);
        }
    }
}

我们已经创建了自定义HttpClient,现在可以将其用于安全连接。例如,当我们对REST资源进行GET调用时:

// Instantiate the custom HttpClient
DefaultHttpClient client = new MyHttpClient(getApplicationContext());
HttpGet get = new HttpGet("https://www.mydomain.ch/rest/contacts/23");
// Execute the GET call and obtain the response
HttpResponse getResponse = client.execute(get);
HttpEntity responseEntity = getResponse.getEntity();

而已 ;)


8
这仅适用于在交付应用程序之前获取证书。并不能真正帮助用户接受自己的证书。为您的应用程序
模糊的

大家好,有人可以告诉我上述实现的具有信任库的密钥库的验证过程吗???在此先感谢..
andriod_testing 2012年

这个工作正常。.但是现在我在服务器上重新输入证书密钥时遇到了问题。每次我更新服务器上的证书时,客户端存储也应该更新,这似乎很奇怪。必须有更好的方法:|
bpn 2012年

GR8的答案,我会建议使用ThreadSafeClientConnManager代替SingleClientConnManager
农场

我已经添加了/res/raw/mykeystore.bks,尽管无法解析对其的引用。如何解决呢?
uniruddh 2014年

16

如果您的设备上没有服务器上的自定义/自签名证书,则可以使用以下类加载该证书并在Android的客户端上使用它:

放置证书*.crt文件,/res/raw以便可以从R.raw.*

使用下面的类来获取HTTPClientHttpsURLConnection将具有使用该证书的套接字工厂:

package com.example.customssl;

import android.content.Context;
import org.apache.http.client.HttpClient;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.AllowAllHostnameVerifier;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpParams;

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;

public class CustomCAHttpsProvider {

    /**
     * Creates a {@link org.apache.http.client.HttpClient} which is configured to work with a custom authority
     * certificate.
     *
     * @param context       Application Context
     * @param certRawResId  R.raw.id of certificate file (*.crt). Should be stored in /res/raw.
     * @param allowAllHosts If true then client will not check server against host names of certificate.
     * @return Http Client.
     * @throws Exception If there is an error initializing the client.
     */
    public static HttpClient getHttpClient(Context context, int certRawResId, boolean allowAllHosts) throws Exception {


        // build key store with ca certificate
        KeyStore keyStore = buildKeyStore(context, certRawResId);

        // init ssl socket factory with key store
        SSLSocketFactory sslSocketFactory = new SSLSocketFactory(keyStore);

        // skip hostname security check if specified
        if (allowAllHosts) {
            sslSocketFactory.setHostnameVerifier(new AllowAllHostnameVerifier());
        }

        // basic http params for client
        HttpParams params = new BasicHttpParams();

        // normal scheme registry with our ssl socket factory for "https"
        SchemeRegistry schemeRegistry = new SchemeRegistry();
        schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
        schemeRegistry.register(new Scheme("https", sslSocketFactory, 443));

        // create connection manager
        ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(params, schemeRegistry);

        // create http client
        return new DefaultHttpClient(cm, params);
    }

    /**
     * Creates a {@link javax.net.ssl.HttpsURLConnection} which is configured to work with a custom authority
     * certificate.
     *
     * @param urlString     remote url string.
     * @param context       Application Context
     * @param certRawResId  R.raw.id of certificate file (*.crt). Should be stored in /res/raw.
     * @param allowAllHosts If true then client will not check server against host names of certificate.
     * @return Http url connection.
     * @throws Exception If there is an error initializing the connection.
     */
    public static HttpsURLConnection getHttpsUrlConnection(String urlString, Context context, int certRawResId,
                                                           boolean allowAllHosts) throws Exception {

        // build key store with ca certificate
        KeyStore keyStore = buildKeyStore(context, certRawResId);

        // Create a TrustManager that trusts the CAs in our KeyStore
        String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
        tmf.init(keyStore);

        // Create an SSLContext that uses our TrustManager
        SSLContext sslContext = SSLContext.getInstance("TLS");
        sslContext.init(null, tmf.getTrustManagers(), null);

        // Create a connection from url
        URL url = new URL(urlString);
        HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();
        urlConnection.setSSLSocketFactory(sslContext.getSocketFactory());

        // skip hostname security check if specified
        if (allowAllHosts) {
            urlConnection.setHostnameVerifier(new AllowAllHostnameVerifier());
        }

        return urlConnection;
    }

    private static KeyStore buildKeyStore(Context context, int certRawResId) throws KeyStoreException, CertificateException, NoSuchAlgorithmException, IOException {
        // init a default key store
        String keyStoreType = KeyStore.getDefaultType();
        KeyStore keyStore = KeyStore.getInstance(keyStoreType);
        keyStore.load(null, null);

        // read and add certificate authority
        Certificate cert = readCert(context, certRawResId);
        keyStore.setCertificateEntry("ca", cert);

        return keyStore;
    }

    private static Certificate readCert(Context context, int certResourceId) throws CertificateException, IOException {

        // read certificate resource
        InputStream caInput = context.getResources().openRawResource(certResourceId);

        Certificate ca;
        try {
            // generate a certificate
            CertificateFactory cf = CertificateFactory.getInstance("X.509");
            ca = cf.generateCertificate(caInput);
        } finally {
            caInput.close();
        }

        return ca;
    }

}

关键点:

  1. Certificate对象是从.crt文件生成的。
  2. KeyStore创建一个默认值。
  3. keyStore.setCertificateEntry("ca", cert)正在将证书添加到别名为“ ca”的密钥存储中。您修改代码以添加更多证书(中间CA等)。
  4. 主要目的是生成SSLSocketFactory,然后可由HTTPClient或使用HttpsURLConnection
  5. SSLSocketFactory 可以进一步配置,例如跳过主机名验证等。

有关更多信息,请访问:http : //developer.android.com/training/articles/security-ssl.html


从哪里.crt下载文件?从服务器下载文件?
zionpi

@zionpi证书文件将与您要连接的启用TLS的服务器使用的文件相同。
2015年

谢谢!这太简单了!
卡皮尔·塔达尼2015年

@SD如何使用.P12文件代替.crt?
Rakesh R Nair

我也有类似的疑问,请您帮助stackoverflow.com/questions/57389622/…–
StezPet

8

尝试使用https将Android应用程序连接到RESTful服务时,我感到沮丧。另外,对于建议完全禁用证书检查的所有答案,我也有些恼火。如果这样做,https的意义是什么?

一派约了一会儿主题后,我终于找到了这个解决方案,不需要外部罐子,让Android的API。感谢2014年7月发布的Andrew Smith

 /**
 * Set up a connection to myservice.domain using HTTPS. An entire function
 * is needed to do this because myservice.domain has a self-signed certificate.
 * 
 * The caller of the function would do something like:
 * HttpsURLConnection urlConnection = setUpHttpsConnection("https://littlesvr.ca");
 * InputStream in = urlConnection.getInputStream();
 * And read from that "in" as usual in Java
 * 
 * Based on code from:
 * https://developer.android.com/training/articles/security-ssl.html#SelfSigned
 */
public static HttpsURLConnection setUpHttpsConnection(String urlString)
{
    try
    {
        // Load CAs from an InputStream
        // (could be from a resource or ByteArrayInputStream or ...)
        CertificateFactory cf = CertificateFactory.getInstance("X.509");

        // My CRT file that I put in the assets folder
        // I got this file by following these steps:
        // * Go to https://littlesvr.ca using Firefox
        // * Click the padlock/More/Security/View Certificate/Details/Export
        // * Saved the file as littlesvr.crt (type X.509 Certificate (PEM))
        // The MainActivity.context is declared as:
        // public static Context context;
        // And initialized in MainActivity.onCreate() as:
        // MainActivity.context = getApplicationContext();
        InputStream caInput = new BufferedInputStream(MainActivity.context.getAssets().open("littlesvr.crt"));
        Certificate ca = cf.generateCertificate(caInput);
        System.out.println("ca=" + ((X509Certificate) ca).getSubjectDN());

        // Create a KeyStore containing our trusted CAs
        String keyStoreType = KeyStore.getDefaultType();
        KeyStore keyStore = KeyStore.getInstance(keyStoreType);
        keyStore.load(null, null);
        keyStore.setCertificateEntry("ca", ca);

        // Create a TrustManager that trusts the CAs in our KeyStore
        String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
        tmf.init(keyStore);

        // Create an SSLContext that uses our TrustManager
        SSLContext context = SSLContext.getInstance("TLS");
        context.init(null, tmf.getTrustManagers(), null);

        // Tell the URLConnection to use a SocketFactory from our SSLContext
        URL url = new URL(urlString);
        HttpsURLConnection urlConnection = (HttpsURLConnection)url.openConnection();
        urlConnection.setSSLSocketFactory(context.getSocketFactory());

        return urlConnection;
    }
    catch (Exception ex)
    {
        Log.e(TAG, "Failed to establish SSL connection to server: " + ex.toString());
        return null;
    }
}

它对我的样机应用程序效果很好。


X509Certificate我应该导入java或javax哪一个?

我进口了import java.security.cert.X509Certificate;
GonzaloFernández'16

感谢您的支持。这确实很简单,很简单
Anuradhe Dilshan

6

最佳答案对我没有用。经过一番调查后,我在“ Android Developer”上找到了所需的信息:https : //developer.android.com/training/articles/security-ssl.html#SelfSigned

创建X509TrustManager的空实现可以解决问题:

private static class MyTrustManager implements X509TrustManager
{

    @Override
    public void checkClientTrusted(X509Certificate[] chain, String authType)
         throws CertificateException
    {
    }

    @Override
    public void checkServerTrusted(X509Certificate[] chain, String authType)
        throws CertificateException
    {
    }

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

}

...

HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
try
{
    // Create an SSLContext that uses our TrustManager
    SSLContext context = SSLContext.getInstance("TLS");
    TrustManager[] tmlist = {new MyTrustManager()};
    context.init(null, tmlist, null);
    conn.setSSLSocketFactory(context.getSocketFactory());
}
catch (NoSuchAlgorithmException e)
{
    throw new IOException(e);
} catch (KeyManagementException e)
{
    throw new IOException(e);
}
conn.setRequestMethod("GET");
int rcode = conn.getResponseCode();

请注意,TustManager的这种空实现只是一个示例,在生产环境中使用它会造成严重的安全威胁!


1
只是fyi-idk当时是否是这样,但他们现在似乎强烈反对这种方法(请参阅注释)
Saik Caskey

6

Google建议您将Android Volley用于HTTP / HTTPS连接,因为这HttpClient已被弃用。因此,您知道正确的选择:)。

还有,永不NUKE SSL证书(永不!!!)。

破坏SSL证书完全违背SSL的宗旨,而SSL的目的在于提高安全性。如果您打算炸毁所有附带的SSL证书,则没有使用SSL的感觉。更好的解决方案是不使用SSL,或者更好的解决方案是TrustManager使用Android Volley for HTTP / HTTPS连接在您的App +上创建自定义。

这是我使用基本的LoginApp创建的要点,它使用服务器端使用的自签名证书执行HTTPS连接,并接受该应用程序。

这也是另一个要点,它可能会帮助您创建用于在服务器上设置的自签名SSL证书,并在您的App上使用该证书。非常重要:您必须将上述脚本生成的.crt文件复制到Android项目中的“原始”目录中。


您好Ivan,我从未使用过SSL证书。您愿意详细说明一下,如何获取.crt文件?
jlively

嗨,Jively!我懂了。当然是。但是首先,您介意看看我上面提到的第二个Gist吗?我在Gist上放了两个文件:一个是脚本使用的文件,另一个是脚本本身,该脚本使用“ openssl”二进制文件读取文件,然后构建包含SSL证书的文件( .crt)。让我知道您是否了解了全部内容。问候 :)。
ivanleoncz

嗯,是的,我看过这两个要点,但是我真的不明白如何使用它们?
jlively

4

您可以通过以下方法将其他证书添加到KeyStore中,以避免出现此问题:通过HTTPS使用HttpClient信任所有证书

它不会像您询问的那样提示用户,但是这将减少用户遇到“不可信服务器证书”错误的可能性。


仅出于测试目的,您无法使用此技巧在Play商店中发布应用,因为它会被拒绝
ariel

3

创建SSL证书的最简单方法

打开Firefox(我想Chrome也可以,但使用FF对我来说更容易)

使用自签名SSL证书访问您的开发站点。

单击证书(站点名称旁边)

点击“更多信息”

点击“查看证书”

点击“详细信息”

点击“导出...”

选择“ X.509证书蒙山链(PEM)”,选择要保存的文件夹和名称,然后单击“保存”

转到命令行,转到下载了pem文件的目录,然后执行“ openssl x509 -inform PEM -outform DM -in .pem -out .crt”

将.crt文件复制到Android设备内的/ sdcard文件夹的根目录中。在Android设备内,依次单击设置>安全性>从存储安装。

它应该检测到证书并将其添加到设备中。浏览到开发站点。

第一次应要求您确认安全例外。就这样。

该证书应可与您Android上安装的任何浏览器(浏览器,Chrome,Opera,海豚...)一起使用。

请记住,如果您要从其他域(我们都是页面速度的母狗)提供静态文件,则还需要添加该域的证书。


2

我编写了小型库ssl-utils-android来信任Android上的特定证书。

您只需提供资产目录中的文件名即可加载任何证书。

用法:

OkHttpClient client = new OkHttpClient();
SSLContext sslContext = SslUtils.getSslContextForCertificateFile(context, "BPClass2RootCA-sha2.cer");
client.setSslSocketFactory(sslContext.getSocketFactory());

1

这些修补程序都不适用于针对SDK 16版本4.1.2的开发平台,因此我找到了一种解决方法。

我的应用程序使用“ http://www.example.com/page.php?data=somedata ” 将数据存储在服务器上

最近,page.php移至“ https://www.secure-example.com/page.php ”,并且我不断收到“ javax.net.ssl.SSLException:不可信服务器证书”。

相反,接受所有证书只有一个页面,而开始与本指南我解决我的问题我自己写page.php文件上“发表http://www.example.com/page.php

<?php

caronte ("https://www.secure-example.com/page.php");

function caronte($url) {
    // build curl request
    $ch = curl_init();
    foreach ($_POST as $a => $b) {
        $post[htmlentities($a)]=htmlentities($b);
    }
    curl_setopt($ch, CURLOPT_URL,$url);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS,http_build_query($post));

    // receive server response ...
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $server_output = curl_exec ($ch);
    curl_close ($ch);

    echo $server_output;
}

?>

1

2020年1月19日自签名证书问题修正:

要播放视频,图像,为任何自签名证书调用webservice或连接到任何不安全的url,只需在执行任何操作之前调用此方法,即可解决有关证书问题的问题:

科特林代码

  private fun disableSSLCertificateChecking() {
        val hostnameVerifier = object: HostnameVerifier {
            override fun verify(s:String, sslSession: SSLSession):Boolean {
                return true
            }
        }
        val trustAllCerts = arrayOf<TrustManager>(object: X509TrustManager {
            override fun getAcceptedIssuers(): Array<X509Certificate> {
                TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
            }

            //val acceptedIssuers:Array<X509Certificate> = null
            @Throws(CertificateException::class)
            override fun checkClientTrusted(arg0:Array<X509Certificate>, arg1:String) {// Not implemented
            }
            @Throws(CertificateException::class)
            override fun checkServerTrusted(arg0:Array<X509Certificate>, arg1:String) {// Not implemented
            }
        })
        try
        {
            val sc = SSLContext.getInstance("TLS")
            sc.init(null, trustAllCerts, java.security.SecureRandom())
            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory())
            HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier)
        }
        catch (e: KeyManagementException) {
            e.printStackTrace()
        }
        catch (e: NoSuchAlgorithmException) {
            e.printStackTrace()
        }
    }

0

也许这会有所帮助...它适用于使用自签名证书的Java客户端(不检查证书)。请小心,仅将其用于开发案例,因为这根本不安全!!

如何忽略Apache HttpClient 4.0中的SSL证书错误

希望它能在Android上运行,只需添加HttpClient库...祝您好运!


1
不,它在android上不起作用,因为它依赖于Android变体中不存在的已弃用方法:-(
kellyfj 2014年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.