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 CertificateRequest
tin nhắn TLS đến máy khách trong quá trình trao tay. Thông báo này chứa certificate_authorities
danh 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 SSLCADNRequestFile
chỉ 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 CA
Chủ đề DN (và Nhà phát hành DN), có thể bằng các khóa khác nhau. Mặc dù SSLCADNRequestFile
chỉ 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_authorities
danh 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 CertificateRequest
thông điệp TLS được sử dụng CN=Dummy CA
trong certificate_authorities
danh 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_VERIFY
biế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 CertificateVerify
tin 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 .