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 セキュア チャネルの信頼関係を確立できませんでした。
OK、この問題は ( Yandex サイトの CA 証明書を自分のマシンにインポートする必要があることだと思います。そのため、それを実行しようとしています - CA を見つけます - しかし -Certum,Certum レベル 4 CA ですが、私が理解しているように-今、私が必要とするもの。
OK、証明書を取得してファイルに保存するコードを書きます。
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.Net.WebException' の未処理の例外が System.dll で発生しました
追加情報: リモート サーバー送信メッセージ: (501) サポートされていません。