C# SslCredentials и защита данных при использовании gRPC

204
03 октября 2018, 22:00

При использовании gRPC (новая технология от google, которая по своей сути является следующим витком развития REST) пытаюсь использовать root certificate + .pfx key (certificate chain) для защиты передаваемых данных. Приложение стоит на Windows Server 2012 R2.

Для защиты запроса используется объект SslCredentials, который состоит из:

  • "string containing PEM encoded server root certificates" (1)
  • и другого объекта "key certificate pair".

"key certificate pair" состоит из двух стрингов:

  • "PEM encoded certificate chain" (2)
  • "PEM encoded private key"(3)

Подробно в документации по АПИ.

Проблема в том, что после получения данных из хранилища сертификатов я собираю эти данные в 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);

Пока пытаюсь сделать "просто, что бы работало", так что не судите строго. Подскажите пожалуйста, что не так?

READ ALSO
Сохранение файлов Cookies в ChromiumWebBrowser

Сохранение файлов Cookies в ChromiumWebBrowser

При установке значения CefSettingsCachePath я логично наблюдаю появление в указанной директории кучи файлов представляющих разные журналы логирования...

182
Поле, подобное chekedlistbox

Поле, подобное chekedlistbox

Нужно создать поле, подобное checkedlistbox, но с возможностью пользователя изменять в нем текстКак это сделать без большого количества дополнительных...

176
C помощью Linq не могу получить правильную выборку

C помощью Linq не могу получить правильную выборку

Есть следующая задачаНужно выбрать из данной таблицы следующее:

180