我們遇到了類似的問題,試圖使用相互SSL連接到業務API。標準.NET庫不起作用。您可以使用第三方庫http://curl.haxx.se/libcurl/作爲可能的解決方案之一。
libcurl是一款免費且易於使用的客戶端URL傳輸庫,支持DICT,FILE,FTP,FTPS,Gopher,HTTP,HTTPS,IMAP,IMAPS,LDAP,LDAPS,POP3,POP3S,RTMP ,RTSP,SCP,SFTP,SMTP,SMTPS,Telnet和TFTP。 libcurl支持SSL證書,HTTP POST,HTTP PUT,FTP上傳,基於HTTP表單的上傳,代理,cookies,用戶名密碼認證(Basic,Digest,NTLM,Negotiate,Kerberos),文件傳輸恢復,http代理隧道等。
.NET庫可以從http://sourceforge.net/projects/libcurl-net/
當你上傳libcurl.dll改變到最新版本,你可以找到(它應該是7.18.1或更新版本)上傳。在當前的libcurl-nel包中,它比需要的要舊。
public string HTTPGet(string URL, string Proxy, string certName = null, string certPassword = null)
{
Easy easy = new Easy();
SockBuff = "";
try
{
Easy.WriteFunction wf = new Easy.WriteFunction(OnWriteData);
easy.SetOpt(CURLoption.CURLOPT_URL, URL);
easy.SetOpt(CURLoption.CURLOPT_TIMEOUT, "60");
easy.SetOpt(CURLoption.CURLOPT_WRITEFUNCTION, wf);
easy.SetOpt(CURLoption.CURLOPT_USERAGENT, UserAgent);
easy.SetOpt(CURLoption.CURLOPT_COOKIEFILE, CookieFile);
easy.SetOpt(CURLoption.CURLOPT_COOKIEJAR, CookieFile);
easy.SetOpt(CURLoption.CURLOPT_FOLLOWLOCATION, true);
if (!string.IsNullOrEmpty(certName))
{
easy.SetOpt(CURLoption.CURLOPT_SSLCERT, certName);
if (!string.IsNullOrEmpty(certPassword))
{
easy.SetOpt(CURLoption.CURLOPT_SSLCERTPASSWD, certPassword);
}
}
if (URL.Contains("https"))
{
easy.SetOpt(CURLoption.CURLOPT_SSL_VERIFYHOST, 1);
easy.SetOpt(CURLoption.CURLOPT_SSL_VERIFYPEER, 0);
}
if (!string.IsNullOrEmpty(Proxy))
{
easy.SetOpt(CURLoption.CURLOPT_PROXY, Proxy);
easy.SetOpt(CURLoption.CURLOPT_PROXYTYPE, CURLproxyType.CURLPROXY_HTTP);
}
var code = easy.Perform();
easy.Cleanup();
Console.WriteLine(code);
}
catch
{
Console.WriteLine("Get Request Error");
}
return SockBuff;
}
public static Int32 OnWriteData(Byte[] buf, Int32 size, Int32 nmemb, Object extraData)
{
// Console.Write(System.Text.Encoding.UTF8.GetString(buf));
SockBuff = SockBuff + System.Text.Encoding.UTF8.GetString(buf);
return size * nmemb;
}
這將有助於在.Net和Windows版本您正在使用的,因爲SNI支持將取決於這些細節就知道了。 – Bruno 2012-03-30 16:24:21
@布魯諾好點 - 我已經更新了這個問題。 – TonyM 2012-03-30 16:32:22
看起來你可能需要一個外部庫而不是'SslStream':http://connect.microsoft。com/VisualStudio/feedback/details/729925/net-4-4-5-sslstream-no-supports-the-tls-server-name-indication-sni – Bruno 2012-03-30 17:48:08