7

nginx を介してリクエスト ヘッダー 'HTTP_X_SSL_CLIENT_S_DN' をプロキシしたい。

これが私たちのサーバーネットワーク構造です。

[front server:443] <---> [nginx proxy:8004] <---> [application server:8008]
(client cert auth)

2台のサーバー([フロントサーバー]と[アプリケーションサーバー])で試したところ、ちゃんと動きました。ヘッダー 'HTTP_X_SSL_CLIENT_S_DN' がアプリケーション サーバーに渡されました。

次に、サーバー [nginx プロキシ] を追加すると、ヘッダー 'HTTP_X_SSL_CLIENT_S_DN' がアプリケーション サーバーに渡されませんでした。

私のnginx設定は以下です。

server {
    listen   8004;
    index index.html;

    location / {
        proxy_pass_header Server;
        proxy_pass_header X-Scheme;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_pass http://app-server/;

# TODO: to proxy 'HTTP_X_SSL_CLIENT_S_DN'
# failed settings
#        proxy_pass_request_headers on; # not worked (default: on)
#        proxy_pass_header X-SSL-Client-S-DN; # none
#        proxy_pass_header X_SSL_CLIENT_S_DN; # none
#        proxy_pass_header HTTP_X_SSL_CLIENT_S_DN; # none
#        proxy_pass_header HTTP-X-SSL-CLIENT-S-DN; # none
#        proxy_set_header X-SSL-Client-S-DN $ssl_client_s_dn; # none
#        proxy_set_header X_SSL_Client_S_DN $x_ssl_client_s_dn; # none
#        proxy_set_header X-SSL-Client-S-DN $http_ssl_client_s_dn; # none
#        proxy_set_header X-SSL-Client-S-DN $http_x_ssl_client_s_dn; # none
    }
}

upstream app-server {
    server 127.0.0.1:8008;
}

任意のヘルプが適用されます。

4

2 に答える 2

7

何よりもまず、クライアント証明書を検証するように nginx.conf が設定されていることを確認してください! あなたが説明したのとまったく同じ問題がありました。

server {
  # ...
  ssl_client_certificate /srv/ssl/self.crt;
  ssl_verify_depth     1;
  ssl_verify_client    on;
  # ...
  location @app { # I'm using nginx+unicorn, don't blindly copy this!  :)
    # ...
    proxy_set_header X-SSL-Client-Serial $ssl_client_serial;
    proxy_set_header X-SSL-Client-Verify $ssl_client_verify;
    proxy_set_header X-SSL-Client-S-DN   $ssl_client_s_dn;
    # ...
}

これをテストするには、別のクライアント キーと、ルート認証局の証明書を使用して署名された証明書が必要です。次のコマンドでは、クライアントの資格情報は「me」で始まり、ルート権限の資格情報は「self」で始まります。

  1. クライアントの秘密鍵を生成します。

    openssl genrsa -out me.key 1024
    
  2. セルフ CA の署名を要求します。

    openssl req -new -key me.key -out me.csr
    
  3. 自己 CA を使用して要求に署名し、証明書を作成します。

    openssl x509 -req -days 365 -in me.csr -CA self.crt -CAkey self.key -set_serial 01 -out me.crt
    
  4. 新しいキーを試してみてください。

    curl -v -s -k --key me.key --cert me.crt https://fort-awesome-o
    
  5. エクストラ クレジット: ブラウザにインポートできる証明書を生成します。

    openssl pkcs12 -export -in me.crt -inkey me.key -certfile self.crt -out me.p12
    

HTTP 環境をダンプする単純な Sinatra Web アプリがあり、次のように表示されます。

"HTTP_X_SSL_CLIENT_SERIAL"=>"01", "HTTP_X_SSL_CLIENT_VERIFY"=>"成功", "HTTP_X_SSL_CLIENT_S_DN"=>"/C=US/ST=メリーランド/L=アナポリス/O=フォートキッカス/CN=ジョナサン・モートン/emailAddress=jon @jonmorton.com"

于 2013-03-06T23:41:58.357 に答える