C# 无法使用c中的ZooplaWebService
我想使用一个web服务,并按照那里的文档 我必须发送.crt和.pem文件进行身份验证。 我可以加载.crt文件,但对于.pem,我遇到了找不到请求对象的错误。我尝试了不同的方法来加载PEM文件 我遵循了以下线程,但仍然无法从.pem文件加载X509Certificate 我的代码如下C# 无法使用c中的ZooplaWebService,c#,.net,web-services,cryptography,C#,.net,Web Services,Cryptography,我想使用一个web服务,并按照那里的文档 我必须发送.crt和.pem文件进行身份验证。 我可以加载.crt文件,但对于.pem,我遇到了找不到请求对象的错误。我尝试了不同的方法来加载PEM文件 我遵循了以下线程,但仍然无法从.pem文件加载X509Certificate 我的代码如下 var webAddr = "https://realtime-listings-api.webservices.zpg.co.uk/sandbox/v1/listing/list";
var webAddr = "https://realtime-listings-api.webservices.zpg.co.uk/sandbox/v1/listing/list";
var httpWebRequest = (HttpWebRequest)WebRequest.Create(webAddr);
httpWebRequest.ContentType = "application/json; profile=http://realtime-listings.webservices.zpg.co.uk/docs/v1.1/schemas/listing/list.json";
httpWebRequest.Method = "POST";
httpWebRequest.ClientCertificates.Add(X509Certificate.CreateFromCertFile(@"E:\ProcessZooplaData\zpg_realtime_listings_14810206-20261204.crt"));
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
string json = "{\"branch_reference\":\"test\"}";
streamWriter.Write(json);
streamWriter.Flush();
}
var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
var result = streamReader.ReadToEnd();
//return result;
}
现在,直到这里,一切都好了,如果我尝试加载.pem文件,那么我会出错
var pem = System.IO.File.ReadAllText(@"E:\\ProcessZooplaData\\private.pem");
byte[] certBuffer = GetBytesFromPEM(pem, "RSA PRIVATE KEY");
var certificate = new X509Certificate(certBuffer);
httpWebRequest.ClientCertificates.Add(certificate);
byte[] GetBytesFromPEM(string pemString, string section)
{
var header = String.Format("-----BEGIN {0}-----", section);
var footer = String.Format("-----END {0}-----", section);
var start = pemString.IndexOf(header, StringComparison.Ordinal);
if (start < 0)
return null;
start += header.Length;
var end = pemString.IndexOf(footer, start, StringComparison.Ordinal) - start;
if (end < 0)
return null;
return Convert.FromBase64String(pemString.Substring(start, end));
}
我已经尝试了以下线程作为参考
如果您的证书已加载到证书存储中,则可以执行以下操作:
var requestHandler = new WebRequestHandler();
var store = new X509Store("My", StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
var certificates = store.Certificates.Find(X509FindType.FindBySubjectDistinguishedName, certificateName, true);
if (certificates.Count > 0)
requestHandler.ClientCertificates.Add(certificates[0]);
else
throw new Exception(string.Format("Can't find certificate {0}", certificateName));
using (var client = new HttpClient(requestHandler))
{
do work!
}
它应该将存储中的证书添加到连接中
然后,您需要在证书运行mmc中打开证书存储,将证书添加到本地计算机存储的控制台,浏览到您的证书,右键单击它并选择“所有任务”>“管理私钥”并授予用户帐户您的应用程序将在对证书私钥的读取访问权限下运行,并且您无需打开任何文件即可执行此操作
当然,如果您在共享托管环境中执行此操作,而您无法访问证书或无法将其安装到证书存储中,则这是另一个问题。如果您的证书已加载到证书存储中,则可以执行以下操作:
var requestHandler = new WebRequestHandler();
var store = new X509Store("My", StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
var certificates = store.Certificates.Find(X509FindType.FindBySubjectDistinguishedName, certificateName, true);
if (certificates.Count > 0)
requestHandler.ClientCertificates.Add(certificates[0]);
else
throw new Exception(string.Format("Can't find certificate {0}", certificateName));
using (var client = new HttpClient(requestHandler))
{
do work!
}
它应该将存储中的证书添加到连接中
然后,您需要在证书运行mmc中打开证书存储,将证书添加到本地计算机存储的控制台,浏览到您的证书,右键单击它并选择“所有任务”>“管理私钥”并授予用户帐户您的应用程序将在对证书私钥的读取访问权限下运行,并且您无需打开任何文件即可执行此操作
当然,如果您在共享主机环境中执行此操作,而您无法访问证书或无法将其安装到证书存储中,则这是另一个问题。错误消息是什么?有两条错误消息。。首先,我无法访问.crt文件的路径。。第二个错误是连接基础关闭。。它为.crt工作,但不为.pemSo GetBytesFromPEM工作正常吗?你不是要我们调试那一小段代码吧?您得到的异常是哪一行?请发布实际的异常转储。错误消息是什么?有两条错误消息。。首先,我无法访问.crt文件的路径。。第二个错误是连接基础关闭。。它为.crt工作,但不为.pemSo GetBytesFromPEM工作正常吗?你不是要我们调试那一小段代码吧?您得到的异常是哪一行?请发布实际的异常转储。