Kết nối Https Android


101

Tôi đang thực hiện một bài đăng https và tôi nhận được một ngoại lệ của ngoại lệ ssl Không phải chứng chỉ máy chủ đáng tin cậy. Nếu tôi làm http bình thường, nó hoạt động hoàn toàn tốt. Tôi có phải chấp nhận chứng chỉ máy chủ bằng cách nào đó không?


Tôi có thể nhận được một số thi mẫu của cùng
Sam97305421562

luồng này có thể giúp được gì không, nhưng tôi không thể biết liệu nó có hoạt động hay không API mới nhất: groups.google.com/group/android-developers/browse_thread/thread/…
RzR

Câu trả lời:


45

Tôi đang phỏng đoán, nhưng nếu bạn muốn bắt tay thực sự xảy ra, bạn phải cho android biết về chứng chỉ của mình. Nếu bạn chỉ muốn chấp nhận bất kể điều gì, hãy sử dụng mã giả này để nhận những gì bạn cần với Apache HTTP Client:

SchemeRegistry schemeRegistry = new SchemeRegistry ();

schemeRegistry.register (new Scheme ("http",
    PlainSocketFactory.getSocketFactory (), 80));
schemeRegistry.register (new Scheme ("https",
    new CustomSSLSocketFactory (), 443));

ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager (
    params, schemeRegistry);


return new DefaultHttpClient (cm, params);

CustomSSLSocketFactory:

public class CustomSSLSocketFactory extends org.apache.http.conn.ssl.SSLSocketFactory
{
private SSLSocketFactory FACTORY = HttpsURLConnection.getDefaultSSLSocketFactory ();

public CustomSSLSocketFactory ()
    {
    super(null);
    try
        {
        SSLContext context = SSLContext.getInstance ("TLS");
        TrustManager[] tm = new TrustManager[] { new FullX509TrustManager () };
        context.init (null, tm, new SecureRandom ());

        FACTORY = context.getSocketFactory ();
        }
    catch (Exception e)
        {
        e.printStackTrace();
        }
    }

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

 // TODO: add other methods like createSocket() and getDefaultCipherSuites().
 // Hint: they all just make a call to member FACTORY 
}

FullX509TrustManager là một lớp triển khai javax.net.ssl.X509TrustManager, nhưng không có phương thức nào thực sự thực hiện bất kỳ công việc nào, hãy lấy mẫu tại đây .

Chúc may mắn!


Tại sao lại có biến FACTORY ??
Codevalley

1
trả về FACTORY.createSocket (); đang gặp vấn đề. Socket đã tạo đang đưa ra ngoại lệ Con trỏ null trên thực thi (). Ngoài ra, tôi nhận thấy, có 2 lớp SocketFactory. 1. org.apache.http.conn.ssl.SSLSocketFactory và 2. javax.net.ssl.SSLSocketFactory
Codevalley

2
Xin chào Nate, điều này có vẻ như một cái gì đó hữu ích cho tình huống của tôi. Tuy nhiên, tôi đang gặp một số vấn đề với việc tạo CustomSSLSocketFactory. Nó phải mở rộng lớp nào? Hoặc giao diện nào được thực hiện? Tôi đã thử nghiệm với: javax.net.SocketFactory, javax.net.ssl.SSLSocketFactory, org.apache.http.conn.scheme.SocketFactory, tất cả đều buộc thực hiện các phương pháp khác ... Vì vậy, nói chung, những gì không gian tên của các lớp được sử dụng trong mã của bạn? Cảm ơn bạn. :)
Cephron

2
Không hoạt động đối với tôi, mang lại cho tôi cùng một lỗi chứng chỉ máy chủ Không đáng tin cậy.
Omar Rehman

1
làm thế nào tôi có thể nhận được lớp nàyFullX509TrustManager
RajaReddy PolamReddy

89

Đây là những gì tôi đang làm. Nó chỉ đơn giản là không kiểm tra chứng chỉ nữa.

