2016-11-19 2 views
0

Когда я получить доступ сертификата из файловой системы, либо локально, либо на лазурном сайте, с помощью следующего кода, у меня нет никаких проблем:Keyset не существует при доступе сертификата лазурного веба-сайте

X509Certificate2 certificate = new X509Certificate2(keyFilePath, "mysecret", X509KeyStorageFlags.MachineKeySet | 
        X509KeyStorageFlags.PersistKeySet | 
        X509KeyStorageFlags.Exportable); 

Однако, когда я следую инструкциям на https://azure.microsoft.com/en-us/blog/using-certificates-in-azure-websites-applications/ для использования лазурь хранилище сертификатов, все работает в течение первых 3 до 9 запросов, и все последующие вызовы обязательно на следующей строке

var rsa = certificate.PrivateKey as RSACryptoServiceProvider; 

с «System.Security ошибки. Криптография. Криптографическое исключение: Ke yset не существует "до тех пор, пока сайт не будет перезапущен, а затем будет работать по меньшей мере на 3 запроса.

Я сбив с толку, почему он работает как минимум на 3 и до 9 запросов, а затем всегда с ошибкой. Буду признателен за любые советы.

ответ

1

При загрузке с PFX вы указываете PersistKeySet, который обычно должен устанавливаться только при планировании сохранения сертификата в хранилище сертификатов. Хотя возможно, что какой-то аспект кода пробовал быть умным и очищать собственный секретный ключ от его собственного, маркируя объект RS12ryptoServiceProvider PersistKeyInCsp до false.

Причина, по которой я указываю, что ошибка «Ключ не существует» почти всегда означает, что «хранилище сертификатов было сказано, что существует закрытый ключ, но кто-то с тех пор удалил его, не сообщив о хранилище сертификатов». Наиболее вероятным виновником является то, что где-то устанавливают PersistKeyInCsp в false (что означает «удалить файл ключа в Dispose/Finalize»).

Если вы устанавливаете PersistKeyInCsp в false, но не удаляете объект вручную, вы получите отложенную очистку из-за финализатора, что объясняет, почему это 3-9 успешных результатов вместо детерминированного числа.

(я чувствую себя вынужденным отметить, что вы должны использовать cert.GetRSAPrivateKey() вместо cert.PrivateKey, потому что а) это типобезопасный и б) это звонящий принадлежит срок службы (вы должны утилизировать его), а общий/неоднозначным продолжительность жизни. Это делает вещи немного более предсказуемыми, хотя почти никогда не возвращает RSACryptoServiceProvider, поэтому вы не должны пытаться их отличать)

+0

Спасибо. Я смог «исправить» проблему, не установив для параметра PersistKeyInCsp значение false. К сожалению x509Certificates и криптография находятся вне моей рулевой рубки; код, с которым я работаю, - это библиотека, которую мы нашли в Интернете, для создания токенов для Google firebase. В то время как я сейчас разблокирован, ясно, что я должен кое-что рассмотреть как внутреннюю работу этого, и не рассматривать эту библиотеку как черный ящик. –

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