4

だから私は証明書で完全に迷っています。これに関するソリューションとチュートリアルをウェブ全体で検索しましたが、本当に役立つものは何も見つかりませんでした。私がやろうとしているのは、WCF クライアント サーバー アプリケーションのサーバー証明書とクライアント証明書の両方を検証することです。アプリケーションは IIS でホストされます。私は自分の開発用コンピューター (サーバーは localhost) とテスト (クライアントとサーバーは Windows サーバー) でそれを使用したいと考えています。

私が今持っている構成は次のとおりです。

クライアント:

<behaviors>
  <endpointBehaviors>
    <behavior name="myBehaviorConfig">
      <clientCredentials>
        <clientCertificate findValue="CN=MyTestClientCertificate"
                            storeLocation="LocalMachine"
                            x509FindType="FindBySubjectDistinguishedName"/>
      </clientCredentials>
    </behavior>
  </endpointBehaviors>
</behaviors>

<bindings>
  <wsHttpBinding>
    <binding name="MyBindingConfig">
      <security mode="TransportWithMessageCredential">
        <transport realm=""/>
        <message clientCredentialType="Certificate"/>
      </security>
    </binding>
  </wsHttpBinding>
</bindings>

<client>
  <endpoint address="https://localhost/Service.Calculator.svc"
            binding="wsHttpBinding"
            bindingConfiguration="MyBindingConfig"
            behaviorConfiguration="MyBehaviorConfig"
            contract="Service.ICalculator"
            name="ICalculatorServiceEndpoint">
    <identity>
      <servicePrincipalName value="host"/>
    </identity>
  </endpoint>    
</client>

サーバ:

 <behaviors>
  <serviceBehaviors>
    <behavior name="myBehavior">
      <serviceCredentials>
        <serviceCertificate findValue="CN=MyTestRootCA"
                            storeLocation="LocalMachine"
                            x509FindType="FindBySubjectDistinguishedName"/>
        <userNameAuthentication userNamePasswordValidationMode="Windows"/>
        <clientCertificate>
          <authentication certificateValidationMode="PeerOrChainTrust"/>
        </clientCertificate>
      </serviceCredentials>
      <serviceMetadata httpsGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="true"/>
      <unity operationContextEnabled="true"
             instanceContextEnabled="true"
             contextChannelEnabled="true"
             serviceHostBaseEnabled="true"/>
    </behavior>
  </serviceBehaviors>
</behaviors>

<bindings>
  <wsHttpBinding>
    <binding name="MyBinding">
      <security mode="TransportWithMessageCredential">
        <transport realm=""/>
        <message clientCredentialType="Certificate"/>
      </security>
    </binding>
  </wsHttpBinding>
</bindings>

<services>
  <service name="Service.Calculator"
           behaviorConfiguration="myBehavior">
    <endpoint address=""
              binding="wsHttpBinding"
              bindingConfiguration="MyBinding"
              contract="Service.ICalculator" />
    <endpoint address="mex"
              binding="mexHttpsBinding"
              contract="IMetadataExchange"
              name="CalculatorServiceMex" />
  </service>
</services>

「CN = MyTestRootCA」は「作成中の」証明書の「権限」であり、ローカルコンピューターの信頼されたルート証明書とローカルコンピューターの個人用ディレクトリに彼を置きました。そして、クライアント証明書「CN=MyTestClientCertificate」の発行者です。

いくつかのこと..

クライアント証明書は「MMC」の CurretUser ディレクトリにある必要があることはわかっていますが、そこにある場合、アプリが証明書を見つけることができないという例外があります。「FindBySubjectDistinguishedName」と「FindByThumbprint」で見つけようとしましたが、どちらも「指定された基準で証明書が見つかりません...」という同じ例外だったので、LocalMachineに入れました。なぜそれがうまくいかなかったのか、誰にも分かりますか?

これには多くの問題と例外がありました=\現在のものは次のとおりです:「秘密鍵がX.509証明書に提示されていません」この例外に精通していて、修正方法を知っている人はいますか?

あなたの答えに感謝します、私は今数日間これに座っています

4

1 に答える 1