远程证书被用户验证为无效。

9
在Azure虚拟机中,我有一个Web应用程序和一个子Web应用程序,使用FormsAuthentication和HTTPS配置了有效证书。认证在主应用程序和子应用程序之间共享,使用相同的机器密钥。这两个应用程序都需要SSL。
从公共URL访问时一切正常。
我需要从主应用程序向子应用程序发送一些请求,使用公共名称进行配置(子应用程序可以安装在另一台服务器上)。这些请求使用特定帐户进行标识。
以下是我从主应用程序发送请求到子应用程序的代码,this.WebApiUrl是公共URL:
// If we are not authenticated
if(!isAuthenticated)
{
    // Check user and login
    if(!User.Check(this.WebApiLogin, this.WebApiPassword))
        throw new Exception("Unauthorized user");
            
    isAuthenticated = true;
}
// Convert HttpCookie to Cookies
var cookies = FormsAuthentication.GetAuthCookie(this.WebApiLogin, false).ToCookies();
// Create request with the authentication cookie
Uri baseAddress = new Uri(this.WebApiUrl);
CookieContainer cookieContainer = new CookieContainer();
foreach(var cookie in cookies)
{
    if(String.IsNullOrEmpty(cookie.Domain))
        cookie.Domain = baseAddress.Host;
    if(baseAddress.Scheme == "https")
        cookie.HttpOnly = false;

    cookieContainer.Add(cookie);
}

// send request
using(HttpClientHandler handler = new HttpClientHandler() { CookieContainer = cookieContainer })
{
    using(HttpClient client = new HttpClient(handler))
    {
        client.BaseAddress = baseAddress;
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        return client.GetStringAsync(requestUri).Result;
    }
}

没有 SSL 时一切正常。当我启用 SSL 后,主应用程序与子域应用程序之间的请求失败,显示错误信息:

底层连接被关闭:无法建立 SSL/TLS 安全信道的信任关系。

以下是 System.Net 和 System.Net Sockets 的系统日志信息。

System.Net 信息: 0 : [10788] SecureChannel#92992 - 远程证书被用户验证为无效。

System.Net.Sockets 详细: 0 : [10788] Socket#29502801::Dispose()

System.Net 错误: 0 : [10788] HttpWebRequest#61435094 中出现异常:: 底层连接被关闭:无法建立 SSL/TLS 安全信道的信任关系。

System.Net 详细: 0 : [10788] HttpWebRequest#61435094::EndGetResponse()

System.Net 错误: 0 : [10788] HttpWebRequest#61435094::EndGetResponse 中出现异常 - 底层连接被关闭:无法建立 SSL/TLS 安全信道的信任关系。

奇怪的是,这些日志并没有说明为什么证书被用户验证为无效。虽然该证书对来自外部的请求是有效的。

重要提示: 我不想使用 ServicePointManager.ServerCertificateValidationCallback 来解决此问题,因为它正在生产环境中使用。

感谢您的帮助。


我有一个类似的问题,诊断日志中出现“用户验证远程证书无效”的信息。你找出是什么原因引起的了吗? - 4thex
1
是的,我在一个依赖库中有一个 ServerCertificateValidationCallback。将其删除解决了问题。 - Troopers
嘿,我是对的! :) - nullPainter
1个回答

2
你的代码中其他地方是否提供了ServerCertificateValidationCallback回调函数?
我们在实现白名单指定域名的自签名证书时,存在逻辑缺陷。即使针对有效证书,回调函数仍然会执行,但仅应用于白名单逻辑。由于合法的证书不在此列表中,回调函数因此指示失败。
这已通过基于error变量进行早期返回来解决: if (error == SslPolicyErrors.None) return true;

是的,我们在同一台服务器上有另一个Web应用程序,其中包含此回调和提前返回 if(error == SslPolicyErrors.None)return true;。我也尝试了没有回调,但我的应用程序与子应用程序之间的请求总是出错。 - Troopers
回调函数中的“error”值是否指示更有用的内容?我假设您已根据以下链接浏览了您的根证书:http://blogs.msdn.com/b/jpsanders/archive/2009/09/16/troubleshooting-asp-net-the-remote-certificate-is-invalid-according-to-the-validation-procedure.aspx - nullPainter
是的,我已经检查了证书、证书路径、证书颁发机构...一切都没问题。而且我不认为问题在于证书,因为来自外部的请求都是正常的。只有主应用程序和子应用程序之间的请求失败了。 - Troopers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接