Ми використовуємо Nginx як зворотний проксі для нашого сервера веб-додатків. 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/;
}
}
Це працює добре для більшості браузерів, але деякі веб-переглядачі, такі як Safari та Chrome-на-Android, в кінцевому підсумку спонукають користувача надати клієнтську сертифікат незалежно від того, на якому веб-сайті вони переходять.
Як змусити Nginx приймати, але насправді не піклуватися про клієнтський сертифікат скрізь, крім нашого /jsonrpc
місця розташування?
server
блоці. У нас не було цієї самої проблеми при використанні Apache, тому я сподівався, що тут буде якась настройка, яка працюватиме.