Android WebView «Доверительная привязка для пути сертификации не найдена» для сертификата LetsEncrypt - PullRequest
0 голосов
/ 07 января 2020

У меня есть веб-сайт, обслуживаемый по SSL с node.js. Когда я захожу на сайт через веб-браузер (как на рабочем столе, и Android). все в порядке - появляется замок, указывающий, что сайт безопасен, когда я проверяю сертификаты, и все выглядит нормально. Это должно означать, что сервер настроен правильно, верно?

Однако, когда я пытаюсь использовать Android WebView для того же сайта, страница не загружается - я даже не вижу запроса для веб-страницы в моих журналах. Andr, после ослабления фильтра в logcat, я заметил это сообщение:

I/X509Util: Failed to validate the certificate chain, error: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.

При небольшом исследовании этого предположения было высказано предположение, что это ошибка конфигурации на сервере - что некоторая часть сертификата не ' т установлен правильно. Я протестировал сайт с помощью инструмента анализа SSL и обнаружил следующее:

Сертификат TLS не является доверенным

Сертификат не подписан доверенным органом (проверка в хранилище Mozilla root ). Если вы купили сертификат в доверенном органе, вам, вероятно, просто нужно установить один или несколько промежуточных сертификатов.

Сертификат получен от LetsEncrypt, который по умолчанию помещает в каталог для сайта четыре файла: privkey.pem, cert.pem, chain.pem и fullchain.pem. Я использую следующий код в node.js для загрузки всего:

tls.createSecureContext({
        key: fs.readFileSync(dir+"/privkey.pem", "utf8"),
        cert: fs.readFileSync(dir+"/cert.pem", "utf8")//,
        ca: fs.readFileSync(dir+"/chain.pem","utf8")
    })

После прочтения документации по функции createSecureContext я думаю, что соответствующие файлы PEM, сгенерированные LetsEncrypt, являются правильными. В частности, я понимаю, что параметр ca, указывающий на файл chain.pem, позволяет отображать промежуточные CA, для которых Android требуется . Тем не менее, просто для примера, я также попытался опустить параметр ca (это должно привести к тому, что он по умолчанию использует цепочку Mozilla по умолчанию) и изменить ca, чтобы он указывал на «fullchain.pem», но это не имело никакого значения.

Что я здесь не так делаю?

1 Ответ

0 голосов
/ 07 января 2020

После экспериментов с несколькими другими вещами я обнаружил, что это работает:

tls.createSecureContext({
    key: fs.readFileSync(dir+"/privkey.pem", "utf8"),
    cert: fs.readFileSync(dir+"/fullchain.pem", "utf8")
})

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...