У нас есть приложение, которое не поддерживает сертификат клиента и должно использовать веб-службу с проверкой подлинности сертификата клиента. Чтобы исправить это, мы пытаемся использовать Nginx для обратного прокси-сервера локального (http) URL-адреса, который наше приложение будет использовать для удаленной службы HTTPS и сертификата клиента. Конфигурация ниже:
location /secure/api/ {
proxy_pass https://secure.webservice.com/secure/api/;
proxy_ssl_certificate /etc/ssl/api-client.crt;
proxy_ssl_certificate_key /etc/ssl/api-client.crt.key;
proxy_ssl_verify off;
}
При попытке подключиться к URL-адресу обратного прокси (http://our.proxy.com/secure/api/) он просто сидит и крутится. Если мы проверим соединение с прокси с помощью wget или openssl, мы сможем успешно подключиться.
Вот фрагмент из nginx / error.log:
2015/08/25 15:33:56 [info] 29810#0: *57 client closed connection while waiting for request, client: x.x.x.x, server: 0.0.0.0:80
2015/08/25 15:34:05 [info] 29810#0: *53 epoll_wait() reported that client prematurely closed connection, so upstream connection is closed too while reading response header from upstream, client: x.x.x.x, server: our.proxy.com, request: "GET /secure/api/ HTTP/1.1", upstream: "https://y.y.y.y:443/secure/api/", host: "our.proxy.com"
Строки «клиентское закрытое соединение» вызывают озабоченность, и я не уверен, какая сторона соединения закрывает соединение; клиент-> прокси или прокси-> восходящий поток.
Также стоит отметить, что tcpdump показывает, что nginx инициирует соединение с secure.webservice.com через 443.
Я чувствую, что первый шаг в выяснении этого - расшифровка, какая сторона связи закрывается и почему ... мысли?
Заранее спасибо.
Примечание: x.x.x.x - это локальный (частный) IP-адрес, y.y.y.y - это Интернет (общедоступный) IP.
Есть несколько статей об этой конфигурации Вот и Вот. Мы также используем клиентские SSL-сертификаты с Nginx и имеем следующую рабочую конфигурацию с перенаправлением http / https:
#config for upstream app servers (not aware of SSL)
upstream appcluster {
server X.X.X.1:8000;
server X.X.X.2:8000;
}
# http-to-https redirect
server {
listen 80;
server_name localhost;
return 301 https://$server_name$request_uri;
}
# resolves SSL & client SSL here
server {
listen 443;
server_name localhost;
ssl on;
ssl_certificate <path to cert.pem>;
ssl_certificate_key <path to cert.key>;
ssl_client_certificate <path to CA authority to resolve client ssl - this is ca.crt>;
ssl_verify_client on;
...
# after ssl resolution forward to upstream cluster
location /restService {
...
proxy_pass http://appcluster/restService;
}
}