// always verify the host - dont check for certificate
final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {
    public boolean verify(String hostname, SSLSession session) {
        return true;
    }
};

/**
 * Trust every server - dont check for any certificate
 */
private static void trustAllHosts() {
    // Create a trust manager that does not validate certificate chains
    TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
            return new java.security.cert.X509Certificate[] {};
        }

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

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

    // Install the all-trusting trust manager
    try {
        SSLContext sc = SSLContext.getInstance("TLS");
        sc.init(null, trustAllCerts, new java.security.SecureRandom());
        HttpsURLConnection
                .setDefaultSSLSocketFactory(sc.getSocketFactory());
    } catch (Exception e) {
        e.printStackTrace();
    }
}

    HttpURLConnection http = null;

    if (url.getProtocol().toLowerCase().equals("https")) {
        trustAllHosts();
        HttpsURLConnection https = (HttpsURLConnection) url.openConnection();
        https.setHostnameVerifier(DO_NOT_VERIFY);
        http = https;
    } else {
        http = (HttpURLConnection) url.openConnection();
    }

Nhìn có vẻ tốt! Tuy nhiên, tôi đang sử dụng WebView và chỉ cần kết nối với máy chủ https cho mục đích thử nghiệm. (Khách hàng không thể cung cấp một cái với FQDN phù hợp, cũng như không thể kiểm tra trên http.) Có cách nào để giải quyết vấn đề này khi sử dụng WebView không? Tôi chỉ thả mã này vào Hoạt động mà WebView ở đó và "nó chỉ hoạt động?" (Nghi ngờ là không… ??)
Joe D'Andrea

tôi đang cố gắng sử dụng giải pháp đó từng bước và tôi nhận được ngoại lệ như vậy: 07-25 12: 35: 25.941: WARN / System.err (24383): java.lang.ClassCastException: org.apache.harmony.luni .internal.net.www.protocol.http.HttpURLConnection Nhập vào vị trí mà tôi đang cố gắng mở kết nối ... bất kỳ ý tưởng nào tại sao ??
Robert

1
Này, tôi đã làm theo đề xuất của bạn nhưng tôi nhận được ngoại lệ như javax.net.ssl.SSLException: Received fatal alert: bad_record_mac. Tôi cũng đã thử thay thế TLSbằng SSLnhưng không giúp được gì. Xin hãy giúp tôi, Cảm ơn
devsri 22/02/12

40
Mặc dù điều này là tốt trong giai đoạn phát triển, nhưng bạn nên biết thực tế là điều này cho phép bất kỳ ai MITM kết nối an toàn của bạn bằng cách giả mạo chứng chỉ SSL ngẫu nhiên, điều này khiến kết nối của bạn không còn an toàn nữa. Hãy xem câu hỏi này để biết nó được thực hiện đúng cách, tại đây để xem cách nhận chứng chỉ và cuối cùng là phần này để tìm hiểu cách thêm nó vào kho khóa.
cimnine

2
Bạn không nên sử dụng khuyến nghị hoặc đăng mã này. Nó hoàn toàn không an toàn. Bạn nên giải quyết vấn đề thực tế.
Marquis of Lorne vào

33

Trong khi cố gắng trả lời câu hỏi này, tôi đã tìm thấy một hướng dẫn tốt hơn. Với nó, bạn không phải ảnh hưởng đến việc kiểm tra chứng chỉ.

http://blog.crazybob.org/2010/02/android-trusting-ssl-certificates.html

* Tôi không viết cái này nhưng cảm ơn Bob Lee về công việc


4
Đây là câu trả lời hoàn hảo. Tôi đã thực hiện một bài đăng cập nhật cho biết cách đối phó với các CA không được liệt kê vì tôi gặp lỗi PeerCertificate. Xem nó ở đây: blog.donnfelker.com/2011/06/13/…
Donn Felker


4

http://madurangasblogs.blogspot.in/2013/08/avoiding-javaxnetsslsslpeerunverifiedex.html

Maduranga lịch sự

