繁体   English   中英

C# RestSharp 客户端证书获取异常“无法建立 SSL 连接”

[英]C# RestSharp Client Certificate getting exception "The SSL connection could not be established"

我在 C# .Net Core 3.1 和 .Net Standard 库中编程,代码所在的位置。

我没有使用 RestSharp 获取我的 http 请求,并且客户端证书没有安装在服务器/计算机上,我将无法访问稍后将运行的服务器/计算机。

我的代码:

 // Create a RestSharp RestClient objhect with the base URL var client = new RestClient(_baseAPIUrl); // Create a request object with the path to the payment requests var request = new RestRequest("swish-cpcapi/api/v1/paymentrequests"); // Create up a client certificate collection and import the certificate to it X509Certificate2Collection clientCertificates = new X509Certificate2Collection(); clientCertificates.Import(_certDataBytes, _certificatePassword, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet); // Add client certificate collection to the RestClient client.ClientCertificates = clientCertificates; //X509Certificate2 certificates = new X509Certificate2(_certDataBytes, _certificatePassword); //client.ClientCertificates = new X509CertificateCollection() { certificates }; // Add payment request data request.AddJsonBody(requestData); var response = client.Post(request); var content = response.Content;

我已经做了我可以在互联网上找到的一切,并且我使用了带有自己生成的证书的服务测试环境,并在那里生成了我自己的生产环境,结果相同..

我已经测试了 TLS 1.1 或 TLS 1.2 进行测试,他们在自己的 curl 示例中指定了 TLS 1.1。

有人知道吗?

2020 年 1 月 8 日更新 - 我从服务技术支持那里得到信息,他们只看到我发送了一个证书,但是当我尝试调试和检查 X509Certificate2Collection 时,我发现了 3 个证书。 但他们说他们只看到一个?

恕我直言,如果您尝试访问的服务是通过 SSL 证书保护的,并且需要公钥/私钥,那么如果没有证书,您将无法访问它。 如果这是要保护的服务的意图,我认为您只能检查服务运行状况检查或最多检查服务是否可访问(没有客户端证书)

但就像 HTTPS 一样,如果您可以从浏览器访问服务 URL,例如访问他们的元数据或简单的 GET 或其他内容,则您可以尝试从浏览器下载证书。 在 Chrome 中,您可能会在 URL 之前看到一个锁定符号(安全图标)。 单击它,您可能会下载公共证书。 你可以在你的机器上安装它并尝试。

如果该服务具有 pub 证书并且访问不需要客户端证书,则上述选项可能有效。 我希望您正在安装 CERT 并通过您的代码从有权访问该证书的帐户访问它。 假设您在 LocalSystem 下安装了证书,那么您可能需要从代码/解决方案获得管理员访问权限才能访问该证书路径。 或者将证书安装在 current_user 路径下。

作为第一步,我会检查是否能够从浏览器访问该服务。

这是,仅从我从您的问题中了解到。 再次,如果您可以解释该服务是否是基于公钥/私钥的受保护服务,则您需要具有访问权限/证书才能使用该服务。

更新:通过创建演示 api 和演示客户端来使用客户端证书,我已经尝试了几个选项。 根据我从您的查询中了解到的情况,我认为以下可能是您可以尝试的一些选项。

// --- using the cert path if you have the path (instead of the byte[])
var myCert = new X509Certificate2("<path to the client cert.cer/.pfx>", "secure-password", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet);
X509CertificateCollection clientCerts = new X509CertificateCollection();
clientCerts.Add(myCert);

或者

var certStore = new X509Store(StoreName.Root, StoreLocation.LocalMachine); //replace with appropriate values based on your cert configuration
certStore.Open(OpenFlags.ReadOnly);

//option 1 (ideally a client must have the cert thumbprint instead of a password 
var cert = certStore.Certificates.Find(X509FindType.FindByThumbprint, "<cert Thumbprint>", false);

//option 2 (explore other options based on X509NameTypes
var cert = certStore.Certificates.OfType<X509Certificate2>()
                    .FirstOrDefault(cert => cert.GetNameInfo(X509NameType.DnsName, false) == "mycompany.dns.name.given in the cert");

client.ClientCertificates = new X509CertificateCollection(cert);

我建议生成您自己的证书

public static void MakeCert()
{
    var ecdsa = ECDsa.Create(); // generate asymmetric key pair
    var req = new CertificateRequest("cn=foobar", ecdsa, HashAlgorithmName.SHA256);
    var cert = req.CreateSelfSigned(DateTimeOffset.Now, DateTimeOffset.Now.AddYears(10));

    // Create PFX (PKCS #12) with private key
    File.WriteAllBytes("c:\\temp\\mycert.pfx", cert.Export(X509ContentType.Pfx, "P@55w0rd"));

    // Create Base 64 encoded CER (public key only)
    File.WriteAllText("c:\\temp\\mycert.cer",
        "-----BEGIN CERTIFICATE-----\r\n"
        + Convert.ToBase64String(cert.Export(X509ContentType.Cert), Base64FormattingOptions.InsertLineBreaks)
        + "\r\n-----END CERTIFICATE-----");
}

然后添加到请求

        var client = new RestClient(url);

        client.ClientCertificates = new X509CertificateCollection();
        client.ClientCertificates.Add(new X509Certificate2("c:\\temp\\mycert.cer"));

暂无
暂无

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

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