Azure Web作业无法与客户端证书建立SSL / TLS连接

时间:2018-02-20 01:54:00

标签: azure ssl azure-webjobs

您好我需要使用HTTPS和客户端证书与外部Web服务进行通信的WebJob,但我得到(仅在Azure上)此错误:无法为SSL / TLS建立安全通道有权威' wstest.agenziadoganemonopoli.gov.it'。请求已中止:无法创建SSL / TLS安全通道。

wstest.agenziadoganemonopoli.gov.it 仅支持TLS 1.2(SSLLabs test)并且我已添加

ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;

ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, errors) => true;

wstest.agenziadoganemonopoli.gov.it 要求每个用户使用不同的客户端证书,因此我从blob加载了正确的证书。

我没有像Use a client certificate in a WebJob那样使用 WEBSITE_LOAD_CERTIFICATES ,主要是因为我从外部存储(Azure Blob存储)加载证书,并且每个用户都有不同的证书(我有> 1000个要管理的证书。

更新 这是(或多或少)用于从Azure Blob存储加载证书的代码

    public async Task<Result<X509Certificate2>> GetCertificate(Guid merchantId)
    {
        try
        {
            CloudBlobContainer container =
                _client.GetContainerReference($"{ContainerNamePrefix}-{merchantId.ToString().ToLower()}");

            CloudBlockBlob certificateBlobBlock = container.GetBlockBlobReference(CertificateBlobBlockName);

            CloudBlockBlob metadataBlobBlock = container.GetBlockBlobReference(MetadataBlobBlockName);

            AuthenticationCertificateMetadata metadata =
                JsonConvert.DeserializeObject<AuthenticationCertificateMetadata>(
                    await metadataBlobBlock.DownloadTextAsync().ConfigureAwait(false));

            X509Certificate2 certificate = null;

            using (MemoryStream stream = new MemoryStream())
            {
                await certificateBlobBlock.DownloadToStreamAsync(stream).ConfigureAwait(false);

                certificate = new X509Certificate2(stream.ToArray(), metadata.CertificatePassword);
            }

            return Result<X509Certificate2>.Successful(certificate);
        }
        catch (Exception ex)
        {

        }
    }

有什么建议吗?

谢谢! 费德里科

1 个答案:

答案 0 :(得分:1)

  

我没有按照建议使用WEBSITE_LOAD_CERTIFICATES

实际上,您需要在应用程序设置中设置WEBSITE_LOAD_CERTIFICATES 。这是加载应用程序的客户端证书所必需的。 enter image description here

  

我从外部存储(Azure Blob存储)加载证书,每个用户都有不同的证书

您可以加载应用程序目录中的证书文件,这样您就可以为每个用户获得不同的客户端证书。

例如:

 string certPath = Server.MapPath("~/certs/mycert.pfx");
 X509Certificate2 cert = GetCertificate(certPath, signatureBlob.Thumbprint);

有关详细信息,请参阅此article