При использовании gRPC (новая технология от google, которая по своей сути является следующим витком развития REST) пытаюсь использовать root certificate + .pfx key (certificate chain) для защиты передаваемых данных. Приложение стоит на Windows Server 2012 R2.
Для защиты запроса используется объект SslCredentials, который состоит из:
"key certificate pair" состоит из двух стрингов:
Подробно в документации по АПИ.
Проблема в том, что после получения данных из хранилища сертификатов я собираю эти данные в X509Chain, но при попытке приведения к стрингу получаю какой-то дикий ексепшн:
System.Security.AccessControl.PrivilegeNotHeldException: "Процесс не обладает необходимой для выполнения данной операции привилегией "SeSecurityPrivilege"
Получаю X509Certificate2Collection из хранилища :
private static string CertId = "CertId";
public static X509Certificate2Collection GetCertificate()
{
X509Store store = new X509Store(StoreName.My ,StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
X509Certificate2Collection cert = store.Certificates.Find(X509FindType.FindBySerialNumber, CertId, true);
store.Close();
return cert;
}
Далее полученные сертификаты конвертируем в нужный нам PEM формат:
X509Certificate2Collection certCollection = GetCertificate();
var pfx = certCollection.Export(X509ContentType.Pfx, "password");
var cert = certCollection.OfType<X509Certificate>().FirstOrDefault();
if (cert != null)
{
string pemCert = ExportToPEM(cert);//(1)
}
if (pfx != null)
{
string pemKey = ExportToPEMPrivateKey(pfx);
}
Ну и финал:
X509Certificate2 certificate = collection[0];
X509Chain ch = new X509Chain();
ch.Build(certificate);
ch.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck; //экспериментально
ch.ChainPolicy.VerificationFlags = X509VerificationFlags.IgnoreWrongUsage; //экспериментально
string chaintString = ch.SerializeToString();
/*System.Security.AccessControl.PrivilegeNotHeldException:
"Процесс не обладает необходимой для выполнения данной операции привилегией "SeSecurityPrivilege"."*/
KeyCertificatePair key = new KeyCertificatePair(chaintString, PemKey);
SslCredentials sslCred = new SslCredentials(PemCert, key);
Channel _Channel = new Channel(WebConfigurationManager.AppSettings["AutantificationServer"],
Convert.ToInt32(WebConfigurationManager.AppSettings["AutentificationPort"]), sslCred);
client = new SignAPI.SignAPIClient(_Channel);
Пока пытаюсь сделать "просто, что бы работало", так что не судите строго. Подскажите пожалуйста, что не так?
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
При установке значения CefSettingsCachePath я логично наблюдаю появление в указанной директории кучи файлов представляющих разные журналы логирования...
Нужно создать поле, подобное checkedlistbox, но с возможностью пользователя изменять в нем текстКак это сделать без большого количества дополнительных...
Есть следующая задачаНужно выбрать из данной таблицы следующее: