Nginx proxy để back-end với xác thực chứng chỉ ứng dụng khách SSL


13

Tôi có hai máy chủ, cả hai đều có nginx. Máy chủ A đang nghe 443 và được cấu hình để xác thực bằng chứng chỉ SSL Máy khách.

Máy chủ B có một quy trình nội bộ cần liên lạc với Máy chủ A thông qua nginx.

Tôi muốn định cấu hình Nginx trên máy chủ B sẽ nghe 8080 (không mã hóa, vì đó là tất cả giao tiếp cục bộ) và proxy_pass đến ServerA: 443.

Câu hỏi là làm thế nào để tôi tiêm Chứng chỉ khách hàng? Tôi không tìm thấy bất kỳ chức năng proxy_xxxx nào sẽ làm điều đó.

Tôi biết cách tạo ra một thứ tương đương với socat, nhưng yêu cầu của tôi là sử dụng nginx.


2
Nhìn vào các chỉ thị trong mô-đun proxy của nginx, có vẻ như không thể tạo máy chủ nginx để sử dụng chứng chỉ để xác thực: nginx.org/en/docs/http/ngx_http_proxy_module.html Apache không hỗ trợ tính năng đó.
NuTTyX

Đó là điều tôi sợ ... bất kỳ ý tưởng nào nếu có một mô-đun tùy chỉnh hoặc thứ gì đó có thể làm cho nó hoạt động? Đó là loại tính năng phải tồn tại!
Bastien974

Tôi đã tìm thấy một tiện ích để di chuyển các tệp cấu hình từ apache sang nginx ( github.com/nhnc-nginx/apache2nginx ), vì vậy tôi đã tải xuống, tạo một apache.conf giả và chuyển nó qua công cụ, nhưng tôi đã nhận được kết quả này :### Section 2: Unconverted directives ### # Flag Description # [S] Unsupported directives. # In conf file: dummy.conf # Line 32: SSLProxyMachineCertificateFile /path/to/cert (mod_ssl.c) # [S] SSLProxyMachineCertificateFile: No relevant directive in Nginx.
NuTTyX

Câu trả lời:


20

Là đủ để có các chi tiết chứng chỉ khách hàng thông qua?

Bạn có thể thêm

proxy_set_header X-SSL-CERT $ssl_client_escaped_cert;

đến cấu hình của bạn và sau đó thông tin chứng chỉ khả dụng cho máy chủ B thông qua tiêu đề X-SSL-Cert.


1
Như đã nói ở đây , hãy lưu ý nếu phụ trợ của bạn có thể thay thế \tbằng \ntừ tiêu đề này một khi đã đọc.
lucasvc

3
Theo tài liệu của nginx , $ssl_client_certbiến không được dùng nữa; các $ssl_client_escaped_certbiến nên được sử dụng thay thế.
dubek

1
@dubek bắt tốt, tôi sẽ cập nhật câu trả lời trực tiếp trong trường hợp như thế này.
Chris Stryczynski

Tôi đã thử giải pháp này, nhưng dường như chỉ thông qua chứng chỉ nếu xác thực chứng chỉ được đặt thành BẬT. Tôi không muốn bật nó lên, có cách nào để làm cho nó hoạt động mà không cần bật xác nhận không?
juhako

5

Rõ ràng, đây là những gì bạn đang tìm kiếm: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_cert ve Có sẵn kể từ phiên bản 1.7.8.

location / {
    ...
    proxy_pass     the_other_nginx;
    proxy_ssl_certificate  the_certificate.pem;
    ...
}

1
Cái này sai. Điều này gán chứng chỉ ứng dụng khách cho proxy được sử dụng cho các yêu cầu đến phụ trợ. Nhưng người được hỏi, nói rằng giao tiếp này không được mã hóa chỉ là một địa phương, do đó không có kiểm tra chứng chỉ ứng dụng khách. Câu trả lời của jwilkins hoạt động tốt.
Kenyakorn Ketsombut

@KenyakornKetsombut Tôi tin rằng bạn đã đọc sai câu hỏi. Máy chủ B không có mã hóa (nghe trên 8080) nhưng phải giao tiếp với máy chủ A (nghe trên 443, bằng mã hóa). Vì vậy, B cần gửi chứng chỉ ứng dụng khách đến A để xác thực. Bạn có thể sử dụng proxy_ssl_certert để thực hiện điều đó. jwilkins trả lời, sẽ chuyển tiếp đến A chứng nhận được trao cho B. Cả hai có thể hoạt động tùy thuộc vào những gì bạn cần.
Nicolas Malbran

Xin chào Nicolas. Tôi đã cố gắng nói: nếu Máy chủ B không sử dụng mã hóa (trên cổng 8080) thì nó không sử dụng bất kỳ thứ gì như HTTPS / SSL hoặc tuy nhiên bạn gọi nó. Chứng chỉ ứng dụng khách là một phần của SSL, do đó Máy chủ B. B không thể gửi hoặc nhận bất kỳ chứng chỉ ứng dụng khách nào.
Kenyakorn Ketsombut

1
Tôi nhận được nginx: [nổi lên] không có "proxy_ssl_cert ve_key" được xác định cho chứng chỉ "certs / Roro_Client.pem" nginx: tệp cấu hình /etc/nginx/nginx.conf thử nghiệm không thành công khi tôi thử với 1.8.0
Wolfgang Fahl

