我有一个带有一些 API 的 Rails 4 项目。
该项目运行于nginx v.1.6.3
and 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;
}
Problem
API 请求(POST /api/some_path/create
等)应使用双向 SSL 进行保护。
只有一个服务会使用此 API(只有 1 个客户端拥有一个证书)
Question
- nginx能处理吗
two-way SSL
?
-
two-way SSL
应实施于nginx
层,而不是 Web 应用程序逻辑。我对吗?
- 如何设置
nginx
捕获发送请求的客户端/api/...
url 并对其进行身份验证two-way SSL
?
我只需要一个基本示例来了解它应该如何工作。
- 是的(参见ssl_客户端_证书 http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_client_certificate and ssl_验证_客户端 http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_verify_client指令)。
- 取决于您的应用程序,但在这种情况下,您只需要验证证书是否由某个 CA 签名,这是正确的。
-
您需要创建一个 CA 和由该 CA 签名的客户端证书,并使用该 CA 来验证服务器端的客户端证书。
现在,你需要考虑的是如何解决这个问题ssl_客户端_证书 http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_client_certificate and ssl_验证_客户端 http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_verify_client指令不支持在 location 块中使用(例如,它们只能在 http 或 server 块中使用)。
我建议为 API 创建一个自己的子域(例如 api.my_domain.com),并使用该地址从服务访问 API。
配置示例:
server {
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/public.crt;
ssl_certificate_key /etc/nginx/ssl/private.rsa;
ssl_client_certificate /etc/nginx/ssl/client_ca.pem;
ssl_verify_client on;
server_name api.my_domain.com;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app/api;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)