2009-07-09 39 views
14

Tôi có một ứng dụng đang sử dụng RSACryptoServiceProvider để giải mã một số dữ liệu bằng khóa riêng đã biết (được lưu trữ trong một biến).Hệ thống nhận dạng mã hóa RSACryptoServiceProvider không thể tìm thấy tệp được chỉ định trong ASP.NET

Khi IIS Application Pool được cấu hình để sử dụng Dịch vụ mạng, mọi thứ đều chạy tốt.

Tuy nhiên, khi chúng ta cấu hình IIS Application Pool để chạy mã theo một bản sắc khác nhau, chúng tôi nhận được như sau:

System.Security.Cryptography.CryptographicException: The system cannot find the file specified. 

    at System.Security.Cryptography.Utils.CreateProvHandle(CspParameters parameters, Boolean randomKeyContainer) 
    at System.Security.Cryptography.RSACryptoServiceProvider.ImportParameters(RSAParameters parameters) 
    at System.Security.Cryptography.RSA.FromXmlString(String xmlString) 

Mã này là một cái gì đó như thế này:

byte[] input; 
byte[] output; 
string private_key_xml; 

var provider = new System.Cryptography.RSACryptoServiceProvider(this.m_key.Key_Size); 
provider.FromXmlString(private_key_xml); // Fails Here when Application Pool Identity != Network Service 

ouput = provider.Decrypt(input, false); // False = Use PKCS#1 v1.5 Padding 

Có tài nguyên cố gắng trả lời bằng cách tuyên bố rằng bạn nên cấp cho người dùng quyền truy cập đọc vào kho khóa máy - tuy nhiên không có câu trả lời dứt khoát nào để giải quyết vấn đề này.

Môi trường: IIS 6.0, Windows Server 2003 R2, NET 3.5 SP1

Trả lời

9

Thật vậy bạn cần phải làm việc một mã như thế này

CspParameters _cpsParameter; 
RSACryptoServiceProvider RSAProvider; 

_cpsParameter = new CspParameters(); 
_cpsParameter.Flags = CspProviderFlags.UseMachineKeyStore; 

RSAProvider = new RSACryptoServiceProvider(1024, _cpsParameter); 

Người sử dụng sau đây cần truy cập vào thư mục: C: \ Documents and Settings \ All Users \ Application Data \ Microsoft \ Crypto \ RSA \ MachineKeys

  1. Tài khoản người dùng IIS (ẩn danh)
  2. Tài khoản người dùng bạn dùng để mạo danh ứng dụng của mình trong cài đặt web.config.

Vì vậy, bây giờ nó làm việc tốt cho tôi.

+0

Cảm ơn câu trả lời - Tôi chưa có cơ hội để thử nghiệm điều này. Bạn có biết nếu tài khoản mới theo mặc định (cài đặt cửa sổ sạch) có quyền truy cập vào tài khoản này chưa? Chúng tôi đang cố gắng tránh phải sửa đổi quá nhiều - và điều này có vẻ giống như một vấn đề đặc biệt bizzare cho một cái gì đó nên chạy dưới sự tin tưởng thấp/trung bình. –

+0

Tôi không chắc chắn! Vấn đề đặc biệt này chỉ xảy ra với máy của tôi. Tôi đã thử một máy phát triển khác và mọi thứ hoạt động như dự định. Trong máy chủ, các hệ thống của chúng tôi chạy theo ngữ cảnh người dùng khác nhau, vì vậy tôi cũng không gặp vấn đề gì. –

8

Hãy thử thiết lập

System.Security.Cryptography.RSACryptoServiceProvider.UseMachineKeyStore = true; 

EDIT: Sau đó, hãy thử sử dụng

var provider = new System.Security.Cryptography.RSACryptoServiceProvider(); 

thay vì các nhà xây dựng với tham số nguyên. Nhà xây dựng đó cố gắng tạo ra một khóa có độ dài khóa được chỉ định và bạn có thể không thực hiện được điều đó với các quyền của mình.

+0

nó không thay đổi gì cả. –

+0

Điều này làm việc cho tôi trên IIS7 với bản sắc ứng dụng mặc định. –

+2

Có vẻ như bạn cũng có thể gọi "RSACryptoServiceProvider mới (các CspParameters mới {Flags = CspProviderFlags.UseMachineKeyStore})" nếu bạn không muốn kích hoạt cờ toàn cầu. –

28

Tôi đã sửa lỗi này bằng cách đặt "Tải hồ sơ người dùng" thành True (là False) trong phần Mô hình thiết lập/quy trình nâng cao của Hồ bơi ứng dụng.

Ứng dụng đã hoạt động hoàn hảo trên Server 2003 R2/IIS 6 và sự cố xuất hiện khi tôi định cấu hình nó trên máy chủ R2 mới của chúng tôi.

Got ý tưởng để thử nó tại địa chỉ:

http://social.msdn.microsoft.com/forums/en-US/clr/thread/7ea48fd0-8d6b-43ed-b272-1a0249ae490f/

YMMV

+1

Điều đó làm việc cho tôi, cảm ơn! :) –

+0

Điều này là do các khóa được lưu trữ trong DPAPI http://security.stackexchange.com/q/1771/396 – LamonteCristo

+0

Cảm ơn, đã làm việc cho tôi trên máy chủ, nhưng không phải cục bộ, tôi lang thang vì sao. Tôi đọc chức năng này cố gắng truy cập vào lưu trữ khóa và không thành công do quyền, mặc dù mã không sử dụng cần lưu trữ khóa. –

1

Tôi chỉ muốn nhận xét rằng giải pháp Rasmus Faber đã làm việc cho tôi (với một sửa đổi nhỏ):

System.Cryptography.RSACryptoServiceProvider.UseMachineKeyStore = true; 
RSACryptoServiceProvider provider = new System.Cryptography.RSACryptoServiceProvider(); 

Tôi đã cố gắng lấy MailBee.net để ký một tin nhắn gửi đi bằng DKIM và nhận được cùng một thông điệp mà OP nhận được. Tất nhiên mọi thứ đều ổn trên máy tính của tôi, nhưng khi tải lên máy khách webhost của tôi, tôi đã gặp phải vấn đề này. Như tôi đã nói, giải pháp trên đã làm việc cho tôi trong khi những người khác mà tôi tìm thấy trực tuyến (bao gồm cả liên kết diễn đàn msdn ở trên) thì không.

(Tôi muốn upvote và nhận xét, nhưng tôi không có đủ đại diện để làm như vậy.: P)

Cảm ơn Rasmus Faber!

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