3

我在IIS中使用我自己创建的SSL证书设置了一个FTP服务器(使用Makecert.exePvk2Pfx)。我将PFX文件归因于我的 FTP 服务器。

我有一个连接到 FTP 服务器的 C# 脚本,并且总是收到以下错误消息:

System.Security.Authentication.AuthenticationException:根据验证程序,远程证书无效。

我在本地计算机和用户的“受信任的根证书颁发机构”中安装了证书。

由于它没有进行身份验证,因此我通过商店的 C# 进行了查看:

X509Store store = new X509Store(StoreName.AuthRoot, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);

foreach (X509Certificate2 mCert in store.Certificates)
{
     var friendlyName = mCert.Issuer;
     Console.WriteLine(friendlyName);
}
store.Close();

但是我的证书没有列出。当我打开MMC 控制台时,我看到了我的证书。

4

2 回答 2

3

通常,C# 不信任没有受信任根证书的证书——例如自签名证书。ServicePointManager允许添加一个您可以自己处理信任的功能。

// Callback used to validate the certificate in an SSL conversation
private static bool ValidateRemoteCertificate(
    object sender,
    X509Certificate certificate,
    X509Chain chain,
    SslPolicyErrors policyErrors)
{
    if (Convert.ToBoolean(ConfigurationManager.AppSettings["IgnoreSslErrors"]))
    {
        // Allow any old dodgy certificate...
        return true;
    }
    else
    {
        return policyErrors == SslPolicyErrors.None;
    }
}

private static string MakeRequest(string uri, string method, WebProxy proxy)
{
    HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uri);
    webRequest.AllowAutoRedirect = true;
    webRequest.Method = method;

    // Allows for validation of SSL conversations
ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(
    ValidateRemoteCertificate);

    if (proxy != null)
    {
        webRequest.Proxy = proxy;
    }

    HttpWebResponse response = null;
    try
    {
        response = (HttpWebResponse)webRequest.GetResponse();
        using (Stream s = response.GetResponseStream())
        {
            using (StreamReader sr = new StreamReader(s))
            {
                return sr.ReadToEnd();
            }
        }
    }
    finally
    {
        if (response != null)
            response.Close();
    }
}

来自博客文章如何以编程方式接受无效的 SSL 证书

于 2012-06-26T14:46:11.177 回答
1

作为一种快速解决方法,您可以接受以下所有证书:

ServicePointManager.ServerCertificateValidationCallback += (o, c, ch, er) => true;
于 2013-01-29T10:04:53.793 回答