Сертификат доверяет ПК, но не Android


82

С сегодняшнего утра моему сертификату больше не доверяют на Android, и мое приложение больше не может подключаться:

 Catch exception while startHandshake: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
 return an invalid session with invalid cipher suite of SSL_NULL_WITH_NULL_NULL
 javax.net.ssl.SSLPeerUnverifiedException: No peer certificate
    at org.apache.harmony.xnet.provider.jsse.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:137)
    at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:93)
    at org.apache.http.conn.ssl.SSLSocketFactory.createSocket(SSLSocketFactory.java:381)
    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:165)
    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:591)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:807)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:781)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:770)

Если я попробую в Google Chrome (на ПК), проблем не возникнет, и сертификат будет доверенным, но если я попробую в браузере Chrome на Android, он сообщит мне, что сертификат не доверяет. Что я могу сделать?


Вы общаетесь с защищенным сервером, то есть (HTTPS)?
Mohsin Naeem

да, действительно, просто попробуйте ссылку, вы увидите сертификат
Alexis

Ответы:


93

Возможно, в вашем файле сертификата отсутствует промежуточный сертификат. Если вы уже посещали другой веб-сайт, у которого есть тот же продавец сертификатов, промежуточный сертификат запоминается в вашем браузере. Это может быть не так - или даже лучше - не будет происходить с каждым посетителем вашего веб-сайта. Чтобы решить проблему отсутствия промежуточного сертификата в SSL-соединении, вам нужно будет добавить промежуточный сертификат в свой собственный файл сертификата.

У GoDaddy есть информация о промежуточных сертификатах (но лучшим источником всегда является ваш поставщик сертификатов): http://support.godaddy.com/help/article/868/what-is-an-intermediate-certificate

Однажды у меня была проблема с промежуточным сертификатом (также с Commodo), и мне пришлось объединить мой собственный файл сертификата с промежуточным CA для работы. После этого ошибок больше не было.

Инструкции по установке для каждого веб-сервера от Godaddy: http://support.godaddy.com/help/article/5346/installing-an-ssl-server-instructions?locale=en

А вот список наиболее распространенных руководств по установке от самих Commodo: https://support.comodo.com/index.php?/Default/Knowledgebase/Article/View/1145/0/how-do-i-make- мой собственный-связка-файл-из-CRT-файлов

В зависимости от того, какой веб-сервер вы используете, вам необходимо указать все сертификаты (сертификат домена, промежуточный и корневой) или объединить их в один (например, для Nginx) в следующем порядке:

  1. сертификат домена
  2. промежуточный сертификат
  3. корневой сертификат

Легкий способ сделать это в терминале SSH - набрать:

cat domainfile intermediatefile rootfile > targetfile

Инструмент проверки сертификатов

Если у вас возникнут дополнительные проблемы или вы не уверены в правильности сертификата, попробуйте онлайн-инструмент для проверки вашего сертификата SSL. Например: network4all.com/en/ssl+certificates/quickscan.

Поддержка SNI для Android 2.2 и ниже

Обратите внимание, что Android 2.2 (и, возможно, более ранняя версия) не поддерживает SNI, что позволяет без проблем работать с несколькими сертификатами SSL для разных имен хостов на одном IP-адресе. Спасибо @technyquist за предоставленную информацию. Пожалуйста, просмотрите этот SO-вопрос о SNI для получения дополнительной информации по этой проблеме.


+1, это сработало для моей проблемы с устройствами 2.3.X, поскольку у них, похоже, есть проблема с порядком последовательной проверки (я довольно нуб, когда дело доходит до сертификатов), и с этим новым пакетом с правильным порядком (через комбинацию как предложил @Luceos) работал как шарм. Спасибо
Armando

Пожалуйста, мы тоже регулярно пользуемся им. Тем более, что он проверяет не только промежуточный сертификат. Рад, что смог помочь.
Luceos

ссылка для comodo мертва
gfaceless

