2009-05-01 28 views
12

Tôi đang cố sử dụng lớp HttpListener trong ứng dụng C# để có một máy chủ web nhỏ phục vụ nội dung qua SSL. Để làm điều này, tôi cần sử dụng công cụ httpcfg. Tôi có tệp .pfx với cặp khóa công khai và riêng tư của mình. Nếu tôi nhập cặp khóa này bằng tay bằng cách sử dụng mmc vào cửa hàng máy cục bộ, mọi thứ đều hoạt động tốt. Tuy nhiên, nếu tôi nhập cặp khóa này bằng cách lập trình sử dụng lớp X509Store, tôi không thể kết nối với máy chủ web mini của mình. Lưu ý rằng trong cả hai phương thức, cert được nhập vào kho lưu trữ MY trong LocalMachine. Thật kỳ lạ, tôi có thể xem chứng chỉ bằng mmc khi tôi lập trình nhập nó và khi tôi xem nó, giao diện người dùng chỉ ra rằng khóa cá nhân cũng có sẵn cho chứng chỉ này.Nhập chứng chỉ với khóa riêng lập trình

Đào sâu hơn một chút, tôi nhận thấy rằng khi nhập thủ công cặp khóa, tôi có thể thấy một tệp mới xuất hiện trong C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys, nhưng không xuất hiện khi tôi nhập theo chương trình. Trên ghi chú có liên quan, khi tôi xóa chứng chỉ được nhập theo cách thủ công, nó sẽ không xóa tệp khóa cá nhân tương ứng khỏi thư mục được đề cập trước đó.

Cuối cùng, câu hỏi của tôi là: Khi tôi lập trình thêm chứng chỉ vào cửa hàng, khóa cá nhân được lưu trữ ở đâu và tại sao không truy cập được lớp HttpListener (HttpApi)?

Lưu ý rằng câu hỏi này có liên quan một chút nhưng tôi không nghĩ rằng permissioning là vấn đề vì đây là tất cả được thực hiện như là người dùng Windows giống nhau: How to set read permission on the private key file of X.509 certificate from .NET

Trả lời

28

Ok, tôi đã tìm ra. Nó phải làm với các thông số lưu trữ khóa cho đối tượng chứng chỉ. Đối với bất kỳ ai khác gặp sự cố này, hãy đảm bảo bạn xây dựng các đối tượng X509Certificate2 mà bạn đang thêm vào cửa hàng bằng cách sử dụng các cờ X509KeyStorageFlags.PersistKeySetX509KeyStorageFlags.MachineKeySet. Điều này sẽ buộc khóa cá nhân tồn tại ở vị trí bộ khóa máy được yêu cầu bởi HttpApi (HttpListener kết thúc tốt đẹp này).

+0

Hãy đánh dấu câu trả lời này là câu trả lời – Developer

+0

Rất tiếc, tôi phải chờ 48 giờ trước khi tôi có thể làm như vậy vào thời điểm đó tôi có thể sẽ quên làm điều đó. :( – Jason

+6

Tôi lãng phí khoảng 30 phút cố gắng tìm ra lý do tại sao "X509KeyStorageFlags.MachineKeySet & X509KeyStorageFlags.PersistKeySet" không hoạt động. Tất nhiên, nó phải là "X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet". Rõ ràng, chỉ trong trường hợp người khác –

0

Đây có phải là một cách 2 SSL? Nếu sau đó bạn gửi qua tệp Yêu cầu chứng chỉ SSL được tạo trên máy của bạn? Tệp Yêu cầu chứng chỉ này sẽ được sử dụng để tạo SSL và chúng cùng tạo thành một cặp khóa riêng tư công khai.

Bạn cũng thử gán quyền cert cho tài khoản người dùng đang được sử dụng để chạy ứng dụng web? Bạn có thể làm điều này bằng cách sử dụng công cụ Microsoft WSE 3.0.

+0

Tôi chỉ đang sử dụng cặp khóa tự tạo để thử nghiệm vào lúc này để có yêu cầu chứng nhận này liên quan. Tôi đã không chơi với bất kỳ điều khoản liên quan nào được nêu ra kể từ khi tất cả điều này đang được thực hiện như là cùng một người dùng (cert nhập khẩu và chạy các máy chủ web). Không có IIS hoặc bất cứ điều gì khác có liên quan. – Jason

+0

Điều đó nên đã đọc "không có yêu cầu chứng nhận liên quan". – Jason

0

Không chính xác câu trả lời cho câu hỏi của bạn, nhưng đây để tham khảo của người khác đi xuống con đường này:

Here là một liên kết đến một cuộc trò chuyện MS cung cấp cho mẫu mã C# để làm những gì httpcfg hiện, do đó loại bỏ sự cần cho công cụ triển khai.

+0

Cảm ơn, đó là một liên kết tốt.Tóm lại, tôi chỉ xem xét cách sử dụng cấu trúc URLACL_SET chứ không phải cấu trúc SSL_SET cần thiết để quản lý cấu hình SSL trong kịch bản của tôi. Thật không may là cấu trúc SSL_SET khá phức tạp hơn một chút vì vậy nó đơn giản trở nên cồng kềnh để làm việc với và thực thi httpcfg thuận tiện hơn. – Jason

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