クライアント証明書を認識しないアプリケーションがあり、クライアント証明書で認証されたWebサービスを使用する必要があります。これを修正するために、Nginxを使用して、アプリケーションがリモートHTTPSおよびクライアント証明書認証サービスにヒットするローカル(http)URLをリバースプロキシしようとしています。構成は以下のとおりです。
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が443を介してsecure.webservice.comへの接続を開始していることを示していることにも注意してください。
これを理解するための最初のステップは、接続のどちら側が閉じているのか、そしてなぜ...考えているのかを解読することだと思います。
前もって感謝します。
注:x.x.x.xはローカル(プライベート)IP、y.y.y.yはインターネット(パブリック)IPです。
この構成に関するいくつかの記事があります ここ および ここ 。また、NginxでクライアントSSL証明書を使用し、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;
}
}