クライアント認証の目的でSSLを使用してTomcatアプリケーションを構成しました。ポート8443にあります。正常に動作するため、クライアント証明書(client.p12)でTomcatをヒットしようとすると成功し、キーストアにない別の証明書で不正なSSLエラーが発生します。したがって、これは機能します。
次に、プロキシとしてTomcatの前にnginxを配置しようとしましたが、常に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"
誰かがこの問題を解決するのを手伝ってくれますか?最終的には、SSL上にあるnginxを介してTomcat証明書を渡したいだけです。 (Nginx(https)-> Tomcat(https))。
これが奇妙な要件であることは知っていますが、これが必要です。
ありがとう、
コメントから、認証にクライアント証明書を使用しているようです。その場合、NginxのHTTPプロキシを使用することはできず、代わりにStreamプロキシを使用する必要があります。詳細については、こちらの投稿をご覧ください。
HTTPS暗号化パケットを復号化せずにルーティングするにはどうすればよいですか?
クライアント証明書を処理する場合、クライアント証明書はTLSハンドシェイクプロセス中に効果的に「消費」されるため、Nginxが最初にSSL接続を受け入れている場合、クライアントは検証のために証明書をNginxに提示します。 Tomcatアプリケーションは認証のためにクライアント証明書を処理することを想定しているため、プロキシ接続には使用する証明書がありません。これにより、TLSハンドシェイクが失敗します。
Nginx Streamモジュールを使用すると、トラフィックを中断することなく(それによってクライアント証明書を保持して)Tomcatプロセスに送信し、クライアント証明書からの適切な認証を可能にします。
処理するプロセスが1つしかないように思われるため、SSLプリリードモジュールは必要ありません(負荷分散が必要な場合を除く)。おそらく、次のものだけが必要になります。
stream {
server {
listen 443;
listen [::]:443;
proxy_pass 127.0.0.1:8443;
}
}