2009-10-27 33 views
17

Tôi đang tạo một ứng dụng WCF nơi tôi sẽ sử dụng chứng chỉ để mã hóa giao tiếp giữa máy khách và máy chủ. Trong môi trường phát triển của tôi, tôi muốn sử dụng chứng chỉ kiểm tra/chứng chỉ tự ký mà tôi đã tạo bằng makecert. (Chỉ máy chủ sẽ có chứng chỉ, máy khách sẽ không).Tại sao WCF khiếu nại về việc kiểm tra nhận dạng không thành công?

Tôi đã cài đặt chứng chỉ vào cửa hàng chứng chỉ và mọi thứ đều hoạt động tốt. Trên máy khách, certificateValidationMode hiện được đặt thành "false", vì tôi đang làm việc với chứng chỉ kiểm tra.

Vấn đề của tôi:

Trong app.config trên máy khách, tôi cần phải xác định các yếu tố bản sắc như thế này:

<endpoint ... > 
    <identity> 
     <dns value="<Name-Of-Server-Computer>"/> 
    </identity> 
</endpoint> 

Nếu tôi loại bỏ các yếu tố bản sắc, tôi nhận được thông báo lỗi sau trong ứng dụng khách khi tôi cố gắng kết nối với máy chủ:

Kiểm tra nhận dạng không thành công cho thư gửi đi. Danh tính DNS dự kiến ​​của điểm cuối từ xa là 'localhost' nhưng điểm cuối từ xa cung cấp xác nhận quyền sở hữu DNS 'Name-Of-Server-Computer'. Nếu đây là điểm cuối hợp pháp từ xa, bạn có thể khắc phục sự cố bằng cách chỉ định rõ ràng danh tính DNS 'Tên-Of-Máy chủ-Máy tính' làm thuộc tính Identity của EndpointAddress khi tạo proxy kênh.

Vì vậy, đây là câu hỏi của tôi:

  • là việc kiểm tra danh tính chỉ được thực hiện khi sử dụng một thử nghiệm/chứng chỉ tự ký? Khi tôi triển khai ứng dụng của mình bằng cách sử dụng chứng chỉ thực, đáng tin cậy, được mua từ CA, việc kiểm tra danh tính vẫn được thực hiện?

  • Có cách nào để vô hiệu hóa việc kiểm tra danh tính không? Tôi biết tôi có thể tạo trình xác thực chứng chỉ tùy chỉnh của riêng mình, nhưng dường như không có cách nào để ghi đè kiểm tra nhận dạng bằng cách sử dụng các trình xác thực này.

Trả lời

10

Việc kiểm tra được thực hiện luôn - và phải như vậy. Về cơ bản, WCF sẽ kiểm tra rằng chứng chỉ được cấp cho tên miền (yourcompany.com) hoặc tên máy nơi dịch vụ của bạn cư trú. Đây là một kiểm tra bảo mật mà tôi không bao giờ vô hiệu hóa! Nếu không, bất kỳ ai giả mạo dịch vụ của bạn đều có thể sử dụng bất kỳ chứng chỉ nào được tạo cho tên miền/tên máy tùy ý và nhận lưu lượng truy cập của bạn - không phải những gì bạn muốn!

Vì vậy, những gì bạn cần đảm bảo là chứng chỉ thực của bạn trên máy chủ sản xuất thực sự được cấp cho tên miền mà máy chủ sản xuất sẽ là một phần của, ví dụ: nếu máy chủ sản xuất của bạn sẽ nằm trong "production.yourcompany.com", thì chứng chỉ cần phải được thực hiện cho miền đó.

Marc

+0

> "Đây là kiểm tra bảo mật mà tôi không bao giờ tắt!" Chỉ để đảm bảo tôi hiểu. Điều đó có nghĩa rằng có thực sự là một cách để vô hiệu hóa nó? Tôi hiểu lợi ích của việc kiểm tra ... – Nitramk

+1

Tôi chưa bao giờ nghĩ đến việc này, vì vậy tôi không bao giờ cảm thấy muốn kiểm tra xem có cách nào tắt nó đi không. Tôi không biết, xin lỗi. –

24

Câu trả lời cho câu hỏi này nằm trong chính thông báo lỗi. Trên ứng dụng khách, bạn có thể thực hiện:

EndpointIdentity identity = EndpointIdentity.CreateDnsIdentity("Server"); 
EndpointAddress address = new EndpointAddress(new Uri("net.tcp://1.2.3.4:12345/ServiceName"), identity); 

Thay thế "Máy chủ", theo bất kỳ điều gì được mong đợi. Thông thường, đây sẽ là tên chung (CN) của chứng chỉ tự ký của bạn. Làm như vậy sẽ không làm hỏng bảo mật, miễn là bạn chịu mọi trách nhiệm để đảm bảo rằng chứng chỉ được xuất trình hợp lệ, tạo trình xác thực chứng chỉ tùy chỉnh của bạn và thực hiện kiểm tra có liên quan ở đó.

+0

Bạn đã đúng! Câu trả lời này là chính xác. –

3

certificateValidationMã phải được đặt thành "Không", không phải là "false" ...

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