2012-07-13 13 views
5

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.

+0

Đố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

+0

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. –

Trả lời

4

Giải pháp là nhập chứng chỉ gốc CA của tôi trên máy tính Windows của tôi. Khách hàng của tôi hiện có thể hoàn thành việc bắt tay!

Tìm giải pháp bằng cách tìm kiếm ví dụ SslStream hoàn chỉnh hơn. Cảm ơn http://geekswithblogs.net/luskan/archive/2007/10/01/115758.aspx.

+0

Bạn phải cài đặt chứng chỉ CA gốc trong Windows Store trong thư mục Trusted Authorities và bạn cũng phải tải chứng chỉ ứng dụng khách từ cửa sổ windows, nó không hoạt động trong khi tải chứng chỉ ứng dụng từ tệp. Vì vậy, cả khách hàng và máy chủ gốc CA phải được trong cửa hàng Windows. Cảm ơn – AlexandruC

+0

Windows/.NET không cho phép bạn sử dụng khóa riêng nếu nó không có trong kho chứng chỉ. Đó là do thiết kế. –