问题描述
我一直在尝试集成一个https协议的支付uat服务url,目前无法成功实现
我会详细说明。
我在支付服务的顶部创建了一个包装服务来使用它,我们一直在用soap ui工具对其进行测试。直接在soap ui工具中触发时的uat url以及凭据、标题值、.pfx文件并且请求模型正在运行。
请看下图。
这是一个uat服务器。这是一个rest api。请求是xml。
请求应包含凭据、标头值和证书(.pfx 文件),所有这些都在代码中传递。
我们收到了类似的错误
- 无法为具有授权的 SSL/TLS 建立安全通道
- 400 未找到
- 500 内部服务器
- 目前我们收到的错误是远程服务器返回错误:(401) 未经授权
我们目前使用的代码
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 服务器中的应用程序映射。请检查下面的图片链接
请让我们知道我们在这里遗漏了什么。
引用此链接
Sending a HttpWebRequest with PFX Certificate C#
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)