Информация об изменениях

Сообщение Re: Самый опасный конструктор в .NET от 17.02.2020 11:15

Изменено 17.02.2020 13:29 Jericho113

Re: Самый опасный конструктор в .NET
Здравствуйте, Danchik, Вы писали:

D>Привет, вот набрел на реддите.

D>Касается конструктора X509Certificate2
D>https://snede.net/the-most-dangerous-constructor-in-net/

Спасибо за информацию очень полезно.
Не увере что у меня та же ситуация что и в статье по ссылке но вот замечаю такую закономерность
1) Есть EC2 инстансы в AWS на которых крутится WebAPI2 сервис (.NET 4.7.2 ) который при старте один раз вычитывает из AWS ParamStore сертификаты и импортит их как
X509Certificate2 x509Cert2;
x509Certificate2.Import(rawCertificateBinaryData, password, X509KeyStorageFlags.MachineKeySet);

2) по ходу работы, сервис много раз обращается к сертификатам, НО, т.к. сертификат каждый раз нужно освобождать,
то напрямую его взять не получится и поэтому перед его использованием делаю копию
var originalCert = GetCertificate(...);
using(var certToUse = new X509Certificate2((X509Certificate) originalCert))
using (RSACryptoServiceProvider privateKey = (RSACryptoServiceProvider) certToUse.PrivateKey)
{
    return privateKey.Decrypt(value, true)
}


И вот со временем(порядка 2-3 дней после рестарта/редеплоя) WebAPI2 сервис начинает кидать странные ошибки из метода Decrypt
at System.Security.Cryptography.Utils.CreateProvHandle(CspParameters parameters, Boolean randomKeyContainer)
   at System.Security.Cryptography.Utils.GetKeyPairHelper(CspAlgorithmType keyType, CspParameters parameters, Boolean randomKeyContainer, Int32 dwKeySize, SafeProvHandle& safeProvHandle, SafeKeyHandle& safeKeyHandle)
   at System.Security.Cryptography.RSACryptoServiceProvider.GetKeyPair()
   at System.Security.Cryptography.RSACryptoServiceProvider..ctor(Int32 dwKeySize, CspParameters parameters, Boolean useDefaultKeySize)
   at System.Security.Cryptography.X509Certificates.X509Certificate2.get_PrivateKey()
....


Насколько я понял такие ошибки могут быть связаны с тем что у юзера под которым крутится сервис внезапно пропадают права на доступ к
%ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\Keys но как то они странно эти права пропадают спустя 2-3 дня нормальной работы..
проверил никто не реконфигурировал сервис и не вносил иных любых изменений в EC2 инстанс.

Кто-либо сталкивался с подобным повереднием или же это я один такой удачливый?
x509certificate2 .net
Re: Самый опасный конструктор в .NET
Здравствуйте, Danchik, Вы писали:

D>Привет, вот набрел на реддите.

D>Касается конструктора X509Certificate2
D>https://snede.net/the-most-dangerous-constructor-in-net/

Спасибо за информацию очень полезно.
Не увере что у меня та же ситуация что и в статье по ссылке но вот замечаю такую закономерность
1) Есть EC2 инстансы в AWS на которых крутится WebAPI2 сервис (.NET 4.7.2 ) который при старте один раз вычитывает из AWS ParamStore сертификаты и импортит их как
X509Certificate2 x509Cert2;
x509Certificate2.Import(rawCertificateBinaryData, password, X509KeyStorageFlags.MachineKeySet);

2) по ходу работы, сервис много раз обращается к сертификатам, НО, т.к. сертификат каждый раз нужно освобождать,
то напрямую его взять не получится и поэтому перед его использованием делаю копию
var originalCert = GetCertificate(...);
using(var certToUse = new X509Certificate2((X509Certificate) originalCert))
using (RSACryptoServiceProvider privateKey = (RSACryptoServiceProvider) certToUse.PrivateKey)
{
    return privateKey.Decrypt(value, true)
}


И вот со временем(порядка 2-3 дней после рестарта/редеплоя) WebAPI2 сервис начинает кидать странные ошибки из метода Decrypt
"Keyset does not exist"

at System.Security.Cryptography.Utils.CreateProvHandle(CspParameters parameters, Boolean randomKeyContainer)
   at System.Security.Cryptography.Utils.GetKeyPairHelper(CspAlgorithmType keyType, CspParameters parameters, Boolean randomKeyContainer, Int32 dwKeySize, SafeProvHandle& safeProvHandle, SafeKeyHandle& safeKeyHandle)
   at System.Security.Cryptography.RSACryptoServiceProvider.GetKeyPair()
   at System.Security.Cryptography.RSACryptoServiceProvider..ctor(Int32 dwKeySize, CspParameters parameters, Boolean useDefaultKeySize)
   at System.Security.Cryptography.X509Certificates.X509Certificate2.get_PrivateKey()
....


Насколько я понял такие ошибки могут быть связаны с тем что у юзера под которым крутится сервис внезапно пропадают права на доступ к
%ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\Keys но как то они странно эти права пропадают спустя 2-3 дня нормальной работы..
проверил никто не реконфигурировал сервис и не вносил иных любых изменений в EC2 инстанс.

Кто-либо сталкивался с подобным повереднием или же это я один такой удачливый?
.net x509certificate2