4

Vấn đề dường như chủ yếu là phiên bản phụ thuộc. Trên Ubuntu 14.04 LTS, nginx mặc định là một lỗi thời 1.4. Trước tiên, bạn cần cài đặt phiên bản dựa trên PPA

https://lerafthift.io/upgrad-nginx-to-the-latest-version-on-ubfox-servers

chỉ ra cách làm điều này với:

sudo add-apt-repository ppa:nginx/stable
sudo aptitude safe-upgrade

bạn nên kết thúc với:

nginx -v
nginx version: nginx/1.8.0

Cấu hình từ @ xatr0z trả lời https://serverfault.com/a/636455/162693 trỏ đến http://www.senginx.org/en/index.php/Proxy_HTTPS_Client_Cert ve không hoạt động:

đề xuất không làm việc

backend {
    server some-ip:443;
}

server {
    listen 80;


    location / {
        proxy_ssl_certificate        certs/client.crt;
        proxy_ssl_certificate_key    certs/client.key;


        proxy_pass https://backend;
    }
}

không hoạt động ngoài hộp với 1.8.0. Nó có thể chỉ là một gợi ý và không được sử dụng như một tệp cấu hình như vậy hoặc phụ thuộc vào phiên bản khác.

Tôi đang thử nghiệm với máy chủ phụ trợ dựa trên apache2 A có SSL và chứng chỉ ứng dụng khách tự ký được kích hoạt. Cấu hình SSLOptions của Apache được đặt thành:

SSLOptions +ExportCertData +FakeBasicAuth + StdEnvVars

Điều này làm cho việc gỡ lỗi tình huống dễ dàng hơn vì tập lệnh phpinfo () ở phía phụ trợ sẽ hiển thị thông tin Phía máy chủ và Máy khách.

Để xác minh điều này tôi đã sử dụng:

https: // phụ trợ / kiểm tra / phpinfo

với chứng chỉ SSL được cài đặt trong trình duyệt và tôi nhận được các phần như: SSL_SERVER_S_DN_CN cho chứng chỉ máy chủ và SSL_CLIENT_S_DN_CN cho chứng chỉ ứng dụng khách.

Khi bắt đầu đầu tiên, tôi đã sử dụng (điền vào các phần trong ngoặc) để định cấu hình nginx trên máy chủ ngoại vi B:

server {
  listen 8080;
  server_name <frontend>;

  location / {
    proxy_buffering off;
    proxy_pass https://<backend>;
    #proxy_ssl_certificate      certs/<SSL Client Certificate>.crt;
    #proxy_ssl_certificate_key  certs/<SSL Client Certificate>.key;
  }
}

bỏ qua phần cụ thể của Chứng chỉ máy khách SSL chỉ để kiểm tra xem proxy ngược có hoạt động không.

nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
service nginx restart
nginx stop/waiting
nginx start/running, process 8931

Bây giờ http: // frontend: 8080 / test / phpinfo.php hoạt động

SSL_SERVER_S_DN_CN cho chứng chỉ máy chủ được hiển thị và SSL_CLIENT_S_DN_CN cho chứng chỉ ứng dụng khách chưa (chưa) được hiển thị

Bây giờ sau khi bỏ ghi chú:

server {
  listen 8080;
  server_name <frontend>;

  location / {
    proxy_buffering off;
    proxy_pass https://<backend>;
    proxy_ssl_certificate      certs/<SSL Client Certificate>.crt;
    proxy_ssl_certificate_key  certs/<SSL Client Certificate>.key;
  }
}

và kiểm tra / khởi động lại

nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
service nginx restart
nginx stop/waiting
nginx start/running, process 8931

http: // frontend: 8080 / test / phpinfo.php hoạt động và

SSL_SERVER_S_DN_CN cho chứng chỉ máy chủ được hiển thị và SSL_CLIENT_S_DN_CN cho chứng chỉ ứng dụng khách được hiển thị

Vì vậy, bây giờ chúng tôi có những thứ làm việc như yêu cầu.

Vui lòng lưu ý lỗi https://trac.nginx.org/nginx/ticket/872#ticket


Bạn có thể muốn coi chừng vấn đề đàm phán lại ruby-forum.com/topic/6875137 có thể làm hỏng chương trình
Wolfgang Fahl

1

Có một bài viết khá gọn gàng về chứng chỉ ứng dụng khách nginx và SSL; nó sử dụng PHP với FastCGI làm ví dụ nhưng tôi nghĩ bạn có thể điều chỉnh nó để thiết lập proxy ngược:

server {
    listen        443;
    ssl on;
    server_name example.com;

    ssl_certificate      /etc/nginx/certs/server.crt;
    ssl_certificate_key  /etc/nginx/certs/server.key;
    ssl_client_certificate /etc/nginx/certs/ca.crt;
    ssl_verify_client optional;

    location / {
        root           /var/www/example.com/html;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_param  SCRIPT_FILENAME /var/www/example.com/lib/Request.class.php;
        fastcgi_param  VERIFIED $ssl_client_verify;
        fastcgi_param  DN $ssl_client_s_dn;
        include        fastcgi_params;
    }
}

Nguồn http://nargetood.com/client-side-certert-authentication-in-ngi


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.