Khi phát triển ứng dụng sử dụng https, máy chủ thử nghiệm của bạn không có chứng chỉ SSL hợp lệ. Hoặc đôi khi trang web đang sử dụng chứng chỉ tự ký hoặc trang web đang sử dụng chứng chỉ SSL miễn phí. Vì vậy, nếu bạn cố gắng kết nối với máy chủ bằng Apache HttpClient, bạn sẽ nhận được một ngoại lệ nói rằng "máy ngang hàng không được xác thực". Mặc dù không phải là một thông lệ tốt để tin tưởng tất cả các chứng chỉ trong một phần mềm sản xuất, bạn có thể phải làm như vậy tùy theo tình huống. Giải pháp này giải quyết trường hợp ngoại lệ do "peer nothenticated".

Nhưng trước khi chúng ta đi đến giải pháp, tôi phải cảnh báo bạn rằng đây không phải là một ý tưởng hay cho một ứng dụng sản xuất. Điều này sẽ vi phạm mục đích của việc sử dụng chứng chỉ bảo mật. Vì vậy, trừ khi bạn có lý do chính đáng hoặc nếu bạn chắc chắn rằng điều này sẽ không gây ra bất kỳ vấn đề gì, thì không nên sử dụng giải pháp này.

Thông thường bạn tạo một cái HttpClientnhư thế này.

HttpClient httpclient = new DefaultHttpClient();

Nhưng bạn phải thay đổi cách tạo HttpClient.

Đầu tiên, bạn phải tạo một lớp mở rộng org.apache.http.conn.ssl.SSLSocketFactory.

import org.apache.http.conn.ssl.SSLSocketFactory;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

public class MySSLSocketFactory extends SSLSocketFactory {
         SSLContext sslContext = SSLContext.getInstance("TLS");

    public MySSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {
        super(truststore);

        TrustManager tm = new X509TrustManager() {
            public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            }

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

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

        sslContext.init(null, new TrustManager[] { tm }, null);
    }

    @Override
    public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException {
        return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);
    }

    @Override
    public Socket createSocket() throws IOException {
        return sslContext.getSocketFactory().createSocket();
    }
}

Sau đó, tạo một phương thức như thế này.

public HttpClient getNewHttpClient() {
     try {
         KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
         trustStore.load(null, null);

         SSLSocketFactory sf = new MySSLSocketFactory(trustStore);
         sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

         HttpParams params = new BasicHttpParams();
         HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
         HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);

         SchemeRegistry registry = new SchemeRegistry();
         registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
         registry.register(new Scheme("https", sf, 443));

         ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);

         return new DefaultHttpClient(ccm, params);
     } catch (Exception e) {
         return new DefaultHttpClient();
     }
}

Sau đó, bạn có thể tạo HttpClient.

HttpClient httpclient = getNewHttpClient();

Nếu bạn đang cố gắng gửi một yêu cầu đăng bài đến một trang đăng nhập, phần còn lại của mã sẽ như thế này.

