Нам нравится реализовывать аутентификацию по сертификату в нашем приложении Web API, которое находится на нашем сервере IIS.
Наш клиент только что дал нам свой закрытый ключ, и они получат доступ к нашему веб-API с SSL-сертификатом клиента, который включает их закрытый ключ в формате PEM.Нам нужно извлечь закрытый ключ из сертификата клиента SSL, который включен в запрос веб-API, и проверить, соответствует ли он предоставленному им закрытому ключу.
Я реализовал приведенный ниже код
string fileLocation = @"E:\\pem_file_in computer.pem";
string privateKeyFromFile = System.IO.File.ReadAllText(@"E:\\private_key_file.key");
StreamReader sr = new StreamReader(fileLocation);
PemReader pr = new PemReader(sr);
AsymmetricCipherKeyPair KeyPair = (AsymmetricCipherKeyPair)pr.ReadObject();
var writer = new StringWriter();
var pemWriter = new PemWriter(writer);
pemWriter.WriteObject(KeyPair.Private);
string extractedKey = writer.ToString();
if (extractedKey == privateKeyFromFile))
Console.Write("matched");
else
Console.Write("not matched");
И это работает:)
Но, когда я попытался сделать то же самое в Web API, это не сработало.Закрытый ключ, который мы пытались извлечь, всегда равен NULL .Код точно такой же, как указано выше, а разница ONLY для нижеуказанного состоит в том, что PEM отправляется через Web API.Примечание. Мы попытались отправить PEM через API-инструмент (Paw / Postman)
Код веб-API для извлечения секретного ключа, как показано ниже:
X509Certificate2 clientCertInRequest = RequestContext.ClientCertificate;
StreamReader sr = new StreamReader(new MemoryStream(clientCertInRequest.RawData));
PemReader pr = new PemReader(sr);
AsymmetricCipherKeyPair KeyPair = (AsymmetricCipherKeyPair)pr.ReadObject();
var writer = new StringWriter();
var pemWriter = new PemWriter(writer);
pemWriter.WriteObject(KeyPair.Private);
string extractedKey = writer.ToString();
if (extractedKey == privateKeyFromFile))
Console.Write("matched");
else
Console.Write("not matched");
Есть идеи?