Ошибка: имя не обрабатывается для самозаверяющих SSL-сертификатов на Android
============================================================================

Я пытаюсь получить доступ к своему веб-приложению, защищенному с помощью SSL, из Android 2.3.4 с помощью встроенного браузера.

Сертификат сервера - это самозаверяющий сертификат, который я создал с помощьюMAKECERT и установлен на сервере.
Когда я пытаюсь получить доступ к странице, я получаю сообщение об ошибке из браузера`The name of the site does not match name on the certificate`. 

Я проверил, и адрес сервера точно совпадает с общим именем моего сертификата (на самом деле это просто IP-адрес).

Сообщение не появляется, когда я пытаюсь получить доступ на устройстве Android к другим веб-сайтам, защищенным самозаверяющими сертификатами.

Если я получаю доступ к той же странице с помощью IE или Chrome на рабочем столе - за исключением сообщения о правах подписи - я не получаю предупреждений, и после установки сертификата в доверенный корневой центр сертификации этот сертификат плавно принимается браузером.

Должен ли я считать, что сообщение фактически является отклонением самоподписанного сертификата Android?

Я немного озадачен этим.

Я попытался установить сертификат в хранилище учетных данных, но это не улучшило ситуацию. и теперь я понятия не имею, что я мог бы попробовать дальше.

Вопросы: Есть ли какая-то особая вещь, которой я должен следовать при создании самоподписанного сертификата, приемлемого для Android? Кому-нибудь удалось получить самоподписанные сертификаты, принятые Android без этого предупреждения?

Что еще я мог попробовать?

**-UPDATE-**
Ответ Бруно направил меня в правильном направлении, поэтому мне удалось сделать один шаг вперед: я переделал сертификат, добавив SAN (пришлось отказаться`MAKECERT` за**`OpenSSL`**следуя туда[инструкции от Энди Арисменди](https://andyarismendi.blogspot.in/2011/09/creating-certificates-with-sans-using.html)).

Теперь сообщение отправлено, но я заблокирован в «Центре сертификации не доверенным». вопрос уже обсуждался[в этом так посте](https://stackoverflow.com/questions/4461360/how-to-install-trusted-ca-certificate-on-android-device), так что я все еще работаю над поиском окончательного решения моей проблемы - без предупреждения в браузере Android.

I have verified and the server address is exactly maching the Common
 Name of my certificate (it is actually just an IP address).

Средство проверки имени хоста Android более строго соответствует[RFC 2818](https://tools.ietf.org/html/rfc2818#section-3.1) чем некоторые браузеры. Согласно спецификации, если используется IP-адрес, он должен быть в записи Subject Alternative NameIP address type: not в записи SAN типа DNS или в CN:

If a subjectAltName extension of type dNSName is present, that MUST be used as the identity. Otherwise, the (most specific) Common
 Name field in the Subject field of the certificate MUST be used.
 Although the use of the Common Name is existing practice, it is
 deprecated and Certification Authorities are encouraged to use the
 dNSName instead.

[...]

In some cases, the URI is specified as an IP address rather than a hostname. In this case, the iPAddress subjectAltName must be present
 in the certificate and must exactly match the IP in the URI.

Проще всего было бы использовать имя хоста. (Использование IP-адресов в сертификатах никогда не бывает практичным.) В качестве альтернативы создайте сертификат с записью IP-адреса SAN. (Вы можете быть заинтересованы в[этот](https://stackoverflow.com/a/8444863/372643).)



so I am still working to find a final solution to my issue - not having any warning popping up on the Android browse

Николай Еленков рассказал вам, почему вы не можете сохранить сертификат в доверенном магазине на Android. Это недавно изменилось, но не помогает со старыми клиентами Android. Для краткой истории Android Keychain и Keystore см.[Есть ли системные хранилища сертификатов на Android?](https://stackoverflow.com/questions/21728577/are-there-any-system-certificates-storages-on-android) (это относится к двум постам Николая).

Поскольку вы работаете в браузере Android, вам необходимо использовать центр сертификации, который уже присутствует в магазине Android. Чтобы получить сертификат сервера от уже доверенного ЦС, попробуйте[StartCom](http://www.startcom.org/), StartCom предлагает бесплатные сертификаты класса 1, и их корень пользуется доверием в большинстве мобильных и настольных браузеров. (Имейте в виду, что они взимают плату за отзыв, если это необходимо).

Для полноты, если вы написали клиент самостоятельно, то вы бы предоставили`X509TrustManager` и переопределить`checkServerTrusted` принять ваш сертификат. Это не потребует какого-либо взаимодействия с хранилищем ключей, связкой ключей или внешними ЦС. Но у вас нет такой опции, потому что вы не написали браузер.



Во-первых, хранилище учетных данных в Android 2.x предназначено только для приложений VPN и WiFi, браузер его не видит. Вы не можете установить свой собственный сертификат в хранилище доверенных сертификатов (если у вас нет рутованного устройства).

Являетесь ли вы нашим веб-приложением с общедоступным IP-адресом или локальным, к которому вы подключаетесь через WiFi? Возможно, вы захотите посмотреть на вывод logcat, там могут быть некоторые предупреждения, которые подскажут вам. Также попробуйте с другого устройства и / или эмулятора (другая версия Android, если это возможно) и сравните сообщения / поведение.