private URI url = new URI("url of the action of the form");
HttpPost httppost =  new HttpPost(url);
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();  
nameValuePairs.add(new BasicNameValuePair("username", "user"));  
nameValuePairs.add(new BasicNameValuePair("password", "password"));
try {
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    HttpResponse response = httpclient.execute(httppost);
    HttpEntity entity = response.getEntity();
    InputStream is = entity.getContent();
} catch (UnsupportedEncodingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (ClientProtocolException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

Bạn đưa trang html đến InputStream. Sau đó, bạn có thể làm bất cứ điều gì bạn muốn với trang html trả về.

Nhưng ở đây bạn sẽ phải đối mặt với một vấn đề. Nếu bạn muốn quản lý một phiên bằng cookie, bạn sẽ không thể thực hiện bằng phương pháp này. Nếu bạn muốn lấy cookie, bạn sẽ phải thực hiện qua trình duyệt. Sau đó, chỉ bạn sẽ nhận được cookie.




2

Bất kỳ câu trả lời nào trong số này không phù hợp với tôi vì vậy đây là mã tin cậy bất kỳ chứng chỉ nào.

import java.io.IOException;

    import java.net.Socket;
    import java.security.KeyManagementException;
    import java.security.KeyStoreException;
    import java.security.NoSuchAlgorithmException;
    import java.security.UnrecoverableKeyException;
    import java.security.cert.CertificateException;
    import java.security.cert.X509Certificate;

    import javax.net.ssl.SSLContext;
    import javax.net.ssl.TrustManager;
    import javax.net.ssl.X509TrustManager;

    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpPost;
    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.SSLSocketFactory;
    import org.apache.http.conn.ssl.X509HostnameVerifier;
    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.HttpConnectionParams;
import org.apache.http.params.HttpParams;

    public class HttpsClientBuilder {
        public static DefaultHttpClient getBelieverHttpsClient() {

            DefaultHttpClient client = null;

            SchemeRegistry Current_Scheme = new SchemeRegistry();
            Current_Scheme.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
            try {
                Current_Scheme.register(new Scheme("https", new Naive_SSLSocketFactory(), 8443));
            } catch (KeyManagementException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (UnrecoverableKeyException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (NoSuchAlgorithmException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (KeyStoreException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            HttpParams Current_Params = new BasicHttpParams();
            int timeoutConnection = 8000;
            HttpConnectionParams.setConnectionTimeout(Current_Params, timeoutConnection);
            int timeoutSocket = 10000;
            HttpConnectionParams.setSoTimeout(Current_Params, timeoutSocket);
            ThreadSafeClientConnManager Current_Manager = new ThreadSafeClientConnManager(Current_Params, Current_Scheme);
            client = new DefaultHttpClient(Current_Manager, Current_Params);
            //HttpPost httpPost = new HttpPost(url);
            //client.execute(httpPost);

         return client;
         }

    public static class Naive_SSLSocketFactory extends SSLSocketFactory
    {
        protected SSLContext Cur_SSL_Context = SSLContext.getInstance("TLS");

        public Naive_SSLSocketFactory ()
                throws NoSuchAlgorithmException, KeyManagementException,
                KeyStoreException, UnrecoverableKeyException
        {
            super(null, null, null, null, null, (X509HostnameVerifier)null);
            Cur_SSL_Context.init(null, new TrustManager[] { new X509_Trust_Manager() }, null);
        }

        @Override
        public Socket createSocket(Socket socket, String host, int port,
                boolean autoClose) throws IOException
        {
            return Cur_SSL_Context.getSocketFactory().createSocket(socket, host, port, autoClose);
        }

        @Override
        public Socket createSocket() throws IOException
        {
            return Cur_SSL_Context.getSocketFactory().createSocket();
        }
    }

    private static class X509_Trust_Manager implements X509TrustManager
    {

        public void checkClientTrusted(X509Certificate[] chain, String authType)
                throws CertificateException {
            // TODO Auto-generated method stub

        }

        public void checkServerTrusted(X509Certificate[] chain, String authType)
                throws CertificateException {
            // TODO Auto-generated method stub

        }

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

    };
}

Mã này hoạt động tốt với mẫu URL - localhost: 8443 / webProject / YourService
Speise

Hàm tạo SSLSocketFactory (null, null, null, null, null, X509HostnameVerifier) ​​là không xác định
Michal

1

Tôi không biết về các chi tiết cụ thể của Android cho chứng chỉ ssl, nhưng sẽ có lý khi Android sẽ không chấp nhận chứng chỉ ssl tự ký. Tôi tìm thấy bài đăng này từ các diễn đàn android có vẻ như đang giải quyết vấn đề tương tự: http://androidforums.com/android-application/950-imap-self-signed-ssl-certificates.html


Giống như tôi đã nói, tôi không biết các chi tiết cụ thể của Android nhưng tôi đã đến ngày mà bạn phải cho nền tảng biết chứng chỉ ssl của máy chủ mà bạn đang kết nối. Đó là nếu bạn đang sử dụng chứng chỉ tự ký không được nền tảng công nhận. Lớp SslCertificate có thể sẽ hữu ích: developer.android.com/reference/android/net/http/… Tôi sẽ tìm hiểu vấn đề này sau ngày hôm nay khi có thêm thời gian.
Matti Lyra


0

Vì một số lý do, giải pháp được đề cập cho httpClient ở trên không hoạt động với tôi. Cuối cùng, tôi đã có thể làm cho nó hoạt động bằng cách ghi đè phương thức một cách chính xác khi triển khai lớp SSLSocketFactory tùy chỉnh.

@Override
public Socket createSocket(Socket socket, String host, int port, boolean autoClose) 
                              throws IOException, UnknownHostException 
    {
    return sslFactory.createSocket(socket, host, port, autoClose);
}

@Override
public Socket createSocket() throws IOException {
    return sslFactory.createSocket();
}

Đây là cách nó hoạt động hoàn hảo đối với tôi. Bạn có thể xem toàn bộ lớp tùy chỉnh và triển khai trên chuỗi sau: http://blog.syedgakbar.com/2012/07/21/android-https-and-not-trusted-server-certificate-error/


0

Tôi thực hiện lớp học này và tìm thấy

package com.example.fakessl;

import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;

import android.util.Log;

public class CertificadoAceptar {
    private static TrustManager[] trustManagers;

    public static class _FakeX509TrustManager implements
            javax.net.ssl.X509TrustManager {
        private static final X509Certificate[] _AcceptedIssuers = new X509Certificate[] {};

        public void checkClientTrusted(X509Certificate[] arg0, String arg1)
                throws CertificateException {
        }

        public void checkServerTrusted(X509Certificate[] arg0, String arg1)
                throws CertificateException {
        }

        public boolean isClientTrusted(X509Certificate[] chain) {
            return (true);
        }

        public boolean isServerTrusted(X509Certificate[] chain) {
            return (true);
        }

        public X509Certificate[] getAcceptedIssuers() {
            return (_AcceptedIssuers);
        }
    }

    public static void allowAllSSL() {

        javax.net.ssl.HttpsURLConnection
                .setDefaultHostnameVerifier(new HostnameVerifier() {
                    public boolean verify(String hostname, SSLSession session) {
                        return true;
                    }
                });

        javax.net.ssl.SSLContext context = null;

        if (trustManagers == null) {
            trustManagers = new javax.net.ssl.TrustManager[] { new _FakeX509TrustManager() };
        }

        try {
            context = javax.net.ssl.SSLContext.getInstance("TLS");
            context.init(null, trustManagers, new SecureRandom());
        } catch (NoSuchAlgorithmException e) {
            Log.e("allowAllSSL", e.toString());
        } catch (KeyManagementException e) {
            Log.e("allowAllSSL", e.toString());
        }
        javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(context
                .getSocketFactory());
    }
}

trong bạn mã màu trắng này

CertificadoAceptar ca = new CertificadoAceptar();
ca.allowAllSSL();
HttpsTransportSE Transport = new HttpsTransportSE("iphost or host name", 8080, "/WS/wsexample.asmx?WSDL", 30000);

0

Các nguồn đã giúp tôi làm việc với chứng chỉ tự ký trên máy chủ AWS Apache của tôi và kết nối với HttpsURLConnection từ thiết bị Android:

SSL trên phiên bản aws - hướng dẫn của amazon về ssl
Android Security với HTTPS và SSL - tạo trình quản lý tin cậy của riêng bạn trên ứng dụng khách để chấp nhận chứng chỉ của bạn
Tạo chứng chỉ tự ký - tập lệnh dễ dàng để tạo chứng chỉ của bạn

Sau đó, tôi đã làm như sau:

  1. Đảm bảo máy chủ hỗ trợ https (sudo yum install -y mod24_ssl)
  2. Đặt tập lệnh này vào một tệp create_my_certs.sh:
#!/bin/bash
FQDN=$1

# make directories to work from
mkdir -p server/ client/ all/

# Create your very own Root Certificate Authority
openssl genrsa \
  -out all/my-private-root-ca.privkey.pem \
  2048

# Self-sign your Root Certificate Authority
# Since this is private, the details can be as bogus as you like
openssl req \
  -x509 \
  -new \
  -nodes \
  -key all/my-private-root-ca.privkey.pem \
  -days 1024 \
  -out all/my-private-root-ca.cert.pem \
  -subj "/C=US/ST=Utah/L=Provo/O=ACME Signing Authority Inc/CN=example.com"

# Create a Device Certificate for each domain,
# such as example.com, *.example.com, awesome.example.com
# NOTE: You MUST match CN to the domain name or ip address you want to use
openssl genrsa \
  -out all/privkey.pem \
  2048

# Create a request from your Device, which your Root CA will sign
openssl req -new \
  -key all/privkey.pem \
  -out all/csr.pem \
  -subj "/C=US/ST=Utah/L=Provo/O=ACME Tech Inc/CN=${FQDN}"

# Sign the request from Device with your Root CA
openssl x509 \
  -req -in all/csr.pem \
  -CA all/my-private-root-ca.cert.pem \
  -CAkey all/my-private-root-ca.privkey.pem \
  -CAcreateserial \
  -out all/cert.pem \
  -days 500

# Put things in their proper place
rsync -a all/{privkey,cert}.pem server/
cat all/cert.pem > server/fullchain.pem         # we have no intermediates in this case
rsync -a all/my-private-root-ca.cert.pem server/
rsync -a all/my-private-root-ca.cert.pem client/
  1. Chạy bash create_my_certs.sh yourdomain.com
  2. Đặt các chứng chỉ vào vị trí thích hợp của chúng trên máy chủ (bạn có thể tìm thấy cấu hình trong /etc/httpd/conf.d/ssl.conf). Tất cả những điều này nên được đặt:
    SSLCertificateFile
    SSLCertificateKeyFile
    SSLCertificateChainFile
    SSLCACertificateFile

  3. Khởi động lại httpd bằng cách sử dụng sudo service httpd restartvà đảm bảo httpd đã bắt đầu: Đang
    dừng httpd: [OK] Đang
    khởi động httpd: [OK]

  4. Sao chép my-private-root-ca.certvào thư mục nội dung dự án Android của bạn

  5. Tạo người quản lý tin cậy của bạn:

    SSLContext SSLContext;

    CertificateFactory cf = CertificateFactory.getInstance ("X.509"); InputStream caInput = context.getAssets (). Open ("my-private-root-ca.cert.pem"); Chứng chỉ ca; thử {ca = cf.generateCertificate (caInput); } cuối cùng {caInput.close (); }

      // 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 = SSLContext.getInstance("TLS");
      SSSLContext.init(null, tmf.getTrustManagers(), null);
  6. Và tạo kết nối bằng HttpsURLConnection:

    Kết nối HttpsURLConnection = (HttpsURLConnection) url.openConnection (); connect.setSSLSocketFactory (SSLContext.getSocketFactory ());

  7. Đó là nó, hãy thử kết nối https của bạn.


0

Có lẽ bạn có thể thử một cái gì đó như thế này. Điều này đã giúp tôi

    SslContextFactory sec = new SslContextFactory();
    sec.setValidateCerts(false);
    sec.setTrustAll(true);

    org.eclipse.jetty.websocket.client.WebSocketClient client = new WebSocketClient(sec);

-1

Chỉ cần sử dụng phương pháp này làm HTTPClient của bạn:

public static  HttpClient getNewHttpClient() {
    try {
        KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
        trustStore.load(null, null);

        SSLSocketFactory sf = new MySSLSocketFactory(trustStore);
        sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

        HttpParams params = new BasicHttpParams();
        HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
        HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);

        SchemeRegistry registry = new SchemeRegistry();
        registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
        registry.register(new Scheme("https", sf, 443));

        ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);

        return new DefaultHttpClient(ccm, params);
    } catch (Exception e) {
        return new DefaultHttpClient();
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.