Nginx to Tomcat SSL-прокси

Я настроил приложение tomcat с SSL для аутентификации клиента. Он находится на порту 8443. Он отлично работает, поэтому, когда я пытаюсь попасть в tomcat с клиентским сертификатом (client.p12), я добился успеха, а с другим сертификатом, которого нет в хранилище ключей, возникает плохая ошибка ssl. Так что это работает.

Затем я попытался поставить nginx перед tomcat в качестве прокси, но всегда получаю 502. Nginx также использует SSL. Ниже я получаю сообщение об ошибке.

2018/04/20 17:25:03 [error] 21884#0: *3 SSL_do_handshake() failed (SSL: error:14094412:SSL routines:SSL3_READ_BYTES:sslv3 alert bad certificate:SSL alert number 42) while SSL handshaking to upstream, client: 10.6.8.20, server: 10.6.3.105, request: "GET /print HTTP/1.1", upstream: "https://10.6.3.105:8443/", host: "10.6.3.105"

Может ли кто-нибудь помочь мне решить эту проблему? В конечном итоге я просто хочу передать сертификат tomcat через nginx, который также находится на SSL. (Nginx (https) -> Tomcat (https)).

Я знаю, что это странное требование, но оно мне нужно.

Спасибо,

1
задан 20 April 2018 в 15:14
1 ответ

Судя по вашим комментариям, вы используете клиентские сертификаты для аутентификации. Если это так, вы не можете использовать прокси-сервер HTTP от Nginx, и вместо этого вы должны использовать прокси-сервер Stream. Для получения дополнительных сведений ознакомьтесь с публикацией здесь:

Как мне маршрутизировать зашифрованные пакеты HTTPS, не расшифровывая их?

При работе с сертификатами клиента сертификат клиента эффективно «потребляется» во время процесса установления связи TLS, поэтому, если Nginx принимая сначала SSL-соединение, клиент представляет сертификат Nginx для проверки. Поскольку ваше приложение tomcat ожидает обработки клиентского сертификата для аутентификации, проксируемое соединение не имеет его для использования; это приведет к сбою установления связи TLS.

Использование модуля Nginx Stream позволит вам отправлять трафик без прерывания (таким образом, сохраняя сертификат клиента) процессу tomcat и разрешить правильную аутентификацию с помощью сертификата клиента.

Похоже, у вас есть только один процесс для работы, поэтому вам не понадобится модуль предварительного чтения SSL (если не требуется балансировка нагрузки), вам, вероятно, понадобится следующее:

stream {
    server {
        listen 443;
        listen [::]:443;

        proxy_pass 127.0.0.1:8443;
    }
}
1
ответ дан 3 December 2019 в 23:17

Теги

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