2

私は、Java Web サービスを公開しているベンダーと協力しています。サービスを利用するために WCF クライアントを作成しましたが、クライアント証明書に問題があります。ベンダーは、リクエストにクライアント証明書が含まれていないと主張しており、リクエストを拒否しています。これが私たちの側にあると 100% 確信しているわけではありませんが、証明書の構成から何も抜けていないことを確認したかったのです。

App.Config

  <system.serviceModel>
    <behaviors>
      <endpointBehaviors>
        <behavior name="NewBehavior">
          <clientCredentials>
            <clientCertificate findValue="[CLIENT_CERT_NAME]" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
          </clientCredentials>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <diagnostics>
      <messageLogging
           logEntireMessage="true"
           logMalformedMessages="false"
           logMessagesAtServiceLevel="true"
           logMessagesAtTransportLevel="false"
           maxMessagesToLog="3000"
           maxSizeOfMessageToLog="2000"/>
    </diagnostics>
    <bindings>
      <basicHttpBinding>
        <binding name="VendServiceBinding" closeTimeout="00:01:00" openTimeout="00:01:00"
            receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false"
            bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
            maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
            messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
            useDefaultWebProxy="true">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
              maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <security mode="Transport">
            <transport clientCredentialType="None" proxyCredentialType="None"
                realm="" />
            <message clientCredentialType="UserName" algorithmSuite="Default" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="https://[SERVICE_URL]/Vend/VendService"
          binding="basicHttpBinding" bindingConfiguration="VendServiceBinding"
          contract="VendService" name="VendService" behaviorConfiguration="NewBehavior" />
    </client>
  </system.serviceModel>

Client.cs

VendServiceClient client = new VendServiceClient("VendService");
createMemberResponse response = new createMemberResponse();
createMember member = new createMember();

// Check Certificate Just Before Executing
string certCheck = Environment.NewLine + "Check Certificate Just Before Executing - ClientCredentials Name: " + client.ClientCredentials.ClientCertificate.Certificate.GetNameInfo(
    System.Security.Cryptography.X509Certificates.X509NameType.SimpleName
    , false) + Environment.NewLine;

member = GetCreateMember(reader, siteConfig, recordID);
response = client.createMember(member);
returnStatus = response.VendHeader.ReturnStatus;
DetailedErrorMessage = response.VendBody.Vend.DetailedErrorMessage;

実行中に「certCheck」をチェックして証明書の名前を確認できるので、証明書ストアから取得していることがわかります。また、これは、「client.createMember()」へのリクエストを行うときに証明書を添付する必要があることを意味すると想定しています。私が返すエラーは、ベンダーが実行している証明書に対するカスタム検証によるものです...おそらく問題は検証にありますか???

証明書 (.pfx) をインストールしたときにパスワードを入力する必要がありましたが、証明書を使用するためにもこのパスワードが必要ですか? 構成やコードのどこにも追加していません。

リクエストにクライアント証明書が含まれていることを確認する方法についてのアイデアはありますか?

[更新] ようやく Fiddler を実行できるようになりました。ヘッダーに証明書の詳細が表示されることを期待していましたが、これが私が持っているものです。これは、証明書を送信していないということですか?

<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Header>
      <ActivityId xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics" CorrelationId="10afd012-1130-42ea-aaa8-281c9fab723a">395f129c-fd59-48b1-a19d-387bbffe1465</ActivityId>
   </s:Header>
   <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <createMember xmlns="http://[SERVICE_URL]/Vend/VendService">
         <createMember xmlns="">
            <VendHeader>

[更新] フィドラーが機能していて、「トンネル先」行を見ると、サーバーの証明書が表示されますが、自分のクライアント証明書からは何も表示されません。まだ混乱していますが、ここにあるはずですよね?

HTTP/1.1 200 Connection Established
FiddlerGateway: Direct
StartTime: 10:37:08.575
Connection: close

Encrypted HTTPS traffic flows through this CONNECT tunnel. HTTPS Decryption is enabled in Fiddler, so decrypted sessions running in this tunnel will be shown in the Web Sessions list.

Secure Protocol: Tls
Cipher: Rc4 128bits
Hash Algorithm: Md5 128bits
Key Exchange: RsaKeyX 2048bits

== Server Certificate ==========
4

0 に答える 0