37

我正在尝试通过 SSL 发出请求。证书已经安装在机器上,它可以通过浏览器工作。

我正在使用这个请求:

System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
byte[] data = encoding.GetBytes(request.Content.OuterXml.ToString());
string password = "XXXX";
X509Certificate2 cert = new X509Certificate2("c:\\zzzz.p12", password);
string key = cert.GetPublicKeyString();
string certData = Encoding.ASCII.GetString(cert.Export(X509ContentType.Cert));

Uri uri = new Uri(request.Url);
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(uri);
myRequest.Credentials = new NetworkCredential(request.User, request.Password.ToString());
myRequest.Method = "PUT";
myRequest.ContentType = request.ContentType;
myRequest.ContentLength = data.Length;
myRequest.ClientCertificates.Add(cert);

Stream newStream = myRequest.GetRequestStream();
newStream.Write(data, 0, data.Length);
newStream.Close();

System.IO.StreamReader st = new StreamReader(((HttpWebResponse)myRequest.GetResponse()).GetResponseStream());

使用此代码我收到此错误:

基础连接已关闭:无法为 SSL/TLS 安全通道建立信任关系。---> System.Security.Authentication.AuthenticationException:根据验证程序,远程证书无效。

问题是什么?

4

3 回答 3

99

我解决了这个问题:

ServicePointManager.ServerCertificateValidationCallback = new        
RemoteCertificateValidationCallback
(
   delegate { return true; }
);
于 2012-06-28T08:57:51.343 回答
2

确保您的证书受到适当信任。是否已将根证书添加到正确的证书存储区(本地计算机上的受信任根 CA)?

当(自签名)证书的(自己制作的)根证书已添加到当前用户的受信任根 CA 时,我遇到了此错误。将根证书移动到本地机器上的根 CA 存储解决了我的问题。

于 2016-12-01T11:07:30.540 回答
-1

这是客户端代码,对吧?而且您正在访问 HTTPS 网址,不是吗?我认为问题出在服务器证书上,客户端 TLS 堆栈无法验证该证书。当您通过浏览器连接到该 URL 时,它是否运行顺利,或者您是否看到证书不匹配的警告?

于 2012-06-27T09:10:39.300 回答