gpt4 book ai didi

c# - 使用不在证书存储区中的客户端证书

转载 作者:可可西里 更新时间:2023-11-01 07:42:55 25 4
gpt4 key购买 nike

我正在尝试使用我的客户端证书针对 WebService 验证我自己,但是,由于某些原因(我解释),我不想从商店加载证书,而是从光盘读取它。

以下内容:

// gw is teh WebService client
X509Certificate cert = new X509Certificate(PathToCertificate);
_gw.ClientCertificates.Add(ClientCertificate());
ServicePointManager.ServerCertificateValidationCallback = (a,b,c,d) => true;
_gw.DoSomeCall();

总是返回 403 - 服务未授权我。但是,当我将该证书保存到 CertStore 中时,它就起作用了。 (如 MSDN 中所述。)

是否可以使用商店外的证书?

(原因是,我的 windows 服务(客户端)有时会调用 web 服务(服务器),并且在未指定的时间后,该服务“忘记”了我的证书并且没有对服务器进行授权,没有明显的原因)

最佳答案

PathToCertificate 是什么类型的文件?如果它只是一个 .cer 文件,它将不包含证书的私钥,并且尝试将该证书用于 SSL/TLS 将失败。

但是,如果您有包含证书的公钥和私钥的 PKCS7 或 PKCS12 文件,您的代码将起作用(如果私钥有密码,您可能需要使用带密码的重载)。

为了测试这个,我去了http://www.mono-project.com/UsingClientCertificatesWithXSP并按照这些说明创建了我的 client.p12 文件。我还使用 HttpListener 创建了一个简单的 HTTPS 服务器进行测试。

然后我将以下程序编译成“client.exe”并运行如下:

 client.exe https://<MYSSLSERVER>/ client.p12 password

其中client.p12是之前生成的PKCS12文件,'password'是我为证书私钥设置的密码。

using System;
using System.IO;
using System.Net;
using System.Security.Cryptography.X509Certificates;
using System.Text;

public class HttpWebRequestClientCertificateTest : ICertificatePolicy {

public bool CheckValidationResult (ServicePoint sp, X509Certificate certificate,
WebRequest request, int error)
{
return true; // server certificate's CA is not known to windows.
}

static void Main (string[] args)
{
string host = "https://localhost:1234/";
if (args.Length > 0)
host = args[0];

X509Certificate2 certificate = null;
if (args.Length > 1) {
string password = null;
if (args.Length > 2)
password = args [2];
certificate = new X509Certificate2 (args[1], password);
}

ServicePointManager.CertificatePolicy = new HttpWebRequestClientCertificateTest ();

HttpWebRequest req = (HttpWebRequest) WebRequest.Create (host);
if (certificate != null)
req.ClientCertificates.Add (certificate);

WebResponse resp = req.GetResponse ();
Stream stream = resp.GetResponseStream ();
StreamReader sr = new StreamReader (stream, Encoding.UTF8);
Console.WriteLine (sr.ReadToEnd ());
}
}

如果您想让我上传测试双方使用的服务器代码和证书,请告诉我。

关于c# - 使用不在证书存储区中的客户端证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1643636/

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