2008-08-06 21 views
36
に太字 で

ほとんどの最近の編集を実行していることはありません私は、.NET HttpListenerクラスを使用していますが、私はしませんよIIS上で動作していて、ASP.netを使用していません。このweb siteはasp.netでSSLを実装するためにどのようなコードを実際に使用するかを記述しており、this siteは証明書を設定する方法を説明しています(IISに対してのみ動作するかどうかはわかりませんが)。私はHttpListenerをを使用する.NETアプリケーションにSSLを追加するにはどうすればよい - それは* * IIS

クラスのドキュメントでは、さまざまな種類の認証(基本、ダイジェスト、Windowsなど)について説明しています。いずれもSSLを参照していません。 HTTPS is used, you will need to set a server certificateの場合はそれが言います。これは1行のプロパティの設定になり、HttpListenerは残りの部分を見つけますか?

要するに、私は証明書を設定する方法とSSLを実装するコードを変更する方法を知る必要があります。

私はHTTPSにアクセスしようとしているとき、それは発生しませんが、私は私のシステムイベントログにエラーを気づかなかった - ソースが「のSchannel」で、メッセージの内容は次のとおりです。

をSSLサーバーの資格情報 秘密鍵にアクセスしようとすると、致命的なエラーが発生しました。暗号モジュールから返されるエラーコード は 0x80090016です。

