2009-04-02 6 views
9

現在、C#でSSLを使用しているサーバーからの応答を取得しようとしています。私はJavaでこれを行うためのコードを持っていますが、1:1を翻訳しないようです。SSLでC#でHTTP GETリクエストを使用するには? (プロトコル違反)

通常のページでは動作しますが、必要なものではない(SSLの可能性があります)ためのコードはありません。コードは次のとおりです。

 WebRequest request = WebRequest.Create("https://" + sslServerHost + ":" + sslServerPort); 
    request.Proxy = null; 
    request.Credentials = CredentialCache.DefaultCredentials; 

    HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
    Stream dataStream = response.GetResponseStream(); 
    StreamReader reader = new StreamReader(dataStream); 
    string responseFromServer = reader.ReadToEnd(); 

更新:ごめんなさい、エラーの内容を忘れてしまったようです。私は "HttpWebResponse response =(HttpWebResponse)request.GetResponse();"行でプロトコル違反例外を取得しています。 アイデアみんなありがとう。

+0

アンバー: 何がうまくいかないのか説明できますか?結果を返さないだけですか?あなたは何らかの例外を受けていますか?もしそうなら、どんな種類の例外で、メッセージは何ですか? – JMarsch

+1

信頼できない証明書の問題になる可能性がありますか? – Dscoduc

答えて

2

ちょっと考えましたが、最終的な "/"で試してみましたか?また、このアプローチがより簡単になるかもしれません。

string s; 
using(WebClient client = new WebClient()) { 
    client.UseDefaultCredentials = true; 
    s = client.DownloadString("https://" + sslServerHost + ":" 
     + sslServerPort + "/"); 
} 
+0

提案に感謝しますが、ダイスはありません。 –

14

HTTPでの会話は、検証のために適切に発行された証明書を使用します。

あなたは次のようにSSL証明書を検証するためのRemoteCertificateValidationCallbackデリゲートを使用することができます。ここでは

public static void ConnectSSL() 
{ 

    WebRequest request = WebRequest.Create("https://" + sslServerHost + ":" + sslServerPort); 
    request.Proxy = null; 
    request.Credentials = CredentialCache.DefaultCredentials; 

    //allows for validation of SSL certificates 

    ServicePointManager.ServerCertificateValidationCallback += new System.Net.Security.RemoteCertificateValidationCallback(ValidateServerCertificate); 

    HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
    Stream dataStream = response.GetResponseStream(); 
    StreamReader reader = new StreamReader(dataStream); 
    string responseFromServer = reader.ReadToEnd(); 

} 

//for testing purpose only, accept any dodgy certificate... 
public static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) 
{ 
      return true; 
} 
+0

HttpWebResponseを正しく処分するか、finallyブロックで少なくともClose()を呼び出すようにしてください! –

1

は、私がテストSSL接続に成功裡に使用しているいくつかのテストコードです...

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://www.dscoduc.com"); 
//request.Method = "HEAD"; 
//request.AllowAutoRedirect = false; 
request.Credentials = CredentialCache.DefaultCredentials; 

// Ignore Certificate validation failures (aka untrusted certificate + certificate chains) 
ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true); 

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
Stream resStream = response.GetResponseStream(); 
StreamReader reader = new StreamReader(resStream); 
string responseFromServer = reader.ReadToEnd(); 
関連する問題