如何在Nginx中为自定义位置设置双向SSL?

时间:2016-02-23 10:29:45

标签: ssl nginx configuration ssl-certificate

我有一个带有一些API的rails 4项目。

此项目在生产时使用nginx v.1.6.3https运行。

Nginx配置:

upstream app {
    # Path to Unicorn SOCK file, as defined previously
    server unix:/tmp/unicorn.my_domain.sock fail_timeout=0;
}

server {
       listen         80;
       server_name    my_domain.com;
       return         301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;

    ssl_certificate /etc/nginx/ssl/public.crt;
    ssl_certificate_key /etc/nginx/ssl/private.rsa;    

    server_name my_domain.com;

    root /var/www/current;

    location /assets {
        root /var/www/current/public;
        gzip_static on;
        expires max;
        add_header Cache-Control public;
    }

    try_files $uri/index.html $uri @app;

    location @app {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_pass http://app;
    }

    error_page 500 502 503 504 /500.html;
    client_max_body_size 4G;
    keepalive_timeout 10;
}

问题

API请求(POST /api/some_path/create等)应使用双向SSL进行保护。

只有一项服务将使用此API(只有一个客户端使用一个证书)

问题

  1. nginx能否处理two-way SSL
  2. two-way SSL应在nginx图层上实施,而不是在网络应用程序逻辑中实施。我是对的吗?
  3. 如何设置nginx以捕获向/api/...网址发送请求并使用two-way SSL对其进行身份验证的客户?
  4. 我只需要一个基本的例子,了解它应该如何运作。

1 个答案:

答案 0 :(得分:5)

  1. 是(请参阅ssl_client_certificatessl_verify_client指令)。
  2. 取决于您的应用程序,但在这种情况下,您只需要验证证书是否由某个CA签名,这是正确的。
  3. 您需要创建由该CA签名的CA和客户端证书,并使用该CA验证服务器端的客户端证书。

    现在,您需要考虑的是如何解决ssl_client_certificatessl_verify_client指令不支持在位置块中使用的问题(例如,它们只能用于http或服务器块)。

    我建议为API创建一个自己的子域(例如api.my_domain.com),并从具有该地址的服务访问API。

  4. 示例配置:

    appearance