私はサードパーティのサイトから(オフラインで閲覧するために)ドキュメントをダウンロードするアプリを持っています。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>
API 24をターゲットにしていると思います。API 24を対象にすると、ネットワークセキュリティに関するいくつかの変更があります。簡単な回避策はAPI 23を対象としていると思います。 –
サイトへの接続を実行するコードを虚偽の暗号で掲示できますか? –
Exchange 2007サーバーで全く同じ問題が発生しています。あなたは最後に解決策を見つけましたか? –