繁体   English   中英

“无法建立 SSL 连接,请参阅内部异常。” 对于 POST 请求(.net 6)

[英]"The SSL connection could not be established, see inner exception." For POST Request(.net 6)

首先,问题的标题可能看起来像重复。 但是我在 SO 尝试了所有可能的解决方案,但没有任何效果。 最有趣的是,相同的代码适用于 .net framework-4.x。

证书和密钥有效,因为具有相同.crt 和.key 的相同代码正在工作。

var certPath = _fileProvider.Combine(_fileProvider.MapPath("~/Plugins/Payments.CityBankApi/"), "othoba.crt");
var keyPath = _fileProvider.Combine(_fileProvider.MapPath("~/Plugins/Payments.CityBankApi/"), "othoba.key");
    
    
string certificateText = File.ReadAllText(certPath);
string privateKeyText = File.ReadAllText(keyPath);
    
    
    
ICertificateProvider provider = new CertificateFromFileProvider(certificateText, privateKeyText, true);
    
var certificate = provider.Certificate;
string accessTokenUrl = string.Empty;
accessTokenUrl = "https://sandbox.thecitybank.com:7788/transaction/token";
    
    
var handler = new HttpClientHandler();
handler.ClientCertificates.Add(certificate);
handler.ServerCertificateCustomValidationCallback +=(sender, certificate, chain, errors) => {
                        return true;
                    };
string json = JsonConvert.SerializeObject(new
{
   userName = _cityBankPaymentSettings.UserName,
   password = _cityBankPaymentSettings.Password
});
var httpContent = new StringContent(json, Encoding.UTF8, "application/json");    
var client = new HttpClient(handler);
var result = client.PostAsync(accessTokenUrl, httpContent).GetAwaiter().GetResult();

我需要从 httpclient 转移到 restclient。 由于 api 调用在 postman 和 postman 工作,因此使用 RestSharp。 链接对我解决问题有很大帮助。 下面是工作代码。

var certPath = _fileProvider.Combine(_fileProvider.MapPath("~/Plugins/Payments.CityBankApi/"), "othoba.pfx");

string tokenUrl = "https://ecomm-webservice.thecitybank.com:7788/transaction/token";
string crtPassword = _cityBankPaymentSettings.CrtPasswordProduction;

if (!_cityBankPaymentSettings.ProductionMode)
{
  tokenUrl = "https://sandbox.thecitybank.com:7788/transaction/token";
  crtPassword = _cityBankPaymentSettings.CrtPasswordSandBox;
}

var client = new RestClient(tokenUrl);
client.Timeout = -1;
X509Certificate2 certificate = new X509Certificate2(certPath, crtPassword);
client.ClientCertificates = new X509CertificateCollection() { certificate};
client.RemoteCertificateValidationCallback += (s, cert, chain, sslPolicyErrors) => true; //Important without this line it does not work.
var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/json");
var body = JsonConvert.SerializeObject(new
           {
                    userName = _cityBankPaymentSettings.UserName,
                    password = _cityBankPaymentSettings.Password
           });

request.AddParameter("application/json", body, ParameterType.RequestBody);
IRestResponse response = await 
client.ExecuteAsync(request);
var cityBankAccessToken = JsonConvert.DeserializeObject<CityBankAccessTokenResponeModel>(response.Content);

对于从.ctr 和.key 生成.pfx,我需要在要生成.pfx 的文件夹中编写以下命令。 我使用 git bash 执行命令。

//openssl pkcs12 -export -out createorder.pfx -in createorder.crt -inkey createorder.key -password pass:02468

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM