4

サーバー証明書とクライアント証明書の両方の方法で、ssl (トランスポートセキュリティ) を使用して wcf クライアントとサーバー (自己ホスト型) を作成しようとしています。

Windows XP ではすべてが機能しますが、Windows 7 ではクライアント証明書で失敗しました。サーバーが winXp 上にあり、クライアントが win7 上にある場合は動作しますが、逆に動作しません。

サーバーの app.config は次のとおりです。

<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>         
        </behavior>
        <behavior name="NewBehavior1">
          <serviceMetadata httpsGetEnabled="true"/>
          <serviceCredentials>
            <serviceCertificate findValue="ServerCert" storeName="My" x509FindType="FindBySubjectName" />
            <clientCertificate>
              <authentication certificateValidationMode="ChainTrust" revocationMode="NoCheck" trustedStoreLocation="LocalMachine" />
            </clientCertificate>
            <windowsAuthentication allowAnonymousLogons="True"/>
          </serviceCredentials>

        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
      <basicHttpBinding>
        <binding name="Binding1">
          <security mode="Transport">
           <transport clientCredentialType="Certificate" proxyCredentialType="None" realm=""/>
          </security>
        </binding>
      </basicHttpBinding>

    </bindings>
    <services>
      <service behaviorConfiguration="NewBehavior1"
            name="Service.Calc">
        <endpoint
          address="https://172.18.96.116:8413/MyCalcService1"
          binding="basicHttpBinding"
          bindingConfiguration="Binding1"
          name="TestWCFService.Http"
          contract="Contarcts.ICalc" />
        <host>
          <baseAddresses>
            <add baseAddress="https://172.18.96.116:8413/MyCalcService1" />
          </baseAddresses>
        </host>
      </service>
    </services>
  </system.serviceModel>

</configuration>

クライアント:

<system.serviceModel>
    <behaviors>
      <endpointBehaviors>
        <behavior name="clientBehavior1">
          <clientCredentials>
            <clientCertificate findValue="ClientCert"
                 storeLocation="LocalMachine"
                 storeName="My"
                 x509FindType="FindBySubjectName" />
          </clientCredentials>
        </behavior>
      </endpointBehaviors>
    </behaviors>

    <bindings>
      <basicHttpBinding>
        <binding name="TestWCFService.Http1">
          <security mode="Transport">
          <transport clientCredentialType="Certificate" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="https://172.18.96.116:8413/MyCalcService1"
      binding="basicHttpBinding"
      bindingConfiguration="TestWCFService.Http1"
      contract="CalcProxy.ICalc"
      name="TestWCFService.WSHttp1"
      behaviorConfiguration="clientBehavior1"
      />
    </client>
  </system.serviceModel>

サーバーのコード:

ServiceHost calcHost = new ServiceHost(typeof(Calc));
calcHost.Open();

クライアントのコード:

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


CalcClient proxy = new CalcClient();
int res = proxy.Add(2, 4);

私のmakecertコマンドは次のとおりです。

makecert -sv SignRoot.pvk -cy authority -r MyCA.cer -a sha1 -n "CN=MyCA" -ss my -sr localmachine

makecert -iv SignRoot.pvk -ic MyCA.cer -cy end -pe -n CN="ClientCert" -eku 1.3.6.1.5.5.7.3.1 -ss my -sr localmachine -sky exchange -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12

makecert -iv SignRoot.pvk -ic MyCA.cer -cy end -pe -n CN="ServerCert" -eku 1.3.6.1.5.5.7.3.2 -ss my -sr localmachine -sky exchange -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12

また、CA が正しい場所 (ローカル コンピューター - 信頼されたルート CA) にあり、サーバー/クライアント証明書も正しい場所 (ローカル コンピューター - 個人) にあることを確認しました。

秘密鍵はエクスポート可能であり、「Everyone」が秘密鍵 (C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys) へのアクセス許可を持っていることを確認しました。

フィドラー経由で動作します。


SvcTraceViewer から得られるエラー:

クライアント側 -クライアント認証方式「匿名」で HTTP 要求が禁止されました。

サーバー側 -クライアント証明書が必要です。要求に証明書が見つかりませんでした。

HTTP トレースからのエラー:サーバー アプリケーションによるクライアント証明書の受信の試行が、次の状態で失敗しました: 0xC0000225。

私が見つけた同様の問題ですが、それでも立ち往生しています .NETアプリケーションがクライアント証明書の送信に失敗しました - Win 7 vs Win XP?

Windows 7 で動作させるにはどうすればよいですか?

ありがとう。

4

1 に答える 1

1

私が試すいくつかのこと:

  1. 証明書のフレンドリ名は、サービスを実行しているマシンの dns と同じである必要があります。サーバーとクライアントの両方が同じマシンで実行されている場合は、「CN=localhost」を使用します。

  2. 証明書を作成してインストールする方法については、このリンクを確認してください。

  3. セルフホスティングの場合、証明書をポートに手動で関連付ける必要があります。netshコマンド ラインを使用します。これを確認してください

これらの手順が役立つことを願っています...頑張ってください

于 2013-01-15T15:41:38.453 に答える