gpt4 book ai didi

c# - 从 .NET Core 调用 VISA API 时出错

转载 作者:太空宇宙 更新时间:2023-11-03 14:26:19 26 4
gpt4 key购买 nike

我正在尝试从 .NET Core 向 VISA api 发出 GET 请求,但我在 WebException 中收到以下错误消息

The credentials supplied to the package were not recognized visa

VISA API 支持双向 SSL 连接,为此,visa 会颁发一组私钥和证书以及一对用户 ID 和密码。

我根据 VISA 文档使用以下命令创建了一个 p12 证书文件。

openssl pkcs12 -export -in cert.pem -inkey "privateKey.pem" 
-certfile cert.pem -out myProject_keyAndCertBundle.p12

然后我编写了以下代码来向 VISA API 发出请求。我将此代码作为 .NET Core 控制台应用程序的一部分运行。

public string MakeHelloWorldCall()
{
string requestURL = "https://sandbox.api.visa.com/vdp/helloworld";

string userId = ConfigurationManager.AppSettings["userId"];
string password = ConfigurationManager.AppSettings["password"];
string certificatePath = ConfigurationManager.AppSettings["cert"];
string certificatePassword = ConfigurationManager.AppSettings["certPassword"];
string statusCode = "";

HttpWebRequest request = WebRequest.Create(requestURL) as HttpWebRequest;
request.Method = "GET";

request.Headers["Authorization"] = GetBasicAuthHeader(userId, password);

var certificate = new X509Certificate2(certificatePath, certificatePassword);
request.ClientCertificates.Add(certificate);

try
{
// Make the call
// This is the line which throws the exception.
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
statusCode = response.StatusCode.ToString();
}
}
catch (WebException e)
{
Console.WriteLine(e.Message);
Exception ex = e.InnerException;

while(ex != null)
{
Console.WriteLine(ex.Message);
ex = ex.InnerException;
}

if (e.Response is HttpWebResponse)
{
HttpWebResponse response = (HttpWebResponse)e.Response;
statusCode = response.StatusCode.ToString();
}
}

return statusCode;
}

private string GetBasicAuthHeader(string userId, string password)
{
string authString = userId + ":" + password;
var authStringBytes = Encoding.UTF8.GetBytes(authString);
string authHeaderString = Convert.ToBase64String(authStringBytes);
return "Basic " + authHeaderString;
}

我在控制台中看到以下输出。

The SSL connection could not be established, see inner exception. The credentials supplied to the package were not recognized
The SSL connection could not be established, see inner exception.
The credentials supplied to the package were not recognized

所以根本错误是无法识别提供给包的凭据

我几乎被困在这里,因为我不确定是什么导致了这个错误。

我尝试在 Google 和 SO 上搜索此错误。但是大多数帖子怀疑没有足够的权限来访问证书。但是我正在使用管理员用户帐户运行 Visual Studio,而且我使用的是证书文件,而不是机器上安装的证书。

我想任何有双向 SSL 连接和/或 VISA API 经验的人都能够理解此错误背后的确切原因。

编辑:我能够从配置了相同.p12 证书和授权 header 的 SOAP UI 成功调用 API。

最佳答案

最后,我能够解决这个问题。

我做了以下两件事来达成决议。

  1. 使用 HttpClient 而不是 HttpWebRequest 来发出 API 请求。感谢@Fred。
  2. 我没有使用证书文件,而是在当前用户证书存储区的机器上安装了证书。

以下是工作代码。

public string MakeHelloWorldCallUsingHttpClient()
{
string requestURL = "https://sandbox.api.visa.com/vdp/helloworld";

string userId = ConfigurationManager.AppSettings["userId"];
string password = ConfigurationManager.AppSettings["password"];
string apiResponse = "";

HttpClientHandler clientHandler = new HttpClientHandler();

HttpClient httpClient = new HttpClient(clientHandler);
httpClient.DefaultRequestHeaders.Authorization
= new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", GetBasicAuthHeaderValue(userId, password));
try
{
// Make the call
var response = httpClient.GetAsync(requestURL).Result;

if (response.StatusCode == HttpStatusCode.OK)
{
apiResponse = response.Content.ReadAsStringAsync().Result;
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
Exception ex = e.InnerException;
while (ex != null)
{
Console.WriteLine(ex.Message);
ex = ex.InnerException;
}
}
return apiResponse;
}

private string GetBasicAuthHeaderValue(string userId, string password)
{
string authString = userId + ":" + password;
var authStringBytes = Encoding.UTF8.GetBytes(authString);
return Convert.ToBase64String(authStringBytes);
}

以下是我现在从 API 获得的输出。

{"timestamp":"2019-07-01T14:02:22","message":"helloworld"}

以下代码行确保从当前用户的证书存储中找到客户端证书。

clientHandler.ClientCertificateOptions = ClientCertificateOption.Automatic;

将上面的 ClientCertificateOptions 设置为 ClientCertificateOption.Manual 需要将证书手动添加到 clientHandler.ClientCertificates,如下所示。

var certificate = new X509Certificate2(certificatePath, certificatePassword);
clientHandler.ClientCertificates.Add(certificate);

这会导致与我目前面临的错误相同的错误。

这让我认为让框架找到客户端证书最符合利益。

关于c# - 从 .NET Core 调用 VISA API 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56836425/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com