2015-12-23 3 views
1

Я пытаюсь отправить некоторые данные к HTTPS URL, поэтому я использовал код, который я нашел в http://developer.android.com/reference/javax/net/ssl/HttpsURLConnection.html:Как подключиться к HTTPS URL с помощью HttpsURLConnection

   KeyStore keyStore = ...; 
       String algorithm = TrustManagerFactory.getDefaultAlgorithm(); 
       TrustManagerFactory tmf =TrustManagerFactory.getInstance(algorithm); 
       tmf.init(keyStore); 

       SSLContext context = SSLContext.getInstance("TLS"); 
       context.init(null, tmf.getTrustManagers(), null); 

       // Open a HTTP connection to the URL 
       conn = (HttpsURLConnection) url.openConnection(); 
       conn.setSSLSocketFactory(context.getSocketFactory()); 

Проблема заключается в том, что я получаю это исключение:

Exception : java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. 
    javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. 

EXTRA INFO1: Я могу успешно размещать на https: адрес, не делая ничего лишнего из терминала моего ноутбука, это распечатка данного соединения многословным:

== Info: Connected to cloud.someserver.com (127.0.0.1) port 443 (#0) 
== Info: TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 
== Info: Server certificate: cloud.someserver.com 
== Info: Server certificate: StartCom Class 1 Primary Intermediate Server CA 
== Info: Server certificate: StartCom Certification Authority 

EXTRA INFO2: Это распечатка я получаю от консоли, когда я выполняю "OpenSSL s_client -connect cloud.myserver.com:80":

связной (00000003) 77152: Ошибка: 140770FC: SSL процедура : SSL23_GET_SERVER_HELLO: неизвестный протокол: /BuildRoot/Library/Caches/com.apple.xbs/Sources/OpenSSL098/OpenSSL098-59/src/ssl/s23_clnt.c: 618: Joshs-MacBook-Pro: ~ JoshDBS $ openssl s_client - connect cloud.myserver.com:8080 connect: Connection failed connect: errno = 61 Joshs-MacBook-Pro: ~ JoshDBS $ openssl s_client -connect cloud.myserver.com:81 connect: Connection failed подключения: ERRNO = 61 Joshs-MacBook-Pro: ~ JoshDBS $ OpenSSL s_client -connect cloud.myserver.com:80

CONNECTED(00000003) 
77155:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:/BuildRoot/Library/Caches/com.apple.xbs/Sources/OpenSSL098/OpenSSL098-59/src/ssl/s23_clnt.c:618: 
Joshs-MacBook-Pro:~ JoshDBS$ openssl s_client -connect cloud.myserver.com:443 
CONNECTED(00000003) 
depth=0 /C=ES/CN=cloud.myserver.com/[email protected] 
verify error:num=20:unable to get local issuer certificate 
verify return:1 
depth=0 /C=ES/CN=cloud.myserver.com/[email protected] 
verify error:num=27:certificate not trusted 
verify return:1 
depth=0 /C=ES/CN=cloud.myserver.com/[email protected] 
verify error:num=21:unable to verify the first certificate 
verify return:1 
--- 
Certificate chain 
0 s:/C=ES/CN=cloud.myserver.com/[email protected] 
    i:/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Class 1 Primary Intermediate Server CA 
--- 
Server certificate 
-----BEGIN CERTIFICATE----- 
MIIGQTCCBSmgAwIBAgIHBcg1dAivUzANBgkqhkiG9w0BAQsFADCBjDELMAkGA1UE 
(Lots of alphanumeric characters here) 
-----END CERTIFICATE----- 
subject=/C=ES/CN=cloud.myserver.com/[email protected] 
issuer=/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Class 1 Primary Intermediate Server CA 
--- 
No client certificate CA names sent 
--- 
SSL handshake has read 2304 bytes and written 328 bytes 
--- 
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA 
Server public key is 2048 bit 
Secure Renegotiation IS supported 
Compression: NONE 
Expansion: NONE 
SSL-Session: 
    Protocol : TLSv1 
    Cipher : DHE-RSA-AES256-SHA 
    Session-ID: B67EED30382BE22A81F86884646480E967662A1559CA791B1B4DA8F06EDC 
    Session-ID-ctx: 
    Master-Key: DE439EC4BEA0AA6E9B15836AD33DB46105D1A27544E0570E8EFF50D3BEF8F0725FC1A34343495D5ADAE192DD09838 
    Key-Arg : None 
    Start Time: 1450886131 
    Timeout : 300 (sec) 
    Verify return code: 21 (unable to verify the first certificate) 
--- 
closed 

Какое значение мне нужно назначить вместо хранилище этих трех точек (...) и откуда его получить?

Как я могу получить данные POST с помощью HttpsURLConnection? (Я уже могу отправлять сообщения простой HTTP: URL-адреса)

ответ

2

Попробуйте следующее:

String keyStoreType = KeyStore.getDefaultType(); 
KeyStore keyStore = KeyStore.getInstance(keyStoreType); 

Кроме того, что URL вы пытаетесь получить доступ? Возможно, это не относится к хранилищу данных ActiveServer от доверенных сертификатов, что означает, что вам придется немного поработать над добавлением сертификата в DataStore самостоятельно.

Сообщите мне, если вы все еще застряли, и мы продолжим отладку вашей проблемы.

+0

Я попробовал ваше предложение и получил тот же результат, я также добавил дополнительную информацию на вопрос, который может оказаться полезным. Я пытаюсь подключиться к адресу https url разработки, который, безусловно, не находится в хранилище данных Android. – Josh

+0

Попробуйте следующее: openssl s_client -connect host: порт. Получаете ли вы сертификат с сервера? – C2H6O

+0

Привет, @ C2H6O Я повторил вопрос после праздников, я добавил информацию о сертификате, который я возвращаюсь к вопросу. Я ничего не настраивал на своем ноутбуке, терминал просто принимает сертификат с помощью команды, которую вы мне сказали. Думаю, мне нужно сделать что-то еще в Android. – Josh

0

Попробуйте отключить проверку SSL-сертификата as explained here. Рекомендуется только для целей разработки, а не в производственной среде. в производственной среде вы должны установить удобные сертификаты.

TrustManager[] trustAllCerts = new TrustManager[] { 
     new X509TrustManager() { 
      public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
      return null; 
      } 
      @Override 
      public void checkClientTrusted(X509Certificate[] arg0, String arg1) 
      throws CertificateException {} 

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

      } 
    }; 

    SSLContext sc=null; 
    try { 
    sc = SSLContext.getInstance("SSL"); 
    } catch (NoSuchAlgorithmException e) { 
    e.printStackTrace(); 
    } 
    try { 
    sc.init(null, trustAllCerts, new java.security.SecureRandom()); 
    } catch (KeyManagementException e) { 
    e.printStackTrace(); 
    } 
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); 

    // Create all-trusting host name verifier 
    HostnameVerifier validHosts = new HostnameVerifier() { 
    @Override 
    public boolean verify(String arg0, SSLSession arg1) { 
    return true; 
    } 
    }; 
    // All hosts will be valid 
    HttpsURLConnection.setDefaultHostnameVerifier(validHosts); 
Смежные вопросы