使用 TLS/SSL 证书从 http 迁移到 https

问题描述

我一直在尝试集成一个https协议的支付uat服务url,目前无法成功实现

我会详细说明。

我在支付服务的顶部创建了一个包装服务来使用它,我们一直在用soap ui工具对其进行测试。直接在soap ui工具中触发时的uat url以及凭据、标题值、.pfx文件并且请求模型正在运行。

请看下图。

uat url response

这是一个uat服务器。这是一个rest api。请求是xml。

请求应包含凭据、标头值和证书(.pfx 文件),所有这些都在代码中传递。

我们收到了类似的错误

  1. 无法为具有授权的 SSL/TLS 建立安全通道
  2. 400 未找到
  3. 500 内部服务器
  4. 目前我们收到的错误是远程服务器返回错误:(401) 未经授权

application response

我们目前使用的代码

 private static dynamic SendRequest(string url,string ReqModel,string method,bool IsAuthorise,string UCICMethod)
        {


            byte[] bytes;
            bytes = System.Text.Encoding.ASCII.GetBytes(ReqModel);

            ServicePointManager.Expect100Continue = true;
            //ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            ServicePointManager.ServerCertificateValidationCallback = (snder,cert,chain,error) => true;
           
            
            string certName = HttpContext.Current.Server.MapPath("CertificateFolder/star_muthootapps.pfx");
            string password = @"123";
            dynamic Response = null;
            HttpWebRequest serviceRequest = (HttpWebRequest)WebRequest.Create(url);
            serviceRequest.Method = method;
            serviceRequest.UseDefaultCredentials = false;
            //HttpRequestCachePolicy noCachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore);
            //serviceRequest.CachePolicy = noCachePolicy;
          


            X509Certificate2 certif = new X509Certificate2(certName,password);

            //serviceRequest.ClientCertificates.Add(certificates[0]);
            serviceRequest.ClientCertificates.Add(certif);
            serviceRequest.Credentials = new NetworkCredential(ConfigurationManager.AppSettings["serviceclientuser_YesBank"].ToString().Trim(),ConfigurationManager.AppSettings["serviceclientpass_YesBank"].ToString().Trim());
            


            if (method != "GET")
            {
                //serviceRequest.ContentType = "application/xml";
                serviceRequest.ContentType = "text/xml";
                serviceRequest.ContentLength = bytes.Length;
                Stream requestStream = serviceRequest.GetRequestStream();
                requestStream.Write(bytes,bytes.Length);
                requestStream.Close();

                //using (var streamWriter = new StreamWriter(serviceRequest.GetRequestStream()))
                //{
                //    streamWriter.Write(ReqModel);
                //    streamWriter.Flush();
                //    streamWriter.Close();
                //}
            }

           

            var clientid = ConfigurationManager.AppSettings["X-IBM-Client-Id_YesBank"].ToString().Trim();
            var clientpassd = ConfigurationManager.AppSettings["X-IBM-Client-Secret_YesBank"].ToString().Trim();

            if (IsAuthorise)
            {
                serviceRequest.Headers.Add("X-IBM-Client-Id",clientid);
                serviceRequest.Headers.Add("X-IBM-Client-Secret",clientpassd);
            }


         
            HttpWebResponse serviceResponse;
            try
            {
                serviceResponse = (HttpWebResponse)serviceRequest.GetResponse();
         
                if (serviceResponse.StatusCode == HttpStatusCode.OK)
                {
                    using (var FetchedDatastreamReader = new StreamReader(serviceResponse.GetResponseStream()))
                    {
                        Response = JsonConvert.DeserializeObject<dynamic>(FetchedDatastreamReader.ReadToEnd());
                    }
                }

                return new 
                {
                    Success = false,Message = "Response Failed",DataResponse = Response
                };
            }
            catch (Exception ex)
            {
                return new 
                {
                    Success = false,Message = ex.Message.ToString()
                };
            }
        }

在 catch 块中执行异常时。

在服务器中我们做了以下事情

我们在证书本地存储中添加了证书,并在 IIS 服务器中的服务器证书选项中添加了 pfx 文件,然后将证书与 IIS 服务器中的应用程序映射。请检查下面的图片链接

certificate root IIS Server

请让我们知道我们在这里遗漏了什么。

引用此链接

Sending a HttpWebRequest with PFX Certificate C#

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)