Member 13735157 Ответов: 0

Как использовать открытый ключ для подписи сертификата с помощью 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;
        }
    }

0 Ответов