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