2012-05-22 23 views
8

tôi đã phát triển một dịch vụ tự lưu trữ WCF, mà tôi có hai yêu cầu bảo mật cơ bản vì nó sẽ được truy cập qua Internet:TransportWithMessageCredential không có chứng chỉ đủ an toàn cho dịch vụ WCF?

  • Lớp vận chuyển nên ngăn chặn giả mạo và đánh hơi, đặc biệt là việc thu hồi các chứng thực thông tin đăng nhập. Đây là những gì SSL làm, nhưng từ những gì tôi đã thấy thiết lập SSL đòi hỏi phải cài đặt các chứng chỉ (ngoại trừ có thể thông qua this hack sử dụng các tập tin chứng chỉ đơn giản), mà tôi không muốn phải làm.

  • Lớp xác thực phải bao gồm trình xác thực tên người dùng/mật khẩu.

tôi cấu hình dịch vụ của tôi để sử dụng:

 <security mode="TransportWithMessageCredential"> 
     <message clientCredentialType="UserName" /> 
     <transport clientCredentialType="Basic" /> 
     </security> 

Thậm chí nếu các lớp truyền tải là HTTP (không HTTPS), điều này làm cho WCF tạo một lớp bảo mật tương đương với SSL? Nếu không, sự khác biệt về mặt sức mạnh an ninh là gì?

Ngoài ra, có cách nào để bảo mật điểm cuối dữ liệu meta mà không sử dụng chứng chỉ SSL (không cần thiết nhưng sẽ được đánh giá cao) không?

Đây là mã cấu hình đầy đủ của tôi cho các dịch vụ tự lưu trữ:

<?xml version="1.0"?> 
<configuration> 
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup> 
    <system.serviceModel> 
    <services> 
     <service name="MyService"> 
     <host> 
      <baseAddresses> 
      <add baseAddress = "http://localhost:8000/Services" /> 
      </baseAddresses> 
     </host> 
     <endpoint address ="MyService" binding="wsHttpBinding" contract="IMyService"> 
      <identity> 
      <dns value="localhost"/> 
      </identity> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
     </service> 
    </services> 
    <bindings> 
     <wsHttpBinding> 
     <binding name="Binding1" maxReceivedMessageSize="2147483647"> 
      <security mode="TransportWithMessageCredential"> 
      <message clientCredentialType="UserName" /> 
      <transport clientCredentialType="Basic" /> 
      </security> 
     </binding> 
     </wsHttpBinding> 
    </bindings> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior> 
      <serviceMetadata httpGetEnabled="True"/> 
      <serviceCredentials> 
      <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="CR.Common.Services.CustomValidator, Common" /> 
      </serviceCredentials> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 
</configuration> 

Cảm ơn bạn!

Trả lời

10

Theo mặc định, tất cả bảo mật Kết nối WCF (như wsHttpBinding) sẽ mã hóa và ký thông báo.

Bắt buộc SSL sử dụng chứng chỉ và bản hack trong liên kết bạn cung cấp là hack wcf chứ không phải SSL. Bởi vì không có SSL WCF cấm việc sử dụng basicHttpBinding (mà gửi xml trong rõ ràng) và UserNamePasswordValidator, bởi vì trong trường hợp này bất cứ ai chặn thư có thể nhận được tên người dùng/mật khẩu.

Với WSHttpBinding bạn có thể tránh SSL và đặt bảo mật ở cấp thư.

tôi khuyên bạn đọc this article, đặc biệt là Credentials Dịch vụ và đàm phán chương:

Để hỗ trợ xác thực lẫn nhau và bảo vệ tin nhắn, dịch vụ phải cung cấp thông tin cho người gọi. Khi bảo mật giao thông được sử dụng (SSL), thông tin đăng nhập dịch vụ được thương lượng thông qua giao thức vận chuyển . Thông tin đăng nhập dịch vụ cho bảo mật thư cũng có thể được thương lượng khi sử dụng thông tin đăng nhập Windows; nếu không một giấy chứng nhận dịch vụ phải được xác định

Với UserNamePasswordValidator, bạn phải cấu hình một chứng chỉ trên máy chủ để cho phép các khách hàng các dấu hiệu và mã hóa mỗi tin nhắn (sử dụng khóa công khai của chứng chỉ). Nếu bạn đang sử dụng xác thực Windows, nó sẽ không cần thiết.

Tại sao bạn lo lắng về chứng chỉ?

+0

Tôi chỉ muốn cài đặt đơn giản mà không có chứng chỉ nếu có thể. Một cái gì đó mà máy chủ sẽ yêu cầu một tên người dùng/mật khẩu tùy chỉnh (KHÔNG xác thực Windows) và sau đó đảm bảo tính bảo mật và tính toàn vẹn của thông tin liên lạc. –

+3

Như tôi đã nói với bạn, bạn cần "một cái gì đó" để ký và mã hóa tin nhắn, đó là lý do tại sao bạn UserNamePasswordValidator cần một chứng chỉ. Bạn có thể tìm thấy một số hack mà làm cho nó hoạt động mà không có giấy chứng nhận, nhưng sau đó tin nhắn của bạn sẽ không được ký/mã hóa. Việc cài đặt chứng chỉ khá dễ dàng và bạn cũng có thể sử dụng chứng chỉ tự động được ký (được tạo trên chính máy chủ) để không mất tiền. – Fabske

+1

Tôi đã chỉ sử dụng chứng chỉ máy chủ, mặc dù tôi vẫn tin rằng nó có thể được thực hiện đơn giản hơn cho scenarii giống như tôi. –

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