Androidに接続するためにHttpClientを使用しています https://someUrl.com/somePath 。問題は、サイトの証明書が* .someUrl.com用であるということです。 、someUrl.comではないので、SSLExceptionが発生します。サイトの一部で問題が発生します。はい、しかし、修正できない限り、行き詰まります。HttpClientにリラックスして証明書を受け入れる方法はありますか?
これは私の(編集された)解決策です:
class MyVerifier extends AbstractVerifier {
private final X509HostnameVerifier delegate;
public MyVerifier(final X509HostnameVerifier delegate) {
this.delegate = delegate;
}
@Override
public void verify(String Host, String[] cns, String[] subjectAlts)
throws SSLException {
boolean ok = false;
try {
delegate.verify(Host, cns, subjectAlts);
} catch (SSLException e) {
for (String cn : cns) {
if (cn.startsWith("*.")) {
try {
delegate.verify(Host, new String[] {
cn.substring(2) }, subjectAlts);
ok = true;
} catch (Exception e1) { }
}
}
if(!ok) throw e;
}
}
}
public DefaultHttpClient getTolerantClient() {
DefaultHttpClient client = new DefaultHttpClient();
SSLSocketFactory sslSocketFactory = (SSLSocketFactory) client
.getConnectionManager().getSchemeRegistry().getScheme("https")
.getSocketFactory();
final X509HostnameVerifier delegate = sslSocketFactory.getHostnameVerifier();
if(!(delegate instanceof MyVerifier)) {
sslSocketFactory.setHostnameVerifier(new MyVerifier(delegate));
}
return client;
}
ワイルドカードドメインがない限り、デフォルトの動作を変更しないという利点があります。その場合、2つの部分のドメイン(someUrl.comなど)が証明書の一部であるかのように再検証されます。そうでない場合、元の例外が再スローされます。つまり、本当に無効な証明書は引き続き失敗します。
AndroidのBouncyCastleは古すぎて、ワイルドカード証明書を認識しません。
独自のX509TrustManagerを記述して、ワイルドカードをチェックできます。
または、リスクを受け入れることができる場合は、証明書チェックを完全に無効にすることができます。この質問を参照してください、
webViewを使用する場合は、
webview.clearSslPreferences();
sSLエラーを無視する
必要な場合は*.someUrl.com
、それならあなたはそれを与えることができるようですwww.someUrl.com/somePath
の代わりに someUrl.com/somePath
。