gpt4 book ai didi

c# - 强制 HttpClient 信任单个证书

转载 作者:可可西里 更新时间:2023-11-01 08:46:13 33 4
gpt4 key购买 nike

你能强制 HttpClient 只信任一个证书吗?

我知道你能做到:

WebRequestHandler handler = new WebRequestHandler();
X509Certificate2 certificate = GetMyX509Certificate();
handler.ClientCertificates.Add(certificate);
HttpClient client = new HttpClient(handler);

但这会强制它只信任那个单一的证书,还是会信任那个证书和所有 fx 的证书。 GlobalSign 可以验证吗?

基本上我想确保它只能是我的客户端正在与之通信的服务器/证书。

最佳答案

Can you force HttpClient to only trust a single certificate? ... Basically I want to ensure that it can ONLY be my server/certificate that my client is talking to.

是的。但是什么类型的证书?服务器还是 CA?两者的示例如下。

此外,在服务器的情况下,固定公钥而不是证书可能更好。这是因为一些组织,如谷歌,每 30 天左右轮换一次他们的服务器证书,以便为移动客户端保持较小的 CRL。但是,组织将重新验证相同公钥。


这是从 Use a particular CA for a SSL connection 固定 CA 的示例.它要求将证书放入证书存储区。您可以在您的应用中随身携带 CA。

static bool VerifyServerCertificate(object sender, X509Certificate certificate,
X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
try
{
String CA_FILE = "ca-cert.der";
X509Certificate2 ca = new X509Certificate2(CA_FILE);

X509Chain chain2 = new X509Chain();
chain2.ChainPolicy.ExtraStore.Add(ca);

// Check all properties (NoFlag is correct)
chain2.ChainPolicy.VerificationFlags = X509VerificationFlags.NoFlag;

// This setup does not have revocation information
chain2.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck;

// Build the chain
chain2.Build(new X509Certificate2(certificate));

// Are there any failures from building the chain?
if (chain2.ChainStatus.Length == 0)
return false;

// If there is a status, verify the status is NoError
bool result = chain2.ChainStatus[0].Status == X509ChainStatusFlags.NoError;
Debug.Assert(result == true);

return result;
}
catch (Exception ex)
{
Console.WriteLine(ex);
}

return false;
}

没有想出如何默认使用这个链(上面的chain2),这样就不需要回调了。也就是说,将它安装在 ssl 套接字上,连接就会“正常工作”。

而且我没有想出如何安装它以便将其传递到回调中。也就是说,我必须为回调的每次调用构建链,因为我的 chain2 没有作为 chain 传递到函数中。


这是从 OWASP 的 Certificate and Public Key Pinning 固定服务器证书的示例.它要求将证书放入证书存储区。您可以在您的应用中随身携带证书或公钥。

// Encoded RSAPublicKey
private static String PUB_KEY = "30818902818100C4A06B7B52F8D17DC1CCB47362" +
"C64AB799AAE19E245A7559E9CEEC7D8AA4DF07CB0B21FDFD763C63A313A668FE9D764E" +
"D913C51A676788DB62AF624F422C2F112C1316922AA5D37823CD9F43D1FC54513D14B2" +
"9E36991F08A042C42EAAEEE5FE8E2CB10167174A359CEBF6FACC2C9CA933AD403137EE" +
"2C3F4CBED9460129C72B0203010001";

public static void Main(string[] args)
{
ServicePointManager.ServerCertificateValidationCallback = PinPublicKey;
WebRequest wr = WebRequest.Create("https://encrypted.google.com/");
wr.GetResponse();
}

public static bool PinPublicKey(object sender, X509Certificate certificate, X509Chain chain,
SslPolicyErrors sslPolicyErrors)
{
if (null == certificate)
return false;

String pk = certificate.GetPublicKeyString();
if (pk.Equals(PUB_KEY))
return true;

// Bad dog
return false;
}

关于c# - 强制 HttpClient 信任单个证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24221974/

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