Làm cách nào tôi có thể thực hiện apache yêu cầu chứng chỉ SSL của khách hàng mà không cần xác minh nó với CA đã biết?


9

Tôi đang sử dụng apache2 (2.2.3) để phục vụ trang web mà tôi muốn khách hàng xác thực bằng chứng chỉ. Vì tôi chỉ cần xác minh rằng người dùng xuất trình chứng chỉ cụ thể là cùng một người dùng đã xuất trình chứng chỉ đó trong quá khứ, nên CA ký chứng chỉ là không liên quan. Tuy nhiên, dường như việc sử dụng SSLVerifyClient requireyêu cầu SSLCACertificateFile ...(hoặc SSLCACertificatePath ...), và sau đó apache sẽ chỉ chấp nhận các chứng chỉ được ký bởi CA trong tệp / đường dẫn đó. Có cách nào để apache chấp nhận bất kỳ chứng chỉ ứng dụng khách nào, bất kể CA phát hành / hát không? (tức là xác minh rằng máy khách có khóa riêng tương ứng với khóa chung được trình bày, nhưng không bận tâm xác minh CA phát hành / ký)


Làm thế nào để bạn có kế hoạch theo dõi những chứng chỉ đã được chứng thực?
Shane Madden

@ShaneMadden: Một cái gì đó giống như chứng chỉ ánh xạ bảng tới ID người dùng nội bộ. Các cơ chế của mật mã khóa công khai sẽ thay thế mật khẩu.
Isaac

2
Phải - điều tôi nhận được là Apache không thực hiện chứng chỉ ánh xạ bảng tới ID người dùng nội bộ. Nếu bạn sẽ có người dùng xác thực bằng chứng chỉ ứng dụng khách, tại sao không cung cấp cho người dùng chứng chỉ mà bạn ký? Như bạn đã đề cập, có những nhà cung cấp OpenID thực hiện chính xác điều đó. Apache mod_sslđược thiết kế để xác thực người dùng dựa trên mối quan hệ ký chứng chỉ; nếu bạn muốn bỏ qua điều đó vì một số lý do thì bạn sẽ cần phải thực hiện xác thực chứng chỉ trong mã của riêng bạn, điều đó cũng xử lý ánh xạ chứng chỉ đến người dùng của bạn.
Shane Madden

@ShaneMadden: Tôi đã hy vọng tránh việc cấp chứng chỉ và nếu tôi chỉ chấp nhận chứng chỉ mà tôi đã cấp, thì chứng chỉ dựa trên thẻ thông minh sẽ bị loại. Bất kể tôi làm gì, một số phần của hệ thống sẽ diễn ra ở cấp ứng dụng, nhưng vì có tất cả các mod_sslmáy móc ở đó, tôi đã hy vọng rằng nó có thể đảm nhiệm một số công việc cho tôi.
Isaac

1
@ShaneMadden Một ưu điểm của optional_no_canó là có thể tốt hơn cho UI, vì bạn có thể hiển thị thông báo lỗi HTTP nếu có gì đó không đúng với chứng chỉ (bạn không thể, vì chứng chỉ ứng dụng khách xấu sẽ dừng kết nối trước lớp HTTP ). Nó cũng hữu ích nếu bạn muốn thử các cách khác để xác minh chứng chỉ (ví dụ: WebID ). Bạn đúng, bạn muốn một cái gì đó để thực hiện xác minh và điều đó sẽ chỉ thực sự hoạt động khi yêu cầu được xử lý bằng mã (ví dụ: trong PHP / CGI / Java), không quá nhiều với các tệp.
Bruno

Câu trả lời:


10

Như bạn đã tìm thấy, bạn có thể vô hiệu hóa xác minh chứng chỉ ở cấp độ bắt tay SSL / TLS trong Apache HTTPd bằng cách sử dụng SSLVerifyCLient optional_no_ca.

Vấn đề thứ hai bạn sẽ phải đối mặt với những gì bạn đang cố gắng làm là để khách hàng gửi chứng chỉ. Vì chứng chỉ của bạn không có ý định nằm trong PKI, nên chúng có thể tự ký và có nhiều tổ chức phát hành khác nhau.

Khi yêu cầu chứng chỉ ứng dụng khách, máy chủ sẽ gửi CertificateRequesttin nhắn TLS đến máy khách trong quá trình trao tay. Thông báo này chứa certificate_authoritiesdanh sách:

Một danh sách các tên phân biệt của các cơ quan chứng nhận chấp nhận được. Các tên phân biệt này có thể chỉ định một tên phân biệt mong muốn cho một CA gốc hoặc cho một CA cấp dưới; do đó, thông báo này có thể được sử dụng để mô tả cả gốc đã biết và không gian ủy quyền mong muốn. Nếu danh sách cert_masterities trống thì khách hàng CÓ THỂ gửi bất kỳ chứng chỉ nào của ClientCertertType, trừ khi có sự sắp xếp bên ngoài ngược lại.

