c# - Azure VM 上的双向 SSL 证书交换

标签 c# azure ssl virtual-machine

我们有一个 Web 应用程序,它必须使用双向 SSL 证书身份验证与 HTTP 服务通信。以下是相关代码

        X509Certificate certificate = GetCertFromStore(StoreName.My, StoreLocation.LocalMachine, certName);
        if (certificate != null)
        {
            Log.Debug($"Adding client cert {certificate.Subject}");

            WebRequestHandler handler = new WebRequestHandler();

            handler.ClientCertificates.Add(certificate);
            handler.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate);
            handler.ClientCertificateOptions = ClientCertificateOption.Manual;
            handler.UseProxy = false;

            using (var client = new HttpClient(handler))
            {
                ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                var postObj = new
                {
                    // somestuff
                };
                var postBody = JsonConvert.SerializeObject(postObj);

                var httpContent = new StringContent(postBody, Encoding.UTF8, "application/json");

                HttpResponseMessage httpResponse = client.PostAsync(queryUrl, httpContent).Result;
                if (httpResponse.IsSuccessStatusCode)
                {
                    // codey code
                }
                else
                {
                    Log.Error($"some error stuff.");
                }
            }
        }
        else
        {
            Log.Error($"Unable to find the certificate with name: {certName}");
        }

目前我们使用的是我们提供给第三方服务提供商的自签名证书,并从他们那里安装了相关的服务器证书。

在本地开发机器上一切正常 - 连接已建立,服务调用和响应正确进行。

但是,当我们在 Azure VM(我们的测试环境)上部署时,证书交换失败。查看 Wireshark 跟踪,我们可以看到服务器证书已被接受,但它显示发送了 0 个客户端证书。我们知道在商店中找到了客户端证书(由于日志记录),我们可以从 Wireshark 跟踪中看到客户端证书名称确实列在服务器证书请求的“可分辨名称”中。

无法弄清楚如何,即使代码将我们预期的客户端证书添加到 WebRequestHandler,它也会在握手期间消失。

最佳答案

我们解决了这个问题。

首先我认为证书是在没有私钥的情况下安装的。在我们的函数 GetCertFromStore 中,它找到了证书,但我认为因为它没有私钥,所以没有发送它。 (它找到证书的事实让我们感到困惑——我们假设如果它找到了证书,那么一切都很好。)

为解决此问题,我们将其从商店中删除,然后使用 .pfx 文件重新安装,确保同时导入私钥。

还有一个权限问题,我们在 StackOverflow 上找到了答案 here (注意,不是标记为“答案”的答案,而是关于权限的答案)。对于能够加载和使用带有私钥的证书的 Web 应用程序,应用程序池身份(或模拟用户)必须对已安装证书的 key 文件(通常位于 C:\ProgramData\Microsoft\Crypto\RSA 中)具有读取权限\机器键)。

关于c# - Azure VM 上的双向 SSL 证书交换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58638081/

相关文章:

azure - 我可以在 ASE 中部署持久 Azure Function 吗

c# - .NET MVC 路由(忽略文件扩展名)

wcf - 从 http 到 Https 服务调用

c# - .NET 最小化到托盘并最小化所需资源

c# - 计算机崩溃后 VS 2013 未加载 'Antlr3.Runtime' 程序集

c# - 转换为特殊字符(例如从 "æ"到 "æ")

email - 来自非安全服务器的 HTTPS 重定向在浏览器中给出错误消息

c# - 访问 DateTime.Now 时崩溃

azure - 如何将环境变量添加到Azure容器应用程序

android - Web 服务、Android 客户端、SSL