Сертификат доверяет ПК, но не 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, он говорит мне, что сертификат не является надежным. Что я могу сделать?
14 ответов:
в файле сертификата может отсутствовать промежуточный сертификат. Если вы уже посетили другой сайт, который имеет тот же сертификат продавца, промежуточный сертификат запоминается в вашем браузере. Это не может - или даже лучше - не будет иметь место с каждым посетителем вашего сайта. Чтобы устранить недостающий промежуточный сертификат в соединении 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-my-own-bundle-file-from-crt-files
в зависимости от того, какой веб-сервер вы используете, вам нужно будет указать все сертификаты (сертификат домена, промежуточный и корневой) или объединить их в один (например, для Nginx) в порядке:
- сертификат домена
- промежуточный сертификат
- корневой сертификат
простой способ сделать это в терминале SSH, введя:
cat domainfile intermediatefile rootfile > targetfile
тестовый инструмент сертификата
если у вас возникли дополнительные проблемы или вы не уверены в правильности сертификата, попробуйте онлайн-инструмент для проверки Вашего SSL-сертификата. Для пример:https://www.networking4all.com/en/support/tools/site + проверка/
поддержка SNI для android 2.2 и ниже
обратите внимание, что android 2.2 (и, вероятно, более старые) не поддерживают SNI, что позволяет нескольким сертификатам SSL для разных имен хостов работать без проблем на одном IP-адресе. Спасибо @technyquist за предоставление этой информации. Пожалуйста, просмотрите это так вопрос о SNI для получения дополнительной информации по этому вопросу.
вы должны создать ЭЛТ пакет, то это будет хорошо. Вы получите три файла crt. Используйте их все! Если вы только использовали домен.crt тогда будет предупреждение на android, но не на ПК.
Я нахожусь на nginx. Я открыл имя_домена.ЭЛТ, а затем открыл positivesslca2.ЭЛТ, выберите все и скопируйте в конец имя_домена.ЭЛТ. Затем откройте AddTrustExternalCARoot.ЭЛТ, скопируйте в конец имя_домена.опять ЭЛТ. Затем установите доменное имя.ЭЛТ
работает хорошо.
добавление этого здесь, так как это может помочь кому-то. У меня были проблемы с Android, показывая всплывающее окно и недопустимую ошибку сертификата.
у нас есть сертификат Comodo Extended Validation, и мы получили zip-файл, содержащий 4 файла:
- AddTrustExternalCARoot.ЭЛТ
- COMODORSAAddTrustCA.ЭЛТ
- COMODORSAExtendedValidationSecureserverca.ЭЛТ
- www_mydomain_com.ЭЛТ
Я объединил их вместе все на одной линии вот так:
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
С Comodo PositiveSSL мы получили 4 файла.
- AddTrustExternalCARoot.ЭЛТ
- COMODORSAAddTrustCA.ЭЛТ
- COMODORSADomainValidationSecureServerca.ЭЛТ
- our_domain имя.ЭЛТ
когда мы следовали инструкциям на сайте comodo - мы получим сообщение об ошибке, что наш сертификат отсутствует промежуточный файл сертификата.
в основном синтаксис
cat our_domain.crt COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt AddTrustExternalCARoot.crt > domain-ssl_bundle.crt
Я недавно Рен в этой проблеме с Commodo cert я купил на ssls.com и у меня было 3 файла:
доменное имя. ca-bundle доменное имя.ЭЛТ и домен-имя.p7b
мне пришлось настроить его на Nginx, и это команда, которую я выполнил:
cat domain-name.ca-bundle domain-name.crt > commodo-ssl-bundle.crt
затем я использовал commodo-ssl-bundle.crt внутри конфигурационного файла Nginx и работает как шарм.
У меня была та же проблема, и моей проблемой было устройство, не имеющее правильной даты и времени. Как только я исправил, что сертификат является доверенным.
я столкнулся с этой же проблемой в Apache 2.2, когда я пытался использовать несколько
SSLCertificateChainFile
директивы для каждого промежуточного сертификата; вместо этого мне нужно было объединить все три в один файл. Исходя из GoDaddy, где они сделали это для меня в качестве "связки", этот дополнительный шаг был новым для меня, но перечитывание документация Apache сделал это очевидным.стоит отметить, что эта директива устарело с Apache 2.4.8 так как теперь вы можете объедините все промежуточные продукты с фактическим сертификатом.
Я надеюсь, что я не слишком поздно, это решение здесь работало для меня, я использую Comodo SSL, вышеуказанные решения кажутся недействительными с течением времени, мой сайт lifetanstic.co.ke
вместо обращения в Службу поддержки Comodo и получения файла пакета CA вы можете сделать следующее:
когда вы получаете свой новый сертификат SSL от Comodo (по почте), у них есть прикрепленный zip-файл. Вам нужно распаковать zip-файл и откройте следующие файлы в текстовом редакторе, например Блокнот:
AddTrustExternalCARoot.crt COMODORSAAddTrustCA.crt COMODORSADomainValidationSecureServerCA.crt
затем скопируйте текст каждого ".crt "файл и вставьте тексты выше друг друга в поле" пакет Центра сертификации (необязательно)".
после этого просто добавьте сертификат SSL, как обычно, в поле" сертификат "и нажмите кнопку" Autofil by Certificate "и нажмите"Установить".
С 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;
у меня была та же проблема. Другой способ генерировать правильный .crt файл выглядит так:
иногда вы получаете .PEM-файл со всей цепочкой сертификатов внутри. Файл может выглядеть следующим образом....
-----BEGIN RSA PRIVATE KEY----- blablablabase64private... -----END RSA PRIVATE KEY----- -----BEGIN CERTIFICATE----- blablablabase64CRT1... -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- blablablabase64CRT2... -----END CERTIFICATE----- ...
Если вы удалите весь
private key
раздел, у вас будет действительная цепочка.ЭЛТ
У меня была та же ошибка, потому что я не выдал сертификат Let's Encrypt для www.my-domain.com, только для my-domain.com
выдача также для www. и настройка vhost, чтобы загрузить сертификаты для ВСП.my-domain.com перед перенаправлением на https://my-domain.com сделал свое дело.
убедитесь, что вы также используете свой промежуточный ЭЛТ (.ЭЛТ-файл с пакетом.. некоторые поставщики также называют его bundle или CA certificate). затем в вашем ssl.conf,
SSLCertificateFile </path/for/actual/certificate> SSLCACertificateFile </path/for/actual/intermediate_certificate>
затем перезапустите веб-сервер: ex для использования apache:
sudo service httpd restart
может быть, вам не хватает сертификата на вашем устройстве.
попробуйте посмотреть на этот ответ: Как установить доверенный сертификат CA на Android-устройстве? чтобы узнать, как установить CA на вашем собственном устройстве.
У меня была похожая проблема и я написал подробную статью об этом. Если у кого-то есть такая же проблема, не стесняйтесь читать мою статью.
https://developer-blog.net/administration/ssl-zertifikat-installieren/
это подробное описание проблемы на немецком языке.