【问题标题】:Not able to consume Zoopla webservice in c#无法在 c# 中使用 Zoopla webservice
【发布时间】:2016-12-11 08:56:51
【问题描述】:

我想使用 Web 服务 (https://realtime-listings-api.webservices.zpg.co.uk/sandbox/v1/listing/list) 并按照那里的文档 (https://realtime-listings.webservices.zpg.co.uk/docs/latest/documentation.html) 我必须发送 .crt 和 .pem 文件进行身份验证。 我能够加载 .crt 文件,但对于 .pem 我收到错误 Cannot find the requested object 。我尝试了不同的方法来加载 PEM 文件。

我关注了以下线程,但仍然无法从 .pem 文件加载 X509Certificate

我的代码如下

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;

现在到这里一切都好,如果我尝试加载 .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));
        }

我在这里遇到错误 Cannot find the requested object 。 其余代码如下

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;
                    }

我已尝试以下线程以供参考 how to get private key from PEM file?

http://pages.infinit.net/ctech/20040812-0816.html

【问题讨论】:

  • 错误信息是什么?
  • 有两个错误信息..第一个我无法到达.crt文件的路径..第二个错误是连接底层关闭
  • 是的.. 它适用于 .crt 但不适用于 .pem
  • 那么GetBytesFromPEM 工作正常吗?你不是要我们调试小段代码,对吧?你在哪一行得到了异常?
  • 请发布实际的异常转储。

标签: c# .net web-services cryptography


【解决方案1】:

如果您的证书已经加载到您的证书存储中,那么您可以执行以下操作:

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,将证书添加到本地计算机存储的控制台),浏览到您的证书,右键单击它并选择所有任务 > 管理私钥和授予用户帐户您的应用程序将在对证书私钥的“读取”访问权限下运行,您无需打开任何文件即可执行此操作。

当然,如果您是在无法访问证书或无法将其安装到证书存储区的共享托管环境中执行此操作,那就是另一个问题了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多