1
Спасибо за объяснение. У меня есть сертификат Thawte, и мне пришлось войти на их веб-сайт, щелкнув «Просмотреть информацию о заказе». Отправленное электронное письмо содержит ссылку, по которой промежуточный сертификат можно загрузить в разделе «Дополнительные сертификаты».
Guillaume Renoult

1
Это сработало для моего OpenMediaVault NAS и моего телефона под управлением Marshmallow. Отредактировал сертификат на сервере, добавил промежуточные сертификаты, сохранил его и перезапустил веб-интерфейс, а Chrome на моем телефоне перешел из категории «не доверенный эмитент» на толстый и довольный сертификатом. Благодаря!
Doktor J

19

Вы должны создать пакет crt, тогда все будет хорошо. Вы получите три файла crt. Используйте их все! Если вы использовали только domain.crt, то на Android будет предупреждение, но не на ПК.

Я использую nginx. Я открыл имя_домена.crt, а затем открыл Positivesslca2.crt, выделил все и скопировал в конец имя_домена.crt. Затем откройте AddTrustExternalCARoot.crt, снова скопируйте в конец domain_name.crt. Затем установите domain_name.crt

работает хорошо.


Это похоже на решение, которое я ищу, но оно все еще не работает для меня. Я также использую nginx с сертификатом godaddy. godaddy имеет 3 сертификата: domain.crt, intermediate.crt и bundle.crt. Вы знаете, какой правильный порядок согласно вашему ответу? т.е. домен> промежуточный> пакет или домен> пакет> промежуточный? по какой-то причине у меня ни то, ни другое не работает.
isapir 06

Очевидно, bundle.crt - это конкатенированный [промежуточный.crt + root.crt], так что это кажется правильным порядком. Но я все еще не могу заставить его работать. Есть идеи? Благодарю.
isapir 06

Вам не нужен рут, он уже включен в ОС. Вам просто нужна промежуточная цепочка. Заказ должен быть ваш + промежуточный.
dalore

9

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

У нас есть сертификат Comodo Extended Validation, и мы получили zip-файл, содержащий 4 файла:

  • AddTrustExternalCARoot.crt
  • COMODORSAAddTrustCA.crt
  • COMODORSAExtendedValidationSecureServerCA.crt
  • www_mydomain_com.crt

Я объединил их в одну строку следующим образом:

cat www_mydomain_com.crt COMODORSAExtendedValidationSecureServerCA.crt COMODORSAAddTrustCA.crt AddTrustExternalCARoot.crt >www.mydomain.com.ev-ssl-bundle.crt

Затем я использовал этот файл пакета как свой ssl_certificate_keyв nginx. Вот и все, теперь работает.

Вдохновленный этой сутью: https://gist.github.com/ipedrazas/6d6c31144636d586dcc3


1
Я пробовал все другие предложенные шаги. Это сработало для меня. Благодаря!
ericbae

1
Хорошая работа, гуглил как сумасшедший, и это исправило.
Олафур Трюггвасон

Спасибо, и если кто-то еще использует Namecheap, убедитесь, что он в этом формате: cat *yourdomainname*.crt *yourdomainname*.ca-bundle > cert_chain.crt
Гарри

1

С Comodo PositiveSSL мы получили 4 файла.

  • AddTrustExternalCARoot.crt
  • COMODORSAAddTrustCA.crt
  • COMODORSADomainValidationSecureServerCA.crt
  • наш_домен.crt

Когда мы следовали инструкциям на сайте comodo, мы получали сообщение об ошибке, что в нашем сертификате отсутствовал промежуточный файл сертификата.

В основном синтаксис

cat our_domain.crt COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt  AddTrustExternalCARoot.crt > domain-ssl_bundle.crt

1

Я недавно столкнулся с этой проблемой с сертификатом Commodo, который я купил на ssls.com, и у меня было 3 файла:

имя-домена.ca-связка имя-домена.crt и имя -домена.p7b

Мне пришлось настроить его на Nginx, и я выполнил эту команду:

cat domain-name.ca-bundle domain-name.crt > commodo-ssl-bundle.crt

Затем я использовал Commodo-ssl-bundle.crt внутри конфигурационного файла Nginx и работал как шарм.


1

У меня была такая же проблема, и моя проблема заключалась в том, что на устройстве не указаны правильная дата и время. Как только я исправил, что сертификату доверяют.


1

У меня была такая же ошибка, потому что я не выдал сертификат Let's Encrypt для www .my-domain.com, только для my-domain.com

Выпускается также для www. и настройка виртуального хоста для загрузки сертификатов для www .my-domain.com перед перенаправлением на https://my-domain.com сделала свое дело.


0

Я столкнулся с той же проблемой в Apache 2.2, когда пытался использовать несколько SSLCertificateChainFileдиректив для каждого промежуточного сертификата; вместо этого мне нужно было объединить все три в один файл. Исходя из GoDaddy, где они сделали это для меня как «связку», этот дополнительный шаг был для меня новым, но повторное чтение документации Apache сделало это очевидным.

Стоит отметить, что эта директива устарела с Apache 2.4.8, поскольку теперь вы можете объединить все промежуточные звенья с фактическим сертификатом.


0

Надеюсь, я не слишком поздно, это решение сработало для меня, я использую COMODO SSL, вышеуказанные решения кажутся недействительными со временем, мой веб-сайт lifetanstic.co.ke

Вместо того, чтобы обращаться в службу поддержки Comodo и получить файл пакета CA, вы можете сделать следующее:

Когда вы получаете новый сертификат SSL от Comodo (по почте), к ним прилагается zip-файл. Вам необходимо распаковать zip-файл и открыть следующие файлы в текстовом редакторе, например в блокноте:

AddTrustExternalCARoot.crt
COMODORSAAddTrustCA.crt
COMODORSADomainValidationSecureServerCA.crt

Затем скопируйте текст каждого файла «.crt» и вставьте тексты выше друг друга в поле «Пакет центра сертификации (необязательно)».

После этого просто добавьте сертификат SSL, как обычно, в поле «Сертификат», нажмите кнопку «Автозаполнение по сертификату» и нажмите «Установить».


0

С Godaddy CERTS вы , скорее всего , будет иметь domain.key,gd_bundle_something.crt и (случайный буквенно - цифровая строка)4923hg4k23jh4.crt

Вам необходимо: cat gd_bundle_something.crt >> 4923hg4k23jh4.crt

А затем на nginx вы будете использовать

ssl                  on;
ssl_certificate      /etc/ssl/certs/4923hg4k23jh4.crt;
ssl_certificate_key  /etc/ssl/certs/domain.key;

0

У меня такая же проблема. Другой способ создать правильный файл .crt выглядит так:

Иногда вы получаете файл .PEM со всей цепочкой сертификатов внутри. Файл может выглядеть так ....

-----BEGIN RSA PRIVATE KEY-----
blablablabase64private...
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
blablablabase64CRT1...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
blablablabase64CRT2...
-----END CERTIFICATE-----
...

Если вы удалите весь private keyраздел, у вас будет действующий связанный .crt


0

Убедитесь, что вы также используете свой промежуточный crt (файл .crt с пакетом… некоторые провайдеры также называют его пакетом или сертификатом CA). затем в вашем ssl.conf,

SSLCertificateFile </path/for/actual/certificate>

SSLCACertificateFile </path/for/actual/intermediate_certificate>

затем перезапустите свой веб-сервер: ex для использования apache:

sudo service httpd restart

-1

может быть, вам не хватает сертификата на вашем устройстве.

попробуйте посмотреть на этот ответ: Как установить доверенный сертификат CA на устройство Android? чтобы узнать, как установить ЦС на собственное устройство.


Мой сертификат выпущен PositiveSSL CA / Comodo CA Limited, и в моих доверенных учетных данных на моем телефоне я вижу 3 Comodo CA Limited (центр сертификации AAA, центр сертификации COMODO и центр сертификации COMODO ECC)
Alexis

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.