Làm cách nào để sử dụng ssl_verify_client = ON trên một máy chủ ảo và ssl_verify_client = OFF trên máy chủ khác?


9

Tôi muốn buộc xác minh máy khách ssl đối với các máy chủ ảo của mình. Nhưng nhận được lỗi "Không yêu cầu chứng chỉ SSL đã được gửi", cố gắng NHẬN một cái gì đó từ nó.

Dưới đây là cấu hình thử nghiệm của tôi:

# defaults                                                                                                                                                                    
ssl_certificate /etc/certs/server.cer;                                                                                                                                 
ssl_certificate_key /etc/certs/privkey-server.pem;                                                                                                                     
ssl_client_certificate /etc/certs/allcas.pem;                                                                                                                                 

server {                                                                                                                                                                      
    listen 1443 ssl;                                                                                                                                                          
    server_name server1.example.com;                                                                                                                                          
    root /tmp/root/server1;                                                                                                                                                   

    ssl_verify_client off;                                                                                                                                                    
}                                                                                                                                                                             

server {                                                                                                                                                                      
    listen 1443 ssl;                                                                                                                                                          
    server_name server2.example.com;                                                                                                                                          
    root /tmp/root/server2;                                                                                                                                                   

    ssl_verify_client on;                                                                                                                                                     
} 

Máy chủ đầu tiên trả lời bằng 200 mã http, nhưng lần thứ hai trả về "400 Yêu cầu xấu, Không yêu cầu chứng chỉ SSL được gửi, nginx / 1.0.4".

Có lẽ, có thể sử dụng ssl_verify_client trên cùng một IP không? Tôi có nên liên kết các máy chủ này với các IP khác nhau không, nó có giải quyết được vấn đề của tôi không?

Câu trả lời:


4

Tôi gặp một vấn đề tương tự, nhưng tìm cách phân biệt ssl_verify_clientsgiữa các khối vị trí trong một khối máy chủ, thay vì giữa các khối máy chủ. Bạn có thể giải quyết vấn đề của mình bằng cách di chuyển công cụ cấu hình ssl mặc định vào hai máy chủ (sao chép, chắc chắn hoặc đặt tất cả chúng trong một khối máy chủ, chấp nhận nhiều tên miền phụ và sử dụng vị trí).

Đối với giải pháp dựa trên vị trí, trông giống như các công trình sau đây. Sử dụng

ssl_verify_client optional;

trong khối máy chủ và sử dụng câu lệnh if ở các vị trí khác nhau, ví dụ:

if ($ssl_client_verify != SUCCESS) { return 403; }

Tôi cần phải làm điều này để cấp cho quản trị viên quyền truy cập vào một ứng dụng web, nhưng vẫn cho phép các webhook từ github mà không cung cấp cho github một chứng chỉ ssl của khách hàng.


2

Bạn cần nâng cấp ít nhất lên nginx> = 1.0.9 nếu bạn muốn có nhiều máy chủ ảo dựa trên tên (sử dụng SNI) trên cùng một địa chỉ IP và cổng, nhưng với các ssl_verify_clientcài đặt khác nhau cho các máy chủ này.

Trong các phiên bản nginx cũ hơn, ssl_verify_clientcài đặt cho máy chủ ảo mặc định đã được sử dụng cho tất cả các máy chủ ảo dựa trên tên khác trên cùng một kết hợp cổng IP +. Một số tùy chọn SSL khác ( ssl_verify_depth, ssl_prefer_server_ciphers) cũng được xử lý theo cách tương tự. Sử dụng một IP hoặc cổng riêng biệt có thể là một cách giải quyết nếu bạn hoàn toàn không thể nâng cấp.

Lưu ý từ thay đổi nginx cho 1.0.9:

*) Bugfix: the "ssl_verify_client", "ssl_verify_depth", and
   "ssl_prefer_server_ciphers" directives might work incorrectly if SNI
   was used.

Những thay đổi có liên quan trong nguồn nginx: r4034 trong thân cây, r4246 trong nhánh 1.0.


0

Bạn đã tải chứng chỉ ứng dụng khách (ở định dạng PKCS12) có chữ ký của CA "/etc/certs/allcas.pem" trong trình duyệt của bạn chưa? Trong Firefox, bạn có thể kiểm tra các chứng chỉ ứng dụng khách của mình bằng cách vào Tùy chọn -> Nâng cao -> Mã hóa -> Xem Chứng chỉ -> Chứng chỉ của bạn.

Giá trị của tham số "ssl_verify_client" nếu "tắt" theo mặc định. Bạn cũng có thể sử dụng giá trị "tùy chọn" nếu chứng chỉ ứng dụng khách SSL không bắt buộc.


Tôi đã sử dụng curl --cert ... với kết quả tương tự.
Alexander Artemenko

Có điều gì thú vị trong nhật ký lỗi của nginx không? (có lẽ /var/log/nginx/error.log)
dùng1025596

0

Tôi không phải là chuyên gia nginx, nhưng tôi đã thấy các vấn đề tương tự với apache khi sử dụng SSL và máy chủ ảo. Vấn đề là thứ tự máy chủ xử lý đàm phán SSL so với lựa chọn máy chủ ảo. Bước đầu tiên là thiết lập kết nối được mã hóa và chỉ sau khi hoàn thành, máy chủ mới biết tên máy chủ mà bạn yêu cầu. Và cho đến khi biết, nó sẽ sử dụng cài đặt mặc định - trong trường hợp này là máy chủ đầu tiên, yêu cầu chứng chỉ ứng dụng khách để thiết lập kết nối SSL.

Vì vậy, câu trả lời ngắn gọn - trong trường hợp này, bạn nên làm tốt hơn để có các cổng riêng biệt hoặc địa chỉ IP riêng biệt.


-1

Tôi gặp phải vấn đề tương tự và tìm thấy một giải pháp.

Vui lòng thử thêm default_servercờ cho máy chủ thứ hai

listen 443 ssl default_server;
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.