Trình duyệt sử dụng điều này để chọn chứng chỉ ứng dụng khách nào sẽ gửi (nếu có).

(Lưu ý rằng phần về danh sách trống chỉ có trong thông số kỹ thuật từ TLS 1.1 trở đi. SSL 3.0 và TLS 1.0 im lặng về điều này và trong thực tế, nó cũng sẽ hoạt động.)

Bạn có hai lựa chọn cho việc này.

  • Nếu các chứng chỉ ứng dụng khách mà bạn mong đợi sẽ tự ký, tất cả chúng sẽ có các tổ chức phát hành khác nhau. Vì bạn sẽ không biết phải mong đợi điều gì, nên máy chủ sẽ cần gửi một danh sách trống. Để thực hiện việc này, hãy sử dụng SSLCADNRequestFilechỉ thị và trỏ nó vào một tệp chỉ chứa một dòng trống (nếu tôi nhớ rõ, nó không hoạt động với một tệp hoàn toàn trống).

  • Tùy chọn thứ hai (ít sạch sẽ). Phải đồng ý về một Nhà phát hành DN chung cho tất cả các chứng chỉ ứng dụng khách mà bạn mong đợi, cho dù chúng có thực sự được cấp bởi chứng chỉ CA đó hay không (hoặc liệu CA đó có tồn tại hay không). Bằng cách đó, bạn sẽ phá vỡ mô hình PKI đáng kể (hơn nữa).

    Nếu bạn đồng ý về một tổ chức phát hành DN như CN=Dummy CA(ví dụ). Bất cứ ai cũng có thể xây dựng chứng chỉ tự ký bằng cách sử dụng CN=Dummy CAChủ đề DN (và Nhà phát hành DN), có thể bằng các khóa khác nhau. Mặc dù SSLCADNRequestFilechỉ thị dự kiến ​​sẽ được cấu hình với các chứng chỉ để xây dựng danh sách, nhưng chúng không được sử dụng để xác minh chứng chỉ ứng dụng khách, đó chỉ là một cách phức tạp (nhưng tự nhiên trong ngữ cảnh của các chỉ thị khác) để định cấu hình certificate_authoritiesdanh sách. Nếu bạn, với tư cách là một dịch vụ, đặt một chứng chỉ tự ký có các tên này vào SSLCADNRequestFile, điều này sẽ làm cho CertificateRequestthông điệp TLS được sử dụng CN=Dummy CAtrong certificate_authoritiesdanh sách (đây chỉ là các tên, không phải là certs ở giai đoạn này). Sau đó, khách hàng sẽ có thể nhận chứng chỉ của riêng mình với Tổ chức phát hành DNCN=Dummy CA, liệu chữ ký của nó có thể được xác nhận bởi chứng chỉ đó (cùng khóa) hay không, vì dù sao không có xác minh chữ ký nào được tham gia trong các bước này.

Điều này đang được nói, hãy nhớ rằng SSLVerifyCLient optional_no_ca, không có xác minh chứng chỉ thực sự nào được thực hiện (tôi cho rằng bạn có thể kiểm tra SSL_CLIENT_VERIFYbiến nếu xác minh thủ công của bạn chỉ là giải pháp dự phòng cho PKI mà bạn đã định cấu hình). Tất cả những gì bạn sẽ biết ở giai đoạn đó là khách hàng có khóa riêng cho chứng chỉ khóa chung mà nó đã xuất trình (được bảo đảm bằng CertificateVerifytin nhắn TLS ): bạn sẽ cần thực hiện một số hình thức xác minh nếu bạn muốn có xác thực một số sắp xếp (Bạn không thể tin tưởng bất kỳ nội dung nào của chứng chỉ, đó là bất kỳ ràng buộc nào giữa khóa chung của nó và tên / thuộc tính mà nó chứa.)

Điều này sẽ không hoạt động tốt cho các tệp, nhưng bạn có thể làm điều này cho một ứng dụng (ví dụ: PHP / CGI / ... thậm chí Java nếu bạn chuyển chứng chỉ cho máy chủ Java được ủy quyền). Một cách cơ bản là có một danh sách các khóa công khai đã biết trước hoặc bạn có thể xem các ý tưởng trong FOAF + SSL / WebID .


2

Việc sử dụng SSLVerifyCLient optional_no_ca(thay vì require) khiến apache không kiểm tra CA phát hành (và do đó không cần tệp hoặc đường dẫn chứng chỉ CA). Nó không cho phép khách hàng / người dùng không gửi chứng chỉ, vì vậy việc kiểm tra xem chứng chỉ đã được sử dụng hay chưa phải được thực hiện riêng.

(Rõ ràng, tôi chỉ không đọc kỹ mod_ssltài liệu.)

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.