2012-04-10 30 views
9

Có cách nào để thiết lập ngữ cảnh OpenSSL (SSL_CTX) với tập hợp chứng chỉ CA đáng tin cậy hợp lý mà không cần tự phân phối không? Tôi không muốn có trách nhiệm cập nhật chúng. IMO bất kỳ hệ điều hành hiện đại nào đều phải cung cấp "cho tôi các chứng chỉ CA đáng tin cậy" như một dịch vụ, nhưng tôi không biết đó có phải là trường hợp không.OpenSSL mặc định hợp lý cho chứng chỉ CA đáng tin cậy?

Tôi không ngại viết mã này ba lần (một lần cho Windows, một lần cho Mac OS X, và một lần cho Linux), nhưng tôi muốn giới hạn nó ở đó. Đặc biệt, tôi không muốn viết mã để tìm hiểu xem trình duyệt nào được cài đặt và cố gắng trích xuất các chứng chỉ đáng tin cậy của họ. (Rõ ràng là easy to get this very wrong.)

Câu trả lời cho các phiên bản gần đây của Linux có vẻ là gọi SSL_CTX_load_verify_locations với /etc/ssl/certs/ca-certificates.crt (nếu tệp đó tồn tại).

Có câu trả lời đơn giản nào cho Windows và Mac OS X không?

Trả lời

5

Trên OS X, bạn có thể nhận thông tin về chứng chỉ được người dùng tin cậy từ Keychain của người dùng. Dưới đây là một liên kết có chứa một số thông tin rất tốt về việc thu thập những thông tin sử dụng Cocoa:

Get Certificates in Keychain

Nếu Cocoa không phải là một sự phụ thuộc ok cho nhu cầu của bạn, và bạn muốn làm tất cả mọi thứ trực tiếp từ dòng lệnh, bạn có thể sử dụng tiện ích certtool- xem man certtool và tài liệu trực tuyến khác để tìm hiểu về nó. Để liệt kê tất cả các chứng chỉ trong keychain đăng nhập của người dùng, bạn có thể làm:

certtool y k=login.keychain 

Hoặc để có được một danh sách các built-in rễ hệ thống đáng tin cậy:

certtool y k=/System/Library/Keychains/SystemRootCertificates.keychain 

và có thể

certtool y k=/System/Library/Keychains/SystemCACertificates.keychain 

Tôi chắc rằng có nhiều cách khác để có được thông tin đó bằng cách sử dụng giao diện hệ thống.

Ở phía Linux, có, /etc/ssl/certs/ca-certificates.crt là cách phù hợp để thực hiện. Tệp đó sẽ tồn tại trên các dẫn xuất Debian (trong các biến thể của Ubuntu) khi gói ca-certificates được cài đặt và tôi không chắc chắn làm thế nào để có nó ở đúng trên các hệ thống dựa trên redhat.

+0

Bạn có biết cách 'certtool' hoạt động đối với chứng chỉ được gắn cờ rõ ràng là" không bao giờ tin tưởng "không? – Bruno

+0

Tôi không nghĩ certtool sẽ hiển thị bất cứ điều gì liên quan đến mức độ tin cậy; bạn muốn truy vấn sự tin cậy bằng cách sử dụng một cơ chế khác. Hãy thử 'bảo mật con người 'cho một cách tốt, nếu bạn thực sự sử dụng các công cụ dòng lệnh cho việc này. –

+1

Xem thêm tiện ích certsync của MacPorts (https://trac.macports.org/browser/trunk/dports/security/certsync/#files, mã thực tế nằm trong 'files/certsync.m'), cũng xuất khẩu đáng tin cậy rễ vào một tập tin và không chú ý đến các lá cờ tin cậy (bằng cách không xuất khẩu chúng). – neverpanic

7

Đây là những gì tôi đã kết thúc thực hiện:

Trên Windows: có được giấy chứng nhận từ các cửa hàng giấy chứng nhận Windows "ROOT" sử dụng CertOpenSystemStore, vòng qua chúng bằng cách sử CertEnumCertificatesInStore, lấy giấy chứng nhận nguyên X509-mã hóa từ pbCertEncoded lĩnh vực CERT_CONTEXT , tạo cấu trúc OpenSSL X509 bằng cách sử dụng d2i_X509 và thêm cấu trúc đó vào cửa hàng chứng chỉ OpenSSL bằng cách sử dụng X509_STORE_add_cert. Các chức năng của Windows đều có sẵn từ crypt32.dll.

Trên Mac OS X: có được giấy chứng nhận từ "/System/Library/Keychains/SystemRootCertificates.keychain" keychain sử dụng SecKeychainOpen, tạo ra một iterator cho chứng chỉ trong keychain sử dụng SecKeychainSearchCreateFromAttributes, lặp sử dụng SecKeychainSearchCopyNext, có giấy chứng nhận X509 liệu sử dụng SecItemExport, tạo ra một giấy chứng nhận OpenSSL sử dụng d2i_X509, và thêm nó vào cửa hàng OpenSSL sử dụng X509_STORE_add_cert. Các chức năng của máy Mac có sẵn từ /Systems/Library/Frameworks/Security.framework/Security.

Cách tiếp cận tốt hơn có thể là tạo OpenSSL X509_STORE với gọi lại sử dụng chức năng OS để xác minh chứng chỉ gốc riêng lẻ, thay vì sao chép tất cả chúng, nhưng tôi chưa thử.

+0

Bạn có thể chia sẻ mã không? – proteneer

+0

@proteneer, mã bây giờ là một phần của thư viện openssl Racket ở đây: https://github.com/plt/racket/tree/master/racket/collects/openssl/private –

Các vấn đề liên quan