c# - 了解通过 SSL 进行调用的代码

标签 c# ssl asp.net-web-api

我正在浏览现有代码,这些代码应该通过 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/

相关文章:

apache - 重定向错误 : Wordpress + Let's Encrypt (Certbot) + SSL only + non-www

c# - 如何在运行时更改 NLog 目标的连接字符串?

c# - (C#) 访问/修改列表中的对象

c# - openstacksdknet 上的 CloudIdentity(找不到用户)

c# - 在 RangeAttribute 中提供非常量值?

c# - VS Code/OmniSharp - 如何明确设置 dotnet SDK/CLI 工具的路径

c++ - 在 grpc 服务器端调用时检索 SSL 证书

ssl - SonarQube:SSL 的短暂 Diffie-Hellman key 问题较弱

c# - Web api 2 字符串路由失败

c# - Web Api 的 Xml 文档如何包含主项目以外的文档?