編集:これまでの HTTP接続のために働くのC#(例: "http://localhost:8089/foldername/" makecert.exe を使用して証明書を作成し

  • で働いてHttpListenerをを作成し

    • を取ら
      手順
    • certmgr.exeを使用して信頼できる証明書を追加しました。
    • 使用したHttpcfg.exeにより、 rテストポート上のSSL接続。 8090 listener.Prefixes.Add(https://localhost:8090/foldername/経由HttpListenerをする)
    • 追加ポート8080に ");
    • HTTPクライアント接続、例えば(http://localhost:8089/foldername/テスト" のブラウザで)と
    • 正しいリターンを受け取るには、HTTPSクライアントをテスト接続、例えば(http://localhost:8090/foldername/ ")をブラウザーで開き、" Data Transfer Interrupted "(Firefox)
    • のビジュアルスタジオでデバッグすると、HTTPS接続の開始時に要求を受け取るリスナーコールバックが決してヒットしないことがわかります。私は他に早く何かをキャッチするブレークポイントを設定することができます。
    • netstatコマンドは、リスニング・ポートの両方HTTPSとHTTPのために開いていることを示しています。接続が試行された後、HTTPSポートがTIME_WAITに行くん。
    • FiddlerこととHTTPAnalyzerドン」トラフィックのいずれかをキャッチする、私はそれらのHTTP分析ツールに表示するプロセスでは十分に得ることはないと思います

    質問

    • 問題は何だろうか?
    • 私は紛失しています(つまり、私が行ったことであるHTTPSを指すリスナーにプレフィックスを追加する以外はC#でもっとやりなさいという意味です)
    • ありがとうどこかの設定ステップ?
    • 問題を分析するために他に何ができますか?
    • システムイベントログのエラーメッセージに問題の兆候がありますか?もしそうなら、それはどのように修正されますか?
  • 答えて

    6

    まだ完全には実装されていませんが、このWebサイトでは、証明書とコードの設定にはgood walkthroughが与えられているようです。

    3

    class documentation

    は、このノートを持っています

    あなたが HTTPSを使用してHttpListenerをを作成する場合は、そのリスナーのサーバー 証明書を選択する必要があります。 それ以外の場合は、 のHttpWebRequestクエリでは、このHttpListenerは、接続が予期せず終了する で失敗します。

    と、この:

    あなたは HttpCfg.exeを使用して、サーバー証明書 や他のリスナーのオプションを設定することができます。詳細については、 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/http/http/httpcfg_exe.asp を参照してください。実行可能ファイルは、Windows Server 2003に同梱されている です。 は、Platform SDKのソースコード から作成できます。

    第2のノートが最初に説明されていますか?質問で概説したように、私はhttpcfg.exeを使用して証明書を特定のポートにバインドしました。彼らがこれ以外の何かをしようとするなら、そのメモは曖昧です。

    2

    私はあなたと同じ問題を抱えています。幸運にも、this pageで厳しい措置を捜した後、私のHttpListenerとSSLを連携させてください。

    9

    私も同様の問題があり、証明書自体に問題があるようです。

    は、ここで私のために働いたパスです:

    makecert.exe -r -a sha1 -n CN=localhost -sky exchange -pe -b 01/01/2000 -e 01/01/2050 -ss my -sr localmachine 
    

    、その後、証明書thumbprintを検索クリップボードにコピーし、スペースを削除します。これは、次のコマンドで-h後のパラメータになります。

    HttpCfg.exe set ssl -i 0.0.0.0:801 -h 35c65fd4853f49552471d2226e03dd10b7a11755 
    

    その後、https://localhost:801/上のサービスホストを実行し、それが完璧に動作します。

    私は仕事をすることができませんが、自己生成証明書で実行するためのhttpsです。ここで私は1(わかりやすくするために取り出されたエラー処理)を生成するために実行コードがあります:

    LPCTSTR pszX500 = subject; 
    DWORD cbEncoded = 0; 
    CertStrToName(X509_ASN_ENCODING, pszX500, CERT_X500_NAME_STR, NULL, pbEncoded, &cbEncoded, NULL); 
    pbEncoded = (BYTE *)malloc(cbEncoded); 
    CertStrToName(X509_ASN_ENCODING, pszX500, CERT_X500_NAME_STR, NULL, pbEncoded, &cbEncoded, NULL); 
    
    // Prepare certificate Subject for self-signed certificate 
    CERT_NAME_BLOB SubjectIssuerBlob; 
    memset(&SubjectIssuerBlob, 0, sizeof(SubjectIssuerBlob)); 
    SubjectIssuerBlob.cbData = cbEncoded; 
    SubjectIssuerBlob.pbData = pbEncoded; 
    
    // Prepare key provider structure for self-signed certificate 
    CRYPT_KEY_PROV_INFO KeyProvInfo; 
    memset(&KeyProvInfo, 0, sizeof(KeyProvInfo)); 
    KeyProvInfo.pwszContainerName = _T("my-container"); 
    KeyProvInfo.pwszProvName = NULL; 
    KeyProvInfo.dwProvType = PROV_RSA_FULL; 
    KeyProvInfo.dwFlags = CRYPT_MACHINE_KEYSET; 
    KeyProvInfo.cProvParam = 0; 
    KeyProvInfo.rgProvParam = NULL; 
    KeyProvInfo.dwKeySpec = AT_SIGNATURE; 
    
    // Prepare algorithm structure for self-signed certificate 
    CRYPT_ALGORITHM_IDENTIFIER SignatureAlgorithm; 
    memset(&SignatureAlgorithm, 0, sizeof(SignatureAlgorithm)); 
    SignatureAlgorithm.pszObjId = szOID_RSA_SHA1RSA; 
    
    // Prepare Expiration date for self-signed certificate 
    SYSTEMTIME EndTime; 
    GetSystemTime(&EndTime); 
    EndTime.wYear += 5; 
    
    // Create self-signed certificate 
    pCertContext = CertCreateSelfSignCertificate(NULL, &SubjectIssuerBlob, 0, &KeyProvInfo, &SignatureAlgorithm, 0, &EndTime, 0); 
    hStore = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, CERT_SYSTEM_STORE_LOCAL_MACHINE, L"MY"); 
    CertAddCertificateContextToStore(hStore, pCertContext, CERT_STORE_ADD_REPLACE_EXISTING, 0); 
    

    証明書は罰金を示し、それが働いて、秘密鍵を持っていますが、拇印が登録されなかったかのようにHTTPSがタイムアウトします。誰もが知っている場合、なぜ - プラザ

    EDIT1コメント:あなただけのIPに証明書をバインドする必要が

    CRYPT_KEY_PROV_INFO KeyProvInfo; 
    memset(&KeyProvInfo, 0, sizeof(KeyProvInfo)); 
    KeyProvInfo.pwszContainerName = _T("my-container"); 
    KeyProvInfo.pwszProvName = _T("Microsoft RSA SChannel Cryptographic Provider"); 
    KeyProvInfo.dwProvType = PROV_RSA_SCHANNEL; 
    KeyProvInfo.dwFlags = CRYPT_MACHINE_KEYSET; 
    KeyProvInfo.cProvParam = 0; 
    KeyProvInfo.rgProvParam = NULL; 
    KeyProvInfo.dwKeySpec = AT_KEYEXCHANGE; 
    
    7

    :いくつかは遊んでた後、私は、適切な証明書を生成CertCreateSelfSignCertificateための初期化を発見しました。ポートを開き、https://プレフィックスでリスナーを開きます。 0.0.0.0はすべてのIPに適用されます。 appidはランダムなGUIDで、certhashは証明書のハッシュです(thumprintと呼ばれることもあります)。

    管理者権限を使用してcmd.exeで次を実行します。

    netsh http add sslcert ipport=0.0.0.0:1234 certhash=613bb67c4acaab06def391680505bae2ced4053b appid={86476d42-f4f3-48f5-9367-ff60f2ed2cdc} 
    

    あなたはこれをテストするために、自己署名証明書を作成したい場合は、

    1. オープンIIS
    2. は コンピュータ名
    3. クリックしてサーバー証明書のアイコンを
    4. クリック
    5. クリックして、自己を生成します - 署名付き証明書
    6. ダブルクリックして詳細へ移動
    7. そこに拇印が表示されます。スペースを削除してください。

    HttpListener listener = new HttpListener(); 
    listener.Prefixes.Add("https://+:1234/"); 
    listener.Start(); 
    Console.WriteLine("Listening..."); 
    HttpListenerContext context = listener.GetContext(); 
    
    using (Stream stream = context.Response.OutputStream) 
    using (StreamWriter writer = new StreamWriter(stream)) 
        writer.Write("hello, https world"); 
    
    Console.ReadLine(); 
    

    印刷されたテキストを見て、私はちょうど https://localhost:1234に移動し、このプログラムを実行した後。証明書CNがURLと一致せず、信頼できる証明書ストアにないため、証明書の警告が表示されます。テキストは暗号化されていますが、Wire Sharkのようなツールで確認できます。

    自己署名入りx509証明書の作成をさらに制御したい場合は、opensslは素晴らしいツールであり、Windows用のポートがあります。私はmakecertツールよりも多くの成功を収めてきました。


    それはあなたが、SSLの警告を持っているコードからHTTPSサービスと通信している場合には、セットアップサービスポイントマネージャ上の証明書バリデータはテスト目的のためにそれを回避するためにしなければならないことも非常に重要です。

    ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, errors) => true; 
    
    4

    はここhttpcfg.exe(XP)またはnetsh.exe(ビスタ+)を使用せずにIP /ポートの組み合わせへのSSL certifiateをバインドするための代替手段です。

    http://dotnetcodebox.blogspot.com.au/2012/01/how-to-work-with-ssl-certificate.html

    それの要旨は、あなたがそれ故にOSへの依存を除去して、Httpcfgのがインストールされ、内蔵のコマンドラインを介してプログラム的にではなく、それを行うには、WindowsにC++ HttpSetServiceConfiguration APIを使用することができるということです。

    +1

    このコードを[Nugetパッケージ](https://www.nuget.org/packages/SslCertBinding.Net/)として公開しました。それを自由に使用してください。 –

    関連する問題