Tôi có một hệ thống hoạt động đầy đủ, nơi các máy khách dựa trên openssl tương tác với một máy chủ openssl. Mỗi khách hàng có chứng chỉ riêng của mình được xác thực bởi máy chủ. Chứng chỉ đã được tạo bằng openssl (X509, pem). Họ tự ký.Máy khách SslStream không thể hoàn tất việc bắt tay với máy chủ stunnel
Bây giờ tôi muốn viết một khách hàng thử nghiệm dựa trên SslStream. Tôi đã sử dụng ví dụ ứng dụng khách từ lớp SslStream documentation.
Ứng dụng khách SslStream của tôi không thể hoàn thành việc bắt tay. stunnel phàn nàn về client không gửi chứng nhận của nó. Điều này được xác nhận trong Wireshark (Độ dài chứng chỉ: 0 trong các thông báo bắt tay).
Khách hàng của tôi hiển thị các ngoại lệ sau đây:
ngoại lệ Nội: Thông điệp nhận được là bất ngờ hoặc bị định dạng
Đây là cách tôi nạp giấy chứng nhận của tôi:
X509Certificate cert = new X509Certificate2(filename, password);
X509CertificateCollection certColl = new X509CertificateCollection();
certColl.Add(cert);
Tôi đã thử truy xuất chứng chỉ các thuộc tính khác nhau (ví dụ: GetSerialNumberString()). Nó hoạt động. Phương thức Verify trả về false. Đây là điều tiếp theo tôi sẽ điều tra.
Làm thế nào tôi thiết lập SslStream của tôi dường như không thành vấn đề (kết quả tương tự):
sslStream.AuthenticateAsClient(serverName);
SslStream sslStream = new SslStream(
client.GetStream(),
false,
new RemoteCertificateValidationCallback(ValidateServerCertificate),
new LocalCertificateSelectionCallback(SelectLocalCertificate));
Cùng với xác thực:
sslStream.AuthenticateAsClient(serverName);
sslStream.AuthenticateAsClient(serverName,
certColl,
SslProtocols.Tls,
true);
SelectLocalCertificate
được gọi là (hai lần) và trả giấy chứng nhận của tôi. ValidateServerCertificate
hiện không bao giờ được gọi (ngạc nhiên của tôi).
Tôi làm cách nào để gỡ lỗi? Thậm chí tốt hơn nếu bạn có thể giải quyết vấn đề của tôi.
CẬP NHẬT
Tôi đã thêm một chức năng để thực hiện xác nhận chuỗi dựa trên X509Chain example từ tài liệu. Nó hiển thị tất cả các loại thông tin trên chứng chỉ, bao gồm hai thông điệp hấp dẫn:
Element certificate is valid: False
Element error status length: 1
Cuối cùng, tôi không thực sự có nhiều chi tiết hơn khi tôi gọi xác minh.
Đầu ra của openssl verify cert.pem
không báo cáo bất kỳ điều gì bất thường.
error 18 at 0 depth lookup:self signed certificate
OK
CẬP NHẬT
tôi trích ra chìa khóa cá nhân và chứng từ pem, và tôi tạo ra một cert.pfx (pkcs12). Tôi không có vấn đề khi nhập cert.pfx vào kho khóa cá nhân của mình. Trong chi tiết chứng chỉ của tôi, tôi có thể thấy một biểu tượng nhỏ cho biết khóa riêng được đính kèm.
Tôi đã sửa đổi ứng dụng khách của mình để lấy chứng chỉ từ cửa hàng cá nhân của mình. Nhưng tôi nhận được cùng một thất bại chính xác.
Đối với xác thực ứng dụng khách SSL, bạn cần chứng chỉ và khóa. Bạn nên kiểm tra xem tệp PEM có chứa cả hai hay không, nếu không bạn đang thiếu một phần quan trọng. – Robert
PEM chứa chứng chỉ dưới dạng ---- BEGIN CERTIFICATE ----- và khóa riêng dưới khóa ----- BEGIN RSA PRIVATE KEY ----- block. –