我们使用 Nginx 作为我们的 Web 应用程序服务器的反向代理。Nginx 处理我们的 SSL 等,但在其他方面只是充当反向代理。
我们希望为请求提供有效的客户端证书,/jsonrpc但不要求在其他任何地方使用它们。我们发现的最好方法是
server {
listen *:443 ssl;
ssl on;
ssl_certificate /etc/nginx/server.crt;
ssl_certificate_key /etc/nginx/server.key;
ssl_client_certificate /etc/nginx/client-ca.crt;
ssl_verify_client optional;
location /jsonrpc {
if ($ssl_client_verify != "SUCCESS") { return 403; }
proxy_pass http://localhost:8282/jsonrpc-api;
proxy_read_timeout 90;
proxy_redirect http://localhost/ $scheme://$host:$server_port/;
}
}
Run Code Online (Sandbox Code Playgroud)
这适用于大多数浏览器,但某些浏览器(例如 Safari 和 Chrome-on-Android)最终会提示用户无论在网站上的哪个位置都提供客户端证书。
我们如何让 Nginx 接受但并不真正关心除我们/jsonrpc所在位置以外的任何地方的客户端证书?
我有一个名为foo. 我的 init 脚本/etc/init.d/foo启动foo守护进程并将其 pidfile 存储在 中/var/run/foo.pid,这似乎是标准位置。因为/etc/init.d/foo必须以 root 身份运行,所以在/var/run.
该foo守护进程是真正的程序/usr/sbin/foo,其目的是由init脚本以root身份调用,但然后立即放弃其权限的非特权foo用户。但是,我还希望该/usr/sbin/foo程序在由于严重错误退出时删除其 pidfile。但由于它已经放弃了它的权限,它不再具有从/var/run目录中删除文件的能力。
我目前的方法是使用seteuid而不是setuid删除我的权限,然后在退出之前立即重新提升权限,以便我可以从/var/run. 但是,我遇到了许多与各种库和外部程序有关的问题,这些问题在使用与 uid 不同的 euid 调用时会出现问题。
有没有其他方法可以做到这一点?我想另一种选择是将我的 pidfile 放在一个目录中,该目录可由 rootfoo用户和用户写入。但是我们其他所有PID文件都在/var/run,包括其运行作为非特权用户,所以我喜欢把其他程序PID文件foo.pid的文件那里。
除了使用之外还有什么方法可以做到这一点seteuid吗?