2009-11-09 35 views
6

Tôi đang làm việc trên dịch vụ WCF tự lưu trữ mà thông tin liên lạc được mã hóa là một tùy chọn. Mọi thứ hoạt động tốt khi chứng chỉ đã được gắn với cổng như được mô tả here.Ràng buộc chứng chỉ SSL vào cổng theo cách lập trình

Tuy nhiên, tôi muốn tránh yêu cầu người dùng chạy công cụ dòng lệnh. Có cách nào ràng buộc có thể được thực hiện theo chương trình? Có lẽ sử dụng WMI?

Trả lời

4

Tôi tin rằng cách tạo đặt chỗ không gian tên HTTP.SYS là thông qua API không được quản lý HttpSetServiceConfiguration(); vì vậy bạn sẽ cần một số P/Invoke cho điều đó. Có một số mã mẫu có thể hữu ích trong cột one of MSDN của Keith Brown.

+0

Tôi đang bỏ phiếu này vì Tomas là người đầu tiên và về cơ bản chúng tôi đã nói điều tương tự. :) –

+0

Liên kết bài viết của Ken Brown giờ đã chết. Có thể tải xuống ở đây mặc dù - http://web.archive.org/web/20121214083056/http://msdn.microsoft.com/en-us/magazine/cc163531.aspx – tjmoore

1

Có, nhưng bạn phải tự mình sử dụng the HTTP API mà hiện tại không có trình bao bọc .NET, vì vậy bạn phải sử dụng P/Invoke. Cụ thể tôi nghĩ bạn đang tìm kiếm HttpSetServiceConfiguration với id cấu hình HttpServiceConfigSSLCertInfo.

2

MSDN documentation, số MSDN column của Keith Brown và pinvoke.net giúp tôi hầu hết mọi cách. Nhưng nhận được PSOCKADDR trong chính xác HTTP_SERVICE_CONFIG_SSL_KEY là khó khăn. Tôi tìm thấy Beej's Guide to Network Programming rất hữu ích trong việc tìm ra những gì nó nên giống như. Tôi đã có thể sử dụng .NET SocketAddress và sau đó sao chép các byte vào một mảng có thể được sắp xếp lại.

// serialize the endpoint to a SocketAddress and create an array to hold the values. Pin the array. 
SocketAddress socketAddress = ipEndPoint.Serialize(); 
byte[] socketBytes = new byte[socketAddress.Size]; 
GCHandle handleSocketAddress = GCHandle.Alloc(socketBytes, GCHandleType.Pinned); 

// Should copy the first 16 bytes (the SocketAddress has a 32 byte buffer, the size will only be 16, which is what the SOCKADDR accepts 
for (int i = 0; i < socketAddress.Size; ++i) 
{ 
    socketBytes[i] = socketAddress[i]; 
} 
Các vấn đề liên quan