我正在浏览现有代码,这些代码应该通过 SSL 进行 api 调用。我很难理解,下面的代码是如何工作的?我的意思是这段代码有效,但我无法理解内部工作。特别是两个 ** 标记之间的代码。
这里如何使用证书?我的意思是证书在这里有什么用途?我已经运行了代码,我看到 GetCertificate 从计算机商店返回证书。
public class Helper
{
public static T Post<T>(string resourceUri, object request)
{
**ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
var requestHandler = new WebRequestHandler();
requestHandler.ServerCertificateValidationCallback = delegate { return true; };
requestHandler.ClientCertificates.Add(GetCertificate());
using (var client = new HttpClient(requestHandler))
{**
client.BaseAddress = new Uri(resourceUri);
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
try
{
var responseMessage = client.PostAsJsonAsync(resourceUri, request).Result;
if (responseMessage.IsSuccessStatusCode)
return responseMessage.Content.ReadAsAsync<T>().Result;
else
throw new Exception(responseMessage.Content.ReadAsStringAsync().Result);
}
catch(Exception ex)
{
// do something
return default(T);
}
}
}
最佳答案
How certificate is being used here?
你在之后回复自己:
I see
GetCertificate
returns a certificate from computer store.
至于:
I mean what purpose certificate serves here?
在 TLS 中,X.509 证书用于身份验证。 TLS 握手的任一端点或两者都可以决定它要对另一方进行身份验证。
因此,每一方都可以向另一方发送其证书,另一方将通过加密方式对其进行验证,因为它通常在其信任库中有一个 CA 列表,并且双方都会检查证书元数据(有效期, 签名)以及它是由它信任的 CA 之一颁发的(或者它正在使用证书白名单)这一事实。
这里有一个 HTTP 客户端。它通过 HTTPS 连接到的服务器似乎想要对客户端进行身份验证。所以这个HTTP客户端需要给对方发送一个证书。这基本上就是您突出显示的代码的目的。
另一端的 ServerCertificateValidationCallback
似乎非常脆弱。它将用于此客户端对服务器进行身份验证。我不知道 C#
但从它的外观来看,它接受任何服务器证书,这可能很糟糕(也许这些只是在底层库所做的事情之上的额外检查,所以如果它确实检查元数据和 CA 那么就可以了,如果这一行只是盲目地接受任何证书,那么你就陷入了麻烦的世界)。
关于c# - 了解通过 SSL 进行调用的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52213433/