MTLS на Nginx, который работает с клиентскими приложениями Android?

Есть ли способ дешево получить MTLS / двусторонний SSL / клиентские сертификаты, которые работают на нерутированных v10 + Android-клиентах?

У меня есть пара личных конечных точек api, которые я хочу сделать публично доступными только мне и нескольким членам семьи, но отфильтровывать весь другой трафик, например, плохие боты, сканеры эксплойтов или любые любопытные клиенты на том же шлюзе. Я использую фильтрацию IP-адресов, которая работает для ботов, но по-прежнему доступна любому устройству с IP-адресом из белого списка.

В настоящее время я выполняю обратное проксирование конечных точек через поддомены на Nginx, затем фильтрую доступ с помощью белого списка IP-адресов DDNS и 444 остальных. Другой вариант, доступный для ограничения доступа с помощью Nginx, - это клиентские сертификаты / MTLS. Это казалось идеальным вариантом, я могу заставить Nginx запрашивать сертификат клиента как необязательный и 444 весь трафик, кроме сопоставленного ssl_client_fingerprint. Это будет более жесткая настройка, чем просто IP.

Я пошел и создал свои собственные частные корневые центры сертификации EC, центры сертификации промежуточных серверов и сертификаты клиентов, все подписанные, связанные вместе и упакованные в PFX с OpenSSL. В MacOS и Windows все работает отлично и, как и ожидалось, в браузерах и через приложения, которые обращаются к API. Nginx получает правильный сертификат от клиентов и позволяет сопоставить хэши отпечатков пальцев или разрывает соединение.

На Android 10+ все работает одинаково при доступе через браузер, отлично. Проблема возникает, когда я пытаюсь получить доступ к API через приложения Android, Nginx не получает ответа на сертификат клиента.

Насколько я понял, раньше такая установка работала, возможно, в Android <= 7 все изменилось. Насколько я понимаю, с версии 8+ приложения Android больше не доверяют хранилищам доверия пользователей / цепочкам частных клиентов CA по умолчанию, только общедоступным системным хранилищам, если им явно не разрешено делать это в настройках безопасности приложений / сети перед компиляцией APK? Я предполагаю, что для изменений есть веские и необходимые причины безопасности.

Есть ли еще способ сделать эту работу дешево? Я думаю, что у меня есть следующие варианты:

  1. Купить общеизвестный центр сертификации, с помощью которого я могу подписывать сертификаты клиентов? Не уверен, смогу ли я обойтись дешевым DV или это должно быть что-то гораздо более сложное и дорогое?

  2. Настройте службу OpenVPN на сервере и туннели только для приложений, которым нужен доступ. Кажется излишним по сравнению с сертификатом клиента. Я использую небольшой VPS, меньшие накладные расходы - лучший вариант для меня.

  3. Раскрутите APK-файлы с открытым исходным кодом для указанных приложений Android, чтобы разрешить хранилища доверия пользователей. Похоже на головную боль ...

  4. Выполните рутирование всех устройств, чтобы принудительно выполнить аутентификацию сертификата. Не вариант для всех необходимых устройств.

  5. Придерживайтесь белых списков IP-адресов. Не идеально, но он помогает избавиться от плохих сканеров.

Есть ли у кого-нибудь альтернативные рекомендации, о которых я, возможно, не знаю, предложения или исправления к тому, что я пытаюсь сделать выше?

Ура

-1
задан 19 April 2021 в 19:04
1 ответ

В итоге я решил использовать Wireguard, и пока что он не требует много ресурсов.

Я отфильтровал порт Wireguard с помощью белого списка DDNS, поскольку он у меня уже был, затем я изменил Nginx, чтобы разрешить пирам из VPN, иначе у них должен быть действительный сертификат клиента, который имеет хэш-маппинг, иначе они 444. Затем приложения Android могут использовать VPN туннель для определенных приложений, которым они нужны, а все остальные могут использовать обычную настройку с сертификатами.

0
ответ дан 24 April 2021 в 03:04

Теги

Похожие вопросы