2010-04-16 32 views
7

Tôi đang cố gắng chuyển một ứng dụng khách WCF hiện có để chạy trên Linux dưới Mono. Ngay bây giờ tôi đang thử nghiệm tất cả mọi thứ, tìm ra những gì làm việc trên Mono và những gì không.WCF Mono - BasicHttpBinding với SSL

Khách hàng thực hiện cuộc gọi siêu đơn giản qua basicHttpBinding. Nó hoạt động tốt, cho đến khi tôi kích hoạt SSL (nghĩa là, chỉ định BasicHttpSecurityMode.Transport trong ràng buộc).

  • Chạy trên NET trong Windows, nó hoạt động tuyệt vời
  • Chạy trên Mono trên Ubuntu 9.10/Mono 2,6 tôi nhận được lỗi sau:

Exception in async operation: System.Net.WebException: Error getting response stream (Write: The authentication or decryption has failed.): SendFailure ---> System.IO.IOException: The authentication or decryption has failed. ---> Mono.Security.Protocol.Tls.TlsException: Invalid certificate received from server. Error code: 0xffffffff800b010a

Tôi đã đọc các Mono security FAQ; tuy nhiên chứng chỉ SSL trên máy chủ là từ một CA gốc (chứng chỉ đã mua) - do Cơ quan cấp chứng chỉ bảo mật Equifax cấp. Tôi đã chạy công cụ TlsTest trên bản cài đặt Ubuntu dựa trên URL .svc và không có vấn đề/lỗi. Ngoài ra tôi có thể nhấn dịch vụ tốt trong Firefox (không có cảnh báo bảo mật).

Tôi đang thiếu gì?

Trả lời

2

Tệp TlsTest từ Mono thực sự tốt khi kiểm tra điều này, vì vậy có vẻ hơi ngớ ngẩn khi hỏi - nhưng: Bạn có thể sử dụng WebClient để gửi yêu cầu tới tệp .svc và nhận phản hồi không? Nếu không, có thể vẫn còn vấn đề với chứng chỉ vì một lý do nào đó.

Tôi cũng đoán bạn đã sử dụng công cụ mozroots hoặc certmgr để xác minh CA gốc có ở đó không? Điều gì về việc thêm chứng chỉ rõ ràng trên trang web của bạn vào cửa hàng thông qua certmgr?

Một lời nhắc khác: công cụ certmgr thường hoạt động trên bản sao của chứng chỉ cho người dùng hiện tại, bạn cần chỉ định --machine arg để tất cả người dùng nhận được chứng chỉ.

+0

Cảm ơn câu trả lời của bạn! Tôi đã thử nghiệm bằng cách sử dụng một WebRequest đơn giản với cùng một kết quả. Tuy nhiên tôi nghĩ rằng tôi thấy vấn đề bây giờ - Tôi đã cài đặt Mono 2.6 side-by-side với gói Mono 2.4 đi kèm với Ubuntu 9.10. Tôi đã phải làm điều này, bởi vì các cuộc gọi WCF HTTPS của tôi sẽ luôn thất bại trên 2.4 (Tôi đã nhận được một NotImplementedException từ HttpsTransportBindingElement). Tôi đã thực hiện một ứng dụng thử nghiệm đơn giản tạo ra một WebRequest đơn giản. Khi tôi chạy trong 2.6, nó không thành công với chứng chỉ không hợp lệ. Khi tôi chạy nó trong 2,4, nó hoạt động! Vì vậy, rõ ràng chứng chỉ của tôi không hiển thị với Mono 2.6 ..... – TheNextman

0

Tôi tìm thấy một số thủ thuật để loại bỏ các lỗi:

using System.Security.Cryptography.X509Certificates; 

public class HttpWebRequestClientCertificateTest : ICertificatePolicy { 



    public bool CheckValidationResult (ServicePoint sp, X509Certificate certificate, 

     WebRequest request, int error) 

     { 

      return true; 

     } 

    } 

..... 

ServicePointManager.CertificatePolicy = new HttpWebRequestClientCertificateTest(); 

HttpWebRequest request = ... 

Có lẽ nó sẽ làm việc cho những người khác mà có mà lỗi trong Mono 2.6.

+3

Có, công trình này, và loại bỏ lỗi nhưng nó không khắc phục được sự cố. Bạn không nên sử dụng điều này trong mã sản xuất ... – TheNextman

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