1

Я пытаюсь получить доступ к своему серверу с помощью двух сертификатов goDaddy, перечисленных в моей конечной точке. Три сертификата в стеке: My cert> Go Daddy Secure Certificate Authority -G2> Go Daddy Root Certificate Authority - G2. Я загрузил как защищенные, так и корневые сертификаты из Go Daddy Repository и теперь добавил оба в папку с исходными ресурсами приложения Android. Даже с обоими там она все еще дает мне эту ошибкуHttps Имя хоста не проверено с использованием сертификатов goDaddy

javax.net.ssl.SSLPeerUnverifiedException: Hostname not verified: 

Я не знаю, что я должен делать дальше. Я пробовал много комбинаций, поэтому я думаю, что мне нужен другой способ сделать это.

Вот что я до сих пор; Мой код HttpsClient;

public class MyHttpsGet extends AsyncTask<String, Void, String> { 

Context context; 

int cert; 
int interCert; 
boolean allowHost; 
private String username; 
private String password; 

//this is used if you need a password and username 
//mainly for logins to a webserver 
public MyHttpsGet(String username, String password, Context context, int cert, int intermedCert) 
{ 
    this.context = context; 
    this.cert = cert; 
    this.interCert = intermedCert; 
    this.username = username; 
    this.password = password; 

} 

//used for image downloading 
public MyHttpsGet(){} 

@Override 
protected String doInBackground(String... params) { 
    String url = params[0]; 
    return httpsDownloadData(url, context, cert, interCert); 
} 

public String httpsDownloadData (String urlString, Context context, int certRawResId, int certIntermedResId) 
{ 
    String respone = null; 

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


     // 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); 
     if (username != null) { 
      Authenticator.setDefault(new Authenticator() { 
       @Override 
       protected PasswordAuthentication getPasswordAuthentication() { 
        return new PasswordAuthentication(username, password.toCharArray()); 
       } 
      }); 
     } 
     HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection(); 
     urlConnection.setSSLSocketFactory(sslContext.getSocketFactory()); 


     int statusCode = urlConnection.getResponseCode(); 
     Log.d("Status code: ", Integer.toString(statusCode)); 


     InputStream inputStream = urlConnection.getInputStream(); 
     if (inputStream != null) { 
      respone = streamToString(inputStream); 
      inputStream.close(); 
     } 

    }catch (IOException e) { 
     e.printStackTrace(); 
    } catch (NoSuchAlgorithmException e) { 
     e.printStackTrace(); 
    } catch (KeyStoreException e) { 
     e.printStackTrace(); 
    } catch (KeyManagementException e) { 
     e.printStackTrace(); 
    } 

    Log.d("MyHttps Respones: ", respone); 
    return respone; 
} 


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

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



    } catch (CertificateException e) { 
     e.printStackTrace(); 
    } catch (NoSuchAlgorithmException e) { 
     e.printStackTrace(); 
    } catch (KeyStoreException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return keyStore; 

} 

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

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

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

    return ca; 
} 

//this is used for downloading strings from an http or https connection 
private String streamToString(InputStream is) throws IOException { 

    StringBuilder sb = new StringBuilder(); 
    BufferedReader rd = new BufferedReader(new InputStreamReader(is)); 
    String line; 
    while ((line = rd.readLine()) != null) { 
     sb.append(line); 
    } 

    return sb.toString(); 
} 


} 

А вот как я называю его/использовать:

MyHttpsGet task = new MyHttpsGet(username, password,myContext, R.raw.gdroot_g2, R.raw.gdintermed); 
     try { 
      myJson = task.execute(myUrl).get(); 
      Log.d("Json: " , myJson); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } catch (ExecutionException e) { 
      e.printStackTrace(); 
     } 
     new runningMan().execute(); 

Спасибо за любую помощь в этом.

Вот фотография моего Cert Chain enter image description here

+0

Какой веб-сервер вы используете? вы связали все корневые сертификаты на стороне сервера? – Junaid

ответ

1

сообщение об ошибке говорит apivitacrm.elasticbeanstalk.com, но затем погаснуть подстановочное имя в сертификате. Зачем?

Ну, независимо от того, что это такое, похоже, что он начинается с a, поэтому он определенно не является подстановочным сертификатом *.elasticbeanstalk.com.

Это значит, что сообщение было послано верно. Сертификат не относится к указанному доменному имени.

Даже если это подстановочный знак *.apivitacrm.elasticbeanstalk.com (тем не менее, для этого не слишком широкий экран), он все равно не будет соответствовать apivitacrm.elasticbeanstalk.com, так как он соответствует только поддоменам.

 Смежные вопросы

  • Нет связанных вопросов^_^