2009-02-06 3 views
2

Наш веб-сервис обертывает стороннюю библиотеку, содержащую следующий код.Файл не найден на RSACryptoServiceProvider, разрешения учетной записи службы?

Мы используем учетную запись службы Active Directory в пуле приложений IIS 6 (без интерактивных возможностей входа). Наш сервис выходит из строя с ошибкой «Система не может найти указанный файл». Мы проследили эту ошибку с помощью «RSACryptoServiceProvider provider = new RSACryptoServiceProvider();». Третий сборщик зависит от x509-файлового сертификата для его процесса шифрования, а учетная запись службы имеет доступ для чтения/записи к папке ключей. Кроме того, учетная запись службы имеет чтение, запись, изменение прав на «C: \ Documents and Settings \ All Users \ Application Data \ Microsoft \ Crypto \ RSA \ MachineKeys».

Код:

StringBuilder builder = new StringBuilder(publicKeyData); 
builder.Replace("-----BEGIN CERTIFICATE-----", ""); 
builder.Replace("-----END CERTIFICATE-----", ""); 
X509Certificate2 certificate = new X509Certificate2(Convert.FromBase64String(builder.ToString())); 

string xmlString = certificate.PublicKey.Key.ToXmlString(false); 

RSACryptoServiceProvider provider = new RSACryptoServiceProvider(); //BOOM 
CspKeyContainerInfo containerInfo = provider.CspKeyContainerInfo; 

provider.PersistKeyInCsp = false; 
provider.FromXmlString(xmlString); 
loadedKeys.Add(key, provider); 
provider2 = provider; 

Мы приоткрыл FileMon и заметил, что есть файл не найден для этого AppPool, а затем еще УСПЕХА для точно такой же файл.

Я из моей стихии, у кого-нибудь есть идея, почему мы это видим?

ответ

0

Причина, по которой вы видите это, заключается в том, что поставщик RSACryptoService открывает эксклюзивную блокировку в хранилище ключей. Это не имеет значения, если вы читаете сертификат, используя результаты объекта в замке

Два способа вокруг него:

  1. Использование не-Microsoft RSA стек.
  2. использовать lock() при доступе к объекту.

Я столкнулся с тем же и закончил тем, что написал свой собственный набор функций RSA.

Вы также можете настроить сходство профиля пользователя в пуле ASP.NET; таким образом вместо этого будет использовано хранилище ключей пользователя

1

Я не имею ни малейшего представления о том, что вызывает ошибку, но вместо XML-кодирования и -decoding открытого ключа, вы можете просто сделать:

StringBuilder builder = new StringBuilder(publicKeyData); 
builder.Replace("-----BEGIN CERTIFICATE-----", ""); 
builder.Replace("-----END CERTIFICATE-----", ""); 
X509Certificate2 certificate = new X509Certificate2(Convert.FromBase64String(builder.ToString())); 

RSACryptoServiceProvider provider = 
    (RSACryptoServiceProvider) certificate.PublicKey.Key; 

loadedKeys.Add(key, provider); 
provider2 = provider; 

Если вам повезет, что работы- вокруг ошибки.

Смежные вопросы