Android HttpClient-Nazwa hosta w certyfikacie nie pasowała!= < * . example.com>
Używam HttpClient na Androidzie, aby połączyć się z https://someUrl.com/somePath . problem polega na tym, że certyfikat strony jest dla *.someUrl.com, nie someUrl.com, więc dostaję SSLException. Kiepsko ze strony, tak, ale jeśli nie uda mi się go naprawić, utknąłem. Czy istnieje sposób, w jaki mogę uzyskać HttpClient, aby się zrelaksować i zaakceptować certyfikat?
4 answers
To jest moje (edytowane) rozwiązanie:
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;
}
Ma tę zaletę, że nie zmienia domyślnego zachowania, chyba że istnieje domena wieloznaczna, a w takim przypadku rewaliduje się tak, jakby domena dwuczęściowa (np. someUrl.com) były częścią certyfikatu, w przeciwnym razie pierwotny wyjątek jest retrospektywny. Oznacza to, że naprawdę nieważne Cert nadal zawiedzie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-02 13:39:57
BouncyCastle na Androidzie jest za stary i nie rozpoznaje certyfikatu wildcard.
Możesz napisać własny menedżer X509TrustManager, aby sprawdzić, czy nie ma symboli wieloznacznych.
LUB możesz całkowicie wyłączyć sprawdzanie certyfikatu, jeśli akceptujesz ryzyko. Zobacz to pytanie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:34
Jeśli chce *.someUrl.com
, to wydaje się, że możesz po prostu dać www.someUrl.com/somePath
zamiast someUrl.com/somePath
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-28 19:59:17
Jeśli używasz WebView wystarczy zadzwonić
webview.clearSslPreferences();
Aby zignorować błędy SSL
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-07 15:17:09