Возможный дубликат:
Запрос был прерван: не удалось создать безопасный канал SSL/TLS
Я пытаюсь отправить http-запрос с сертификатом на стороне клиента. Файл, в данном случае
.p12
. Однако, когда он достигает строки responseStream = httpRequest.GetRequestStream();
, он выдает WebException: System.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel.
Я отлаживаю это на IIS7.5 (в Windows 7), где идентификатор пула приложений является "LocalSystem".
Как решить эту проблему?
System.IO.Stream responseStream = null;
string errorString = string.Empty;
;
string postData = string.Empty;
HttpWebRequest httpRequest = null;
System.Text.Encoding Encoding = new System.Text.UTF8Encoding();
try
{
XmlDocument orderXml = new XmlDocument();
orderXml.Load(@"c:\xmlfile.xml");
postData = orderXml.InnerXml;
byte[] byte1 = Encoding.GetBytes(postData);
httpRequest = (HttpWebRequest)WebRequest.Create("https://testurl.com/SOAP_v1_0/");
httpRequest.Method = "POST";
httpRequest.Timeout = 9000;
httpRequest.KeepAlive = false;
httpRequest.ContentType = "text/xml; charset=" + "utf-8";
httpRequest.ContentLength = byte1.Length;
X509Certificate2 certificate = new X509Certificate2(@"c:\file.p12", "password", X509KeyStorageFlags.Exportable);
X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
try
{
store.Open(OpenFlags.ReadWrite);
if (!store.Certificates.Contains(certificate))
{
store.Add(certificate);
}
int indexOfCertificate = store.Certificates.IndexOf(certificate);
certificate = store.Certificates[indexOfCertificate];
}
finally
{
store.Close();
}
httpRequest.ClientCertificates.Add(certificate);
responseStream = httpRequest.GetRequestStream();
responseStream.Write(byte1, 0, byte1.Length);
}
catch (WebException webExcp)
{
errorString += "Error message: " + webExcp.Message;
// Get the WebException status code.
WebExceptionStatus status = webExcp.Status;
if (status == WebExceptionStatus.ProtocolError)
{
// Get HttpWebResponse so that you can check the HTTP status code.
HttpWebResponse httpResponse = (HttpWebResponse)webExcp.Response;
errorString += "; The server returned protocol error " + httpResponse.StatusCode + " - " + httpResponse.StatusCode;
httpResponse.Close();
}
}
catch (Exception e)
{
errorString += "Error message: " + e.Message;
}
finally
{
if (responseStream != null)
{
responseStream.Close();
}
}
}
При работе с журналом трассировки это строки, указывающие на ошибку:
System.Net Information: 0 : [4968] SecureChannel#2399524 - Certificate is of type X509Certificate2 and contains the private key.
System.Net Information: 0 : [4968] AcquireCredentialsHandle(package = Microsoft Unified Security Protocol Provider, intent = Outbound, scc = System.Net.SecureCredential)
System.Net Error: 0 : [4968] AcquireCredentialsHandle() failed with error 0X8009030D.
System.Net Information: 0 : [4968] AcquireCredentialsHandle(package = Microsoft Unified Security Protocol Provider, intent = Outbound, scc = System.Net.SecureCredential)
System.Net Error: 0 : [4968] AcquireCredentialsHandle() failed with error 0X8009030D.
System.Net.Sockets Verbose: 0 : [4968] Socket#59311937::Dispose()
System.Net Error: 0 : [4968] Exception in the HttpWebRequest#50160154:: - The request was aborted: Could not create SSL/TLS secure channel.
System.Net Error: 0 : [4968] Exception in the HttpWebRequest#50160154::EndGetRequestStream - The request was aborted: Could not create SSL/TLS secure channel.