Небезопасная реализация интерфейса X509TrustManager от GoogleAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Небезопасная реализация интерфейса X509TrustManager от Google

Сообщение Anonymous »

У меня есть приложение в Google Play, я получил письмо от Google, в котором говорится, что:


Ваши приложения, перечисленные в конце этого письма, используют небезопасную реализацию интерфейса X509TrustManager. В частности, реализация игнорирует все ошибки проверки сертификата SSL при установке HTTPS-соединения с удаленным хостом, тем самым делая ваше приложение уязвимым для атак «человек посередине».

Чтобы правильно обрабатывать проверку сертификата SSL, измените свой код в методе checkServerTrusted вашего пользовательского интерфейса X509TrustManager, чтобы он вызывал либо CertificateException, либо IllegalArgumentException всякий раз, когда сертификат, представленный сервером, не соответствует вашим ожиданиям.


Мое приложение использует https, моя функция checkServerTrusted() следующая:

Код: Выделить всё

 TrustManager tm = new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}

public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {

}

public X509Certificate[] getAcceptedIssuers() {
return null;
}
};
Затем я модифицирую эту функцию:

Код: Выделить всё

 TrustManager tm = new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}

public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
if (chain == null) {
throw new IllegalArgumentException("checkServerTrusted: X509Certificate array is null");
}

if (!(chain.length > 0)) {
throw new IllegalArgumentException("checkServerTrusted: X509Certificate is empty");
}

if (!(null != authType && authType.equalsIgnoreCase("RSA"))) {

throw new CertificateException("checkServerTrusted: AuthType is not RSA");
}
}

public X509Certificate[] getAcceptedIssuers() {
return null;
}
собственная SSLSocketFactory:

Код: Выделить всё

public class MySSLSocketFactory extends SSLSocketFactory {
SSLContext sslContext = SSLContext.getInstance("TLS");

public MySSLSocketFactory(KeyStore ctx) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {
super(ctx);

TrustManager tm = new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}

public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}

public X509Certificate[] getAcceptedIssuers() {
return null;
}
};

sslContext.init(null, new TrustManager[]{tm}, null);
}

@Override
public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException {
return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);
}

@Override
public Socket createSocket() throws IOException {
return sslContext.getSocketFactory().createSocket();
}


функция HttpClient:

Код: Выделить всё

private static HttpClient getHttpClient(int timeout) {
if (null == mHttpClient) {

try {
KeyStore trustStore = KeyStore.getInstance(KeyStore
.getDefaultType());
trustStore.load(null, null);
SSLSocketFactory sf = new MySSLSocketFactory(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

HttpParams params = new BasicHttpParams();

HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params,
HTTP.DEFAULT_CONTENT_CHARSET);
HttpProtocolParams.setUseExpectContinue(params, true);

ConnManagerParams.setTimeout(params, timeout);

HttpConnectionParams.setConnectionTimeout(params, timeout);

HttpConnectionParams.setSoTimeout(params, timeout);

SchemeRegistry schReg = new SchemeRegistry();
schReg.register(new Scheme("http", PlainSocketFactory
.getSocketFactory(), 80));
schReg.register(new Scheme("https", sf, 443));

ClientConnectionManager conManager = new ThreadSafeClientConnManager(
params, schReg);

mHttpClient = new DefaultHttpClient(conManager, params);
} catch (Exception e) {
e.printStackTrace();
return new DefaultHttpClient();
}
}
return mHttpClient;
}
Но я не очень хорошо разбираюсь в этом, я просто изменяю свой код в соответствии с тем, что сказано в электронном письме. Думаю, мне не понравилась эта проблема. О чем это предупреждение? Как это решить?

Подробнее здесь: https://stackoverflow.com/questions/355 ... rom-google
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»