2016-10-07 18 views
1

私はサードパーティのサイトから(オフラインで閲覧するために)ドキュメントをダウンロードするアプリを持っています。Android NougatでSSLHandshakeExceptionをデバッグするのに助けが必要

標準のHttpUrlConnectionを使用しています。

それは魅力のように働いていたが、ヌガーにアップグレードするので、サイトの一つは、他の人が正常に動作している非常に一貫性のあるSSLHandshakeExceptionを生成します。

は、私は新しいアプリ証明書、運を使用しようとしています。 私は "trust all certs" TrustManagerの古いトリックを試しました。運がない。 TrustManager idはクエリでもありません。

私は、このサーバがかなり古い暗号を使用していることに気づいたのに。

... 
New, TLSv1/SSLv3, Cipher is RC4-MD5 
Server public key is 2048 bit 
Secure Renegotiation IS NOT supported 
Compression: NONE 
Expansion: NONE 
SSL-Session: 
Protocol : TLSv1 
Cipher : RC4-MD5 
... 

これは私の不幸の原因になることがありますか、それが私の接続にこの暗号を追加するにはどうすればいいですか?

Thxを

編集1:アプリがSDK 22をターゲットと同様API 22に対してコンパイルされ

編集2: コードが「強制」CAでテストするビットをハッキングされています(ビルドサイトの証明書と一緒に)また、 "trust all"トラストマネージャでもテストすることができます。 使用中は、「すべてを信頼する」マネージャーは決して使用されないことに注意してください。

SSLContext sslContext = null; 

if (testWitCa) { 

    Certificate ca = null; 
    try { 
     ca = cf.generateCertificate(caInput); 
     Log.v(this, "ca = " + ((X509Certificate) ca).getSubjectDN()); 
    } finally { 
     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"); 
    sslContext.init(null, tmf.getTrustManagers(), null); 

} else { 

    final TrustManager[] trustAllCerts = new TrustManager[] { 
      new X509TrustManager() { 
       @Override 
       public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException { 
        Log.v(FileDownloader.this, "Checking client with %s", authType); 
       } 

       @Override 
       public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException { 
        Log.v(FileDownloader.this, "Checking server with %s", authType); 
       } 

       @Override 
       public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
        return new java.security.cert.X509Certificate[]{}; 
       } 
      } 
    }; 

    sslContext = SSLContext.getInstance("TLS"); 
    sslContext.init(null, trustAllCerts, null); 
} 

URL url = new URL(fromUrl); 
HttpURLConnection httpConn; 

httpConn = (HttpsURLConnection) url.openConnection(); 

if (sslContext != null) { 
    ((HttpsURLConnection) httpConn).setSSLSocketFactory(sslContext.getSocketFactory()); 
} 

responseCode = httpConn.getResponseCode(); 

私も(サイトのルートCA Thawte社のG3)次のセキュリティ設定ファイルを使用して試してみました:ヌガーに更新ネクサス6に

<?xml version="1.0" encoding="utf-8"?> 
<network-security-config> 
    <base-config> 
     <trust-anchors> 
      <certificates src="@raw/site_ca"/> 
      <certificates src="@raw/thawte_g3_ca"/> 
      <certificates src="system"/> 
     </trust-anchors> 
    </base-config> 
</network-security-config> 
+0

API 24をターゲットにしていると思います。API 24を対象にすると、ネットワークセキュリティに関するいくつかの変更があります。簡単な回避策はAPI 23を対象としていると思います。 –

+0

サイトへの接続を実行するコードを虚偽の暗号で掲示できますか? –

+0

Exchange 2007サーバーで全く同じ問題が発生しています。あなたは最後に解決策を見つけましたか? –

答えて

1

同じことを。 私のアプリケーションはうまくいきましたが、今はもう動作しません。

Iは、代替libary(OkHttp)を使用して試みたが、それは同じ結果に終わります。 javax.net.ssl.SSLHandshakeException:接続がピアによって閉じられました

このアプリケーションは他のサーバーに対して動作しますが、この特定のものではありません(あなたと同じ暗号化パラメータ)。古いアンドロイド(6以下)の

同じアプリが素晴らしい作品。 古いバージョン用にビルドするかどうかは関係ありません。これは、SSLスタックに変更された7

何かにcrashs。

よろしくお願いいたします。

+0

うん、これはバマーです...サイドノートでは、Android HttpUrlConnectionはOkhttpに基づいているので、これはあなたに同じ結果をもたらすのは普通です。 – jmc34

0

Android暗号化ライブラリを使用して解決します。

HttpUrlConnection connection = NetCipher.getHttpsURLConnection(url); 

Gradleの依存関係

compile 'info.guardianproject.netcipher:netcipher:1.2' 
0

Androidのは、彼らがOpenSSLライブラリという名前の以前のバージョンで使用していたそのSSLライブラリを変更します。しかし、ヌーガットでは、彼らはopensslをboringsslという名前の独自のライブラリに置き換えました。あなたが問題を抱えているということが気になるかもしれません。

関連する問題