我正在为C#中的相互通信编写客户端(实际上是clr / cli)。这样做我面临着问题。当我运行它。
我在post方法中写了以下代码: -
System::Net::ServicePointManager::SecurityProtocol = SecurityProtocolType::Tls12;
HttpClient^ httpClient;
Task<HttpResponseMessage ^> ^ resultTask;
WebRequestHandler ^ clientHandler = gcnew WebRequestHandler();
clientHandler->ClientCertificates->Add(state->ptrClientCert);//add certificate of client provided by server
clientHandler->AuthenticationLevel = System::Net::Security::AuthenticationLevel::MutualAuthRequired;
httpClient = gcnew HttpClient(clientHandler);
httpClient->DefaultRequestHeaders->Accept->Add("application/octet-stream");
HttpContent ^ httpContent = gcnew ByteArrayContent(state->postBody);
httpContent->Headers->ContentType = gcnew MediaTypeHeaderValue("application/octet-stream");
resultTask = httpClient->PostAsync(state->httpRequest, httpContent);
if (resultTask->Wait(DefaultTimeOut))
//wait for finish
{
HttpResponseMessage ^ response = resultTask->Result;
SetResponse(response, state->darkClientRef, state->ptrHttprequest, state->appLog);
}
现在这个代码没有工作,因为它抛出了套接字异常“无法从传输连接读取数据:现有连接被远程主机连接强行关闭”。我的理解是,可能的原因可能是我无法在请求中设置我的私钥,因为服务器提供的客户端证书只有公钥。
现在我的问题是如何在此请求中设置我的私钥(采用PKCS8格式)?
我正在使用.Net framework 4.5.2。
经过我的研究,我发现问题是,我没有在我的X509Certificate中设置我的私钥。我从不同的组件接收私钥。根据我的理解,以下方式是设置私钥的正确方法。
WebRequestHandler ^ clientHandler = gcnew WebRequestHandler();
X509Certificates::X509Certificate2^ modCert = gcnew X509Certificates::X509Certificate2(state->ptrClientCert);
RSACryptoServiceProvider ^ rsaProvider;
rsaProvider = RSAConverter::DecodePrivateKeyInfo(privateKey);
modCert->PrivateKey = rsaProvider;
clientHandler->ClientCertificates->Add(modCert);
我使用以下链接实现了DecodePrivateKeyInfo函数: -
http://www.jensign.com/opensslkey/opensslkey.cs
但是这个函数无法解析我的私钥(由openssl创建),因为它在CompareBytearrays函数中失败了。 有人可以帮我说明如何在X509证书中设置这个PKCS8格式密钥?