3

証明書に基づいて、トランスポート セキュリティ認証のプロセスを理解しようとしています。8732 ポートで開かれた https を使用して、次の構成でサービスを作成しているとします。

<wsHttpBinding>
    <binding name="SecurityTest">
        <security mode="Transport">
            <transport clientCredentialType="Certificate"/>
        </security>
    </binding>
</wsHttpBinding>

<service name="MyNamespace.MyService">
    <host>
        <baseAddresses>
            <add baseAddress="https://localhost:8732/MyService/" />
        </baseAddresses>
    </host>
    <endpoint 
        address="" 
        binding="wsHttpBinding" bindingConfiguration="SecurityTest"
        contract="MyNamespace.IContract" >
    </endpoint>      
</service>

次に、新しい証明書を作成できるように、ルート機関の自己署名証明書を作成します。

makecert -n "CN=MyAuthority" -r -sv MyAuthority.pvk MyAuthority.cer -sky exchange

MyAuthority.cer次に、ローカル マシンの「ルート」カタログに追加します。この後、MyAuthority 証明書を使用して別の証明書を作成し、ローカル マシンの「My」カタログに配置します。

makecert -sky exchange -sk local -iv MyAuthority.pvk -n "CN=local" -ic MyAuthority.cer local.cer -sr Localmachine -ss My

次に、netsh を使用して local.cer 証明書を 8732 ポートにバインドします。

netsh http add sslcert ipport=0.0.0.0:8732 certhash=02b751d7f71423c27141c9c385fc3d3976 d7 aa b5 appid={C4BFC5DC-2636-495B-9803-8DD8257C92C3} 

サーバーサービス側が出来上がり、起動して動きます。次に、クライアントを作成します。

<bindings>
    <wsHttpBinding>
        <binding name="SecurityTest" >
            <security mode="Transport">
                <transport clientCredentialType="Certificate"  />
            </security>
        </binding>
    </wsHttpBinding>
</bindings>
<client>
    <endpoint name="testPoint"
        address="https://localhost:8732/MyService/" 
        binding="wsHttpBinding" bindingConfiguration="SecurityTest"  
        behaviorConfiguration="ep" 
        contract="MyNamespace.IContract">
    </endpoint>
</client>
<behaviors>
    <endpointBehaviors>
        <behavior name="ep" >
            <clientCredentials>
                <clientCertificate findValue="local" 
                       storeLocation="CurrentUser" storeName="My" 
                       x509FindType="FindBySubjectName" />
            </clientCredentials>
        </behavior>
    </endpointBehaviors>
</behaviors>

それを開始してサービス メソッドを使用すると、エラーが発生します。

MessageSecurityException: リモート コンピューターから資格情報で保護された WCF サービスにアクセスするときに、クライアント認証スキーム 'Anonymous' で HTTP 要求が禁止されました

このスキームのすべてをよく理解しているかどうかを尋ね、このエラーを解決する方法についてアドバイスを得ることができます。

  1. サービスは local.cer を使用してトランスポート レベルでメッセージを暗号化しますか?

  2. MyAuthority.cerクライアントが個人的な検証ハンドラーを作成せずにメッセージを復号化できるようにするには、各クライアント コンピューターの信頼できる公開カタログに追加する必要がありますか?

  3. 現在の例のクライアントは、資格情報として local.cer を使用しており、この証明書はサービス側に送信されますか?

  4. サーバー側はクライアント証明書をどのように処理しますか? MyAuthority.cer によって署名されているかどうかを確認しますか、それとも ssl 証明書で確認しますか? 証明書のチェック対象を確認するにはどうすればよいですか?

  5. エラーが発生するのはなぜですか?

前もって感謝します

4

1 に答える 1

3

1)。サービスは local.cer を使用してトランスポート レベルでメッセージを暗号化しますか?

はい、そうです。

2)。クライアントが個人用の検証ハンドラーを作成せずにメッセージを復号化できるようにするために、各クライアント コンピューターの信頼できる公開済みカタログに MyAuthority.cer を追加する必要がありますか?

はい、自己署名証明書 (作成した機関/CA によって署名されたもの) を使用しているため、クライアントは機関/CA を信頼するか、クライアント側でコード/構成を記述する必要があります。例外"。

3)。現在の例のクライアントは、資格情報として local.cer を使用しており、この証明書はサービス側に送信されますか?

問題ないかもしれませんが、クライアントとサーバーの両方に同じ証明書を使用しないでください。クライアントには別の証明書を使用する必要があります。現在、構成ごとに次の証明書を使用するように指示しています。

<clientCertificate findValue="localhost" storeLocation="CurrentUser" storeName="My" x509FindType="FindBySubjectName" />

そのため、Subject name = " localhost "の証明書がCurrentUser/Myストアにあり、クライアント プログラムを実行している ID がその証明書 (およびその秘密鍵) にアクセスできる場合、それはクライアント証明書としてサーバーに提示されます。

4)。サーバー側はクライアント証明書をどのように処理しますか? MyAuthority.cer によって署名されているかどうかを確認しますか、それとも ssl 証明書で確認しますか? 証明書のチェック対象を確認するにはどうすればよいですか?

サーバー側のフレームワークは、提示されたクライアント証明書が有効で信頼できるものであることを確認します。クライアントが VeriSign などによって署名された証明書を提示し、マシン/信頼できる CA ストアに VeriSign CA がある場合、それは有効なクライアント証明書と見なされます。受け入れられる証明書を特定の CA によって署名されたもののみに制限したい場合は、そのための追加のコードを追加する必要があります (またはストアから他のすべての信頼できる CA を削除します)。

5)。エラーが発生するのはなぜですか?

この (やや不可解な) エラー メッセージが表示される理由はいくつかあります。まず、項目 3 に指定されているものと一致する証明書が店舗にありますか?

于 2013-08-09T15:25:14.283 に答える