我们希望在IIS服务器上的Web API应用程序上通过证书实现身份验证。
我们的客户只是给了我们他们的私钥,他们将使用SSL客户证书访问我们的Web API,其中包括他们的PEM格式的私钥。我们需要从Web API请求中包含的SSL客户端证书中提取私钥,并检查它是否与它们提供的私钥匹配。
我实现了以下代码
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 。代码与上面的代码完全相同,下面的唯一区别是PEM是通过Web API发送的。 注意:我们尝试通过API工具(Paw / Postman)发送PEM
用于提取私钥的Web 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");
有什么主意吗?