nginxでupstreamをhttpsにしたいとき
ちょっとだけ知って置く必要がある設定があるので残しておく。あまり難しくはない。
証明書を更新しておく
CentOSならyum、Debianならapt、その他はいい感じに。
yum install ca-certificate
nginx をビルドする
がんばってください。
SSLを使うことになるので、http_ssl_moduleは入れておく必要がある。
opensslをリンクする場合、新しいものを使うのがおすすめ。
nginx.confを設定する
クライアント証明書が必要な場合は、ちゃんとした証明書と検証用にtrustedな証明書を設定する。
nginx.conf
server { resolver 8.8.8.8; listen 8080; server_name _; proxy_ssl_protocols TLSv1.2; proxy_ssl_ciphers HIGH:!aNULL:!MD5; proxy_ssl_server_name on; proxy_ssl_name REPLACE_REMOTE_ADDR; proxy_ssl_password_file /path/to/client_cert_password; proxy_ssl_certificate /path/to/client_cert_pem_with_password; proxy_ssl_certificate_key /path/to/client_cert_pem_with_password; proxy_ssl_trusted_certificate /path/to/ca-bundle.crt; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Real-IP $remote_addr; location / { proxy_pass https://REPLACE_REMOTE_ADDR; } }
各設定値について
resolver
外に行く場合の名前解決に使うDNS。IP指定の場合はいらないかもしれない。適切なDNSを指定する。
listen
nginxがlistenするポート
server_name
_
なので何でもマッチする。default_serverにするといい気もする。
proxy_ssl_protocols
proxyで接続する際に使うプロトコル。TLS1.2をサポートしているサーバの場合はこの設定でいい。
proxy_ssl_ciphers
proxyで接続する際に使うcipher。リモート側でサポートしているもので強いものを使う。
proxy_ssl_server_name
SNI対応用。proxy_ssl_nameとセットで使う。
proxy_ssl_name
REPLACE_REMOTE_ADDR
を実際に接続する先の名前に置き換える。
リモートサーバにつなぎに行くときの名前を置く。SNIを使っているサーバがぼちぼちあるので指定するのが無難。
proxy_ssl_password_file
プロキシに使うSSL証明書のパスワードファイル。
クライアント証明書がパスワード付きならここにパスワードファイルを設定する。
proxy_ssl_certificate
クライアント証明書を指定する。クライアント証明書が不要ならいらない気もする。
proxy_ssl_certificate_key
クライアント証明書を指定する。クライアント証明書が不要ならいらない気もする。
proxy_ssl_trusted_certificate
証明書の検証に使う信頼された証明書を指定する。
CentOSだと /etc/pki/tls/certs/
とかに置いてあるらしい。
ディストリビューションによって違うのでいい感じに設定するか、curlのをもってきてもいい。
proxy_set_header
いい感じに設定する
終わり
この辺触る人あんまりいなさそうなので地味なハマり方をして消耗する人はいそう。頑張って欲しい。