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

С сегодняшнего утра моему сертификату больше не доверяют на 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, он скажет мне, что сертификат не доверен. Что я могу сделать?

Ответ 1

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

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

У меня когда-то была проблема с промежуточным сертификатом (с Commodo тоже), и мне пришлось объединить свой собственный файл cert с промежуточным 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-my-own-bundle-file-from-crt-files

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

  • сертификат домена
  • промежуточный сертификат
  • корневой сертификат

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

cat domainfile intermediatefile rootfile > targetfile

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

Если вы столкнулись с дополнительными проблемами или не уверены в правильности сертификата, попробуйте онлайн-инструмент для проверки вашего SSL-сертификата. Например: https://www.networking4all.com/en/support/tools/site+check/

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

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

Ответ 2

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

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

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

Ответ 3

Добавление этого здесь, поскольку это может помочь кому-то. У меня были проблемы с 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

Ответ 4

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

  • AddTrustExternalCARoot.crt
  • COMODORSAAddTrustCA.crt
  • COMODORSADomainValidationSecureServerCA.crt
  • our_domain.crt

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

В принципе синтаксис

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

Ответ 5

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

domain-name.ca-bundle domain-name.crt и domain-name.p7b

Мне нужно было настроить его на Nginx, и это команда, которую я запускал:

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

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

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

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

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

AddTrustExternalCARoot.crt
COMODORSAAddTrustCA.crt
COMODORSADomainValidationSecureServerCA.crt

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

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

Ответ 9

С сертификатами Godaddy вы, скорее всего, будете иметь 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;

Ответ 10

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

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

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

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

Ответ 11

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

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

Ответ 12

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

SSLCertificateFile </path/for/actual/certificate>

SSLCACertificateFile </path/for/actual/intermediate_certificate>

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

sudo service httpd restart

Ответ 14

У меня была аналогичная проблема, и я написал подробную статью об этом. Если у кого-то такая же проблема, не стесняйтесь читать мою статью.

https://developer-blog.net/administration/ssl-zertifikat-installieren/

Это подробное описание проблемы на немецком языке.