我有一个带有一些API的rails 4项目。
此项目在生产时使用nginx v.1.6.3
和https
运行。
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(只有一个客户端使用一个证书)
问题
two-way SSL
?two-way SSL
应在nginx
图层上实施,而不是在网络应用程序逻辑中实施。我是对的吗?nginx
以捕获向/api/...
网址发送请求并使用two-way SSL
对其进行身份验证的客户?我只需要一个基本的例子,了解它应该如何运作。
答案 0 :(得分:5)
您需要创建由该CA签名的CA和客户端证书,并使用该CA验证服务器端的客户端证书。
现在,您需要考虑的是如何解决ssl_client_certificate和ssl_verify_client指令不支持在位置块中使用的问题(例如,它们只能用于http或服务器块)。
我建议为API创建一个自己的子域(例如api.my_domain.com),并从具有该地址的服务访问API。
示例配置:
appearance