2017-09-20 1 views
0

J'ai sur mes mains une application Android, ciblant le niveau SDK 21. Là, j'essaie de me connecter à AWS' alive.json en utilisant java.net.HttpURLConnection.connexion Android HTTPS à AWS/alive.json se bloque

La chaîne de confiance ressemble à ceci:

  • Baltimore CyberTrust Root (confiance par périphérique dev)
  • DigiCert Baltimore CA-2 G2 (périphérique dev fait confiance DigiCert Assured ID racine G2, Global Root CA, Global racine G2 entre autres DigiCerts - est-ce suffisant)
  • AWS (* .us-est-etc.amazonaws.com)

Mon AndroidManifest.xml propose <uses-permission android:name="android.permission.INTERNET"/>?.

Le code [se résume à] ce qui suit. Il est appelé sur un thread séparé (qui exécute les requêtes une par une - il n'y a que celui-ci pour l'instant), à partir de NDK.

// init() -- all optional 
    System.setProperty("http.keepAlive", "false"); 
    HttpURLConnection.setDefaultAllowUserInteraction(false); 

    // makeRequest(HttpRequest request) 
    URL url = new URL(request.url); 
    HttpURLConnection http = (HttpURLConnection) url.openConnection(); 
    http.setUseCaches(false); 
    http.setReadTimeout(timeoutMs); 
    http.setChunkedStreaingMode(0); // optional 
    http.setDoInput(true); 
    http.setRequestMethod("GET"); // optional 
    http.setRequestProperty("X-Correlation-ID", x); // optional 
    http.connect(); 

Maintenant, si je mets le délai d'attente à 80ms, je vais obtenir un javax.net.ssl.SSLHandshakeException: SSL handshake timed out. Au-delà de cela (800ms), il sera suspendu pour toujours à http.connect().

https://developer.android.com/training/articles/security-ssl.html#HttpsExample et l'article environnant détaille comment cela devrait être fait. Je crois comprendre que je ne devrais pas avoir besoin de certificat pour cet exercice.

Si j'en ajoute un (suivant les lignes de l'article ci-dessus), j'obtiens un javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found..

La connexion à une ressource http: // fonctionne très bien.

Qu'est-ce que je fais mal? Quelle configuration supplémentaire est nécessaire de ma part et pourquoi?

MISE À JOUR:

1, OkHttp mise en œuvre basée manifeste exactement le même comportement.

2, Certificate pinning n'a pas aidé à contourner le problème. Notez que ce n'est qu'une mesure désespérée, et non quelque chose pour la production - évidemment, nous ne voulons pas casser lorsque les certificats d'Amazon sont mis à jour.

+0

Avez-vous déjà vérifié les 3 problèmes possibles signalés sur le lien que vous avez signalé? – firegloves

+0

Il me semble que c'est la mauvaise piste et je ne devrais pas besoin de configuration SSL personnalisée. FWIW, j'ai vérifié. De la chaîne de confiance ci-dessus, j'ai tiré la conclusion que ce n'est pas # 1. J'ai cependant utilisé un certificat auto-signé (ne devrait pas avoir), ce qui pourrait causer # 2. # 3 - 'openssl s_client -connect s3.us-east-2.amazonaws.com: 443' me donne https://pastebin.com/vZcP4yjz, et Baltimore CyberTrust Root est approuvé par mon appareil. Il n'explique pas le blocage. – zyndor

+0

Avez-vous déjà utilisé les certificats de ces CA? Peut-être numéro 1 dans ce cas? "C'est peut-être parce que vous avez un certificat d'une nouvelle autorité de certification qui n'est pas encore approuvé par Android". Je ne peux pas trouver une autre raison – firegloves

Répondre

0

D'oh. Ne faites pas cela [sur Android]; utiliser http://s3.us-east-2.amazonaws.com/static-us-east/alive.json, et non https://.