Как использовать открытый ключ для подписи сертификата с помощью C# .NET
Я должен отправить полезную нагрузку xml в клиентский веб-сервис. Клиент предоставил мне URL-адрес, сертификат и открытый ключ. Файл сертификата и открытого ключа находится в файле .der. Я пишу приложение командной строки на C#, чтобы выполнить эту задачу. Я очень признателен, если бы кто-то мог указать мне правильное направление, как подписать сертификат с помощью открытого ключа provide в файле der.
Что я уже пробовал:
Вот пример кода, который я написал до сих пор.
public string postXMLData(string destinationUrl, string requestXml) { Constants.Logger.InfoFormat(@"Posting XMLData To URL : {0}", destinationUrl); string responseStr = null; HttpWebResponse response = null; HttpWebRequest request = null; Stream requestStream = null; try { X509Certificate cert = X509Certificate.CreateFromCertFile(String.Format(@"{0}\{1}", DEFAULT_CERT_LOCATION, CERTIFATE_FILE_NAME)); request = (HttpWebRequest)WebRequest.Create(destinationUrl); byte[] bytes; bytes = System.Text.Encoding.UTF8.GetBytes(requestXml); request.ContentType = "application/xml; encoding='utf-8'"; request.ContentLength = bytes.Length; request.Method = "POST"; request.KeepAlive = false; request.UserAgent = null; request.Timeout = 99999; request.ReadWriteTimeout = 99999; request.ServicePoint.MaxIdleTime = 99999; request.ClientCertificates.Add(cert); /*request.ServerCertificateValidationCallback += (sender, certificate, chain, error) => { return certificate.GetCertHashString() == "xxxxxxxxxxxxxxxx"; }; */ System.Net.ServicePointManager.CertificatePolicy = new TrustAllCertificatePolicy(); Constants.Logger.InfoFormat(@"Getting Request Stream....."); requestStream = request.GetRequestStream(); Constants.Logger.InfoFormat(@"Writing To Request Stream....."); requestStream.Write(bytes, 0, bytes.Length); Constants.Logger.InfoFormat(@"Writing To Request Stream.....Done."); requestStream.Close(); Constants.Logger.InfoFormat(@"Closing Request Stream.....Done."); Constants.Logger.InfoFormat(@"Waiting For Response....."); response = (HttpWebResponse)request.GetResponse(); Constants.Logger.InfoFormat(@"Response Code : {0}", response.StatusCode); using (Stream responseStream = response.GetResponseStream()) { responseStr = new StreamReader(responseStream).ReadToEnd(); } Constants.Logger.InfoFormat(@"Response Data : ", responseStr); } catch (Exception ex) { Constants.Logger.ErrorFormat(@"Error Posting data to the stream : {0}", ex); //throw ex; } finally { if (response != null) { response.Close(); } if(requestStream != null) { requestStream.Close(); } } return responseStr; }
public class TrustAllCertificatePolicy : System.Net.ICertificatePolicy { public TrustAllCertificatePolicy() { } public bool CheckValidationResult(ServicePoint sp, System.Security.Cryptography.X509Certificates. X509Certificate cert, WebRequest req, int problem) { return true; } }