我尝试向 Yandex 服务语音识别引擎发出 GET 请求,以获取流识别:
GET /asr_partial HTTP/1.1\r\n
User-Agent:Ross' Third apartmentAliveClient\r\n
Host: voice-stream.voicetech.yandex.net:80\r\n
Upgrade: dictation\r\n\r\n
因此,我编写了简单的代码来做到这一点:
public string HttpGet(String serviceUri, String host, String userAgent, String upgradeValue)
{
req = WebRequest.Create(serviceUri)
as HttpWebRequest;
req.ClientCertificates.Add(_certificat);
req.Host = host;
req.UserAgent = userAgent;
req.Date = DateTime.Now;
Console.WriteLine(req.ToString());
req.Headers["Upgrade"] = upgradeValue;
string result = null;
using (HttpWebResponse resp = req.GetResponse()
as HttpWebResponse)
{
StreamReader reader =
new StreamReader(resp.GetResponseStream());
result = reader.ReadToEnd();
}
return result;
}
但是当我调用方法捕获异常时:
System.Net.WebException:基础连接已关闭:无法为 SSL/TLS 安全通道建立信任关系。
好的,我认为这个问题是我应该将(Yandex 站点的 CA 证书导入我的机器。所以,我尝试这样做 - 找到一些 CA -但是 -Certum,Certum Level 4 CA,但据我了解 - 它是现在,我需要什么。
好的,我编写该代码来获取证书并将其存储到文件中:
ServicePointManager.ServerCertificateValidationCallback += new System.Net.Security.RemoteCertificateValidationCallback(customXertificateValidation);
private bool customXertificateValidation(object sender, X509Certificate cert, X509Chain chain, System.Net.Security.SslPolicyErrors error)
{
if (cert.Subject == "CN=*.asr.yandex.net, O=YANDEX, OU=ITO, L=Moscow, S=Russia, C=RU")
{
var certBytes= cert.Export(X509ContentType.Cert);
File.WriteAllBytes("yandexCA.txt", certBytes);
return true;
}
return false;
}
然后,我修改了方法,导入证书并将其添加到请求中:
public string HttpGet(String serviceUri, String host, String userAgent, String upgradeValue)
{
_certificat = new X509Certificate2();
var certBytes = File.ReadAllBytes("yandexCA.txt");
_certificat.Import(certBytes);
HttpWebRequest req = WebRequest.Create(serviceUri)
as HttpWebRequest;
req.ClientCertificates.Add(_certificat);
req.Host = host;
req.UserAgent = userAgent;
req.Date = DateTime.Now;
Console.WriteLine(req.ToString());
req.Headers["Upgrade"] = upgradeValue;
string result = null;
using (HttpWebResponse resp = req.GetResponse()
as HttpWebResponse)
{
StreamReader reader =
new StreamReader(resp.GetResponseStream());
result = reader.ReadToEnd();
}
return result;
}
}
证书主题:
Subject = "CN=*.asr.yandex.net, O=YANDEX, OU=ITO, L=Moscow, S=Russia, C=RU"
但错误是一样的:
System.Net.WebException:基础连接已关闭:无法为 SSL/TLS 安全通道建立信任关系。
我应该怎么做才能解决这个错误?
我需要将此证书安装到我的机器上吗?如果是的话- 怎么做?- 我只有字节数组。
PS在我使用回调的代码中:
ServicePointManager.ServerCertificateValidationCallback += new System.Net.Security.RemoteCertificateValidationCallback(customXertificateValidation);
所以,回应是:
System.dll 中发生“System.Net.WebException”类型的未处理异常
附加信息:远程服务器发送消息:(501)不支持。