C# Can';t覆盖Azure Web应用中的服务器证书验证 概述
我似乎有表中所列问题的变体。然而,那里的答案并没有真正帮助我,我的情况也不同 我在一家大型公司工作,他们决定将自己视为根证书颁发机构。我开发了一个web应用程序,需要链接到Azure中VM中托管的API 我的方法 由于我无法在受信任的存储中安装证书,所以我尝试通过代码来完成此操作。我使用的是ASP.NET Web API v2,我已将以下代码添加到启动部分:C# Can';t覆盖Azure Web应用中的服务器证书验证 概述,c#,asp.net,azure,ssl,azure-web-app-service,C#,Asp.net,Azure,Ssl,Azure Web App Service,我似乎有表中所列问题的变体。然而,那里的答案并没有真正帮助我,我的情况也不同 我在一家大型公司工作,他们决定将自己视为根证书颁发机构。我开发了一个web应用程序,需要链接到Azure中VM中托管的API 我的方法 由于我无法在受信任的存储中安装证书,所以我尝试通过代码来完成此操作。我使用的是ASP.NET Web API v2,我已将以下代码添加到启动部分: public void Configuration(IAppBuilder app) { Configur
public void Configuration(IAppBuilder app)
{
ConfigureAuth(app);
var options = CorsOptions.AllowAll;
app.UseCors(options);
// Override certificate check
ServicePointManager.ServerCertificateValidationCallback = MyRemoteCertificateValidationCallback;
}
我的回调如下所示:
public bool MyRemoteCertificateValidationCallback(
object sender,
X509Certificate certificate,
X509Chain chain,
SslPolicyErrors sslPolicyErrors)
{
switch (sslPolicyErrors)
{
case SslPolicyErrors.RemoteCertificateChainErrors:
return IsTheCertificateOriginAcceptable(chain);
case SslPolicyErrors.None:
return true;
default:
return false;
}
}
certificate origin acceptable函数正在检查问题是否是由未知根引起的,然后检查未知根是否是代码知道的额外根(因为我无法将受信任根添加到Azure Web应用程序-如果我有VM,安装证书将是一种方法)
如果不是,则抛出一个web异常:
bool IsTheCertificateOriginAcceptable(X509Chain chain)
{
// checks to see if the initail problem is an untrusted root,
// and to extract the origin certificate
if (certificate.IssuerName.Name == expectedIsserName)
{
return true;
}
else
{
throw new WebException($"Certificate origin unacceptable Actual Issue Name '{certificate.IssuerName.Name}', expected issuer name '{expectedIssuerName}'");
}
计划是从VM中找到发行者名称,然后将其放入代码中-这是探索性代码,以确定如何完成连接
本地运行
然后我用两个网站为自己建立了IIS。一个运行这段代码,另一个运行在不同的端口上,默认的自签名证书运行一个我试图调用的API的普通模拟
当我这样做时,如果我不使用上述代码,我会得到与Azure相同的错误:
The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.
at System.Net.HttpWebRequest.GetRequestStream(TransportContext& context)
at System.Net.HttpWebRequest.GetRequestStream()
如果我使用代码,我会得到以下消息
Certificate origin unacceptable Actual Issue Name 'CN=localhost', expected issuer name ''
在Azure Web应用程序中
当我将上述代码部署到Azure时,总是会出现证书信任错误,这表明没有调用回调
我无法轻松检查远程服务器的SSL设置,因为它未连接到internet(我已将azure web应用程序连接到虚拟机所在的VNET)
因此,考虑到所有这些,除了建议远程服务器从已知和受信任的RCA获得适当的证书之外,我如何连接呢?事实证明,框架的行为并不是我所期望的 我的情况是一个自签名根证书,以及该自签名证书的子证书。在这种情况下,我希望有一个证书被标记为
不可信
但是,在这种情况下,框架的行为不允许只提供叶证书,因此链的长度为1。然后该链被分类为PartialChain
我的逻辑是寻找一个不可信的链接,而不是一个PartialChain,因此尽管调用了回调,我还是在没有得到之前的许可的情况下返回
因此,我的逻辑是错误的——我通过将回调设置为始终返回true来确认这一点。然后,我设置了两个自签名证书,并在localhost上使用了第二个网站——它复制了错误,并允许我查看逻辑错误的位置
感谢那些发表评论的人,我应该检查回调是否设置为true,并在发布之前解决了问题 由于webApp是安全的,很多操作都受到安全性的限制,我不确定它是否可以在Azure webApp上执行。如果可能的话,请尝试将其移动到Azure Visual Machine作为解决方法。我建议尝试按照此方法进行操作,看看设置每个连接是否可能产生影响?我对此有问题。但是在我的例子中,如果根证书不在存储中,则永远不会调用回调。它在你身上做过吗?