Сертифікат довіряє ПК, але не 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 теж), і мені довелося поєднати свій власний файл сертифіката з проміжним ЦС, щоб працювати. Після закінчення помилок більше не виникало.

Інструкції з встановлення на веб-сервері від 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) у порядку:

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

Простий спосіб зробити це в терміналі SSH - це набрати:

cat domainfile intermediatefile rootfile > targetfile

Сертифікат тест інструмент

Якщо у вас виникнуть подальші проблеми або ви не впевнені, чи сертифікат правильний, спробуйте онлайн-інструмент для перевірки вашого сертифіката SSL. Наприклад: networking4all.com/en/ssl+certificates/quickscan

Підтримка SNI для Android 2.2 і старіших версій

Зверніть увагу, що Android 2.2 (і, можливо, старіший) не підтримує SNI, що дозволяє безліч сертифікатів SSL для різних імен хостів працювати без проблем на одній IP-адресі. Дякуємо @technyquist за надання такої інформації. Будь ласка, перегляньте це запитання щодо SNI для отримання додаткової інформації з цього питання.


+1, це спрацювало для моєї проблеми з пристроями 2.3.X, оскільки, схоже, у них проблема з порядком ланцюгової перевірки (я досить нуб, коли справа доходить до сертифікатів), і завдяки тому, що цей новий комплект має правильний порядок (за допомогою комбінації як запропонував @Luceos) працював як шарм. Дякую
Армандо

Ласкаво просимо, ми також використовуємо його регулярно. Тим більше, що він підтверджує не лише проміжний сертифікат. Щасливий, що я можу допомогти.
Luceos

посилання для comodo мертве
безликий

1
Дякую за пояснення. У мене є сертифікат Thawte, і я повинен був увійти на їх веб-сайт, натиснути "Переглянути інформацію про замовлення". В надісланому електронному листі міститься посилання, куди проміжний сертифікат можна завантажити в "Додаткові сертифікати".
Гійом Реноут

1
Це працювало для мого OpenMediaVault NAS та мого телефону, що працює під керуванням Marshmallow. Відредагував сертифікат на сервері, додав проміжні сертифікати, зберіг його та перезапустив веб-інтерфейс, і Chrome на моєму телефоні перейшов від "видавця, якому не довіряють", до товстого і задоволеного сертифікатом. Дякую!
Doktor J

19

Ви повинні створити пакет crt, тоді це буде добре. Ви отримаєте три файли crt. Використовуйте їх усі! Якщо ви використовували лише domain.crt, тоді на android буде попередження, але не на ПК.

Я на nginx. Я відкрив domain_name.crt, а потім відкрив positivesslca2.crt, виберіть все і скопіюйте в кінець domain_name.crt. Потім відкрийте AddTrustExternalCARoot.crt, знову скопіюйте в кінець domain_name.crt. Потім встановіть domain_name.crt

працює добре.


Це схоже на рішення, яке я шукаю, але воно все ще не працює для мене. Я також на nginx із сертифікатом godaddy. godaddy має 3 сертифікати: domain.crt, intermediate.crt та bundle.crt. Чи знаєте ви, який правильний порядок відповідно до вашої відповіді? тобто домен> проміжний> пакет або домен> комплект> проміжний? чомусь ні те, ні інше для мене не працює.
isapir

Очевидно, bundle.crt - це об’єднаний [intermediate.crt + root.crt], що здається правильним порядком. Але я все ще не можу змусити його працювати. Будь-які ідеї? Дякую.
isapir

Вам не потрібен рут, він вже входить до складу ОС. Вам просто потрібен проміжний ланцюг. Замовлення має бути вашим + проміжним.
dalore

9

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

У нас є сертифікат розширеної перевірки Comodo, і ми отримали 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
  • our_domain.crt

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

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

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

1

Нещодавно я вирішив цю проблему з сертифікатом 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

Потім я використовував commodo-ssl-bundle.crt всередині конфігураційного файлу Nginx і працює як шарм.


1

У мене була та сама проблема, і моя проблема полягала в тому, що пристрій не мав правильної дати та часу. Одного разу я встановив, що сертифікат є довіреним.


1

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

Випуск також для www. і налаштування vhost для завантаження сертифікатів для 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 у вас, швидше за все, буде a 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

може бути, що ви втратили сертифікат на своєму пристрої.

спробуйте подивитися на цю відповідь: Як встановити сертифікат сертифікованого сертифіката на пристрій Android? щоб дізнатись, як встановити ЦС на власному пристрої.


Мій сертифікат виданий PositiveSSL CA / Comodo CA Limited, і в моїх надійних облікових даних на моєму телефоні я бачу 3 Comodo CA Limited (орган сертифікації AAA, орган сертифікації COMODO та орган сертифікації COMODO ECC)
Алексіс

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.