1

customBindingSOAP 1.2、TLS、およびクライアント証明書を使用して Web サービスを呼び出すを作成しようとしています。私が理解しているように、これは でのみ機能しcustomBindingます。

次の動作を定義しました。

<behaviors>
    <endpointBehaviors>
        <behavior name="TehRightBehaviour">
            <clientCredentials>
                <serviceCertificate>
                    <defaultCertificate findValue="WebInterface" x509FindType="FindBySubjectName" />
                    <authentication revocationMode="NoCheck" certificateValidationMode="None" />
                </serviceCertificate>
            </clientCredentials>
        </behavior>
    </endpointBehaviors>
</behaviors>

クライアントは証明書を見つけますが、間違った名前を指定すると、エラーが発生します。私のバインディングは次のようになります。

<customBinding>
    <binding name="TehRealBinding">
        <transactionFlow />
        <textMessageEncoding messageVersion="Soap12" />
        <security authenticationMode="MutualCertificate" />
        <httpsTransport requireClientCertificate="true" />
    </binding>
</customBinding>

そして、私はそれをエンドポイントで次のように結合します:

<client>
    <endpoint address="https://hestia1:8081/cm/main"
        behaviorConfiguration="TehRightBehaviour"
        binding="customBinding"
        bindingConfiguration="TehRealBinding"
        contract="BrightMain.CMMainService"
        name="cmmain" />
</client>

問題は、Web サービスを呼び出すと、次のような例外が発生することです。

「クライアント証明書が提供されていません。ClientCredentials でクライアント証明書を指定してください。」

証明書を指定するにはいくつかのポイントがあることがわかりましたが、明らかに間違ったものを使用しています。だから私の質問は:どれが正しいですか?

前もって感謝します、クリストフ

編集:おそらく、を指定するだけでは十分ではないため、読むことを学ぶ必要が<serviceCertificate>あります。これで確認します…

4

2 に答える 2

2

私はこうあるべき

<behavior name="TehRightBehaviour">
    <clientCredentials>
        <!-- clientCertificate not defaultCertificate -->
        <clientCertificate findValue="WebInterface" x509FindType="FindBySubjectName" />
        <serviceCertificate>
            <authentication revocationMode="NoCheck" certificateValidationMode="None" />
        </serviceCertificate>
    </clientCredentials>
</behavior>
于 2012-04-20T09:26:39.057 に答える
1

「個人」の下に証明書をインストールし、次のコードを使用したところ、うまくいきました。

X509Store keystore = new X509Store(StoreName.My, StoreLocation.CurrentUser);              
keystore.Open(OpenFlags.ReadOnly);

var certificates = keystore.Certificates;
foreach (var certificate in certificates)
{
    var friendlyName = certificate.FriendlyName;
    var xname = certificate.GetName();
}
X509Certificate certificatex = certificates[0];
X509Certificate2Collection certs = keystore.Certificates.Find(X509FindType.
            FindBySubjectName, "Name of subject", false);

そして、クライアントリクエストでそれを渡します

xyzClient.ClientCredentials.ClientCertificate.Certificate = certs[0];
于 2012-10-16T21:00:34.880 に答える