1

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) サポートされていません。

4

0 に答える 0