web-dev-qa-db-ja.com

クライアント認証スキーム「匿名」でHTTPリクエストが禁止されました

これは共通の問題であるように思われ、私はここですべての答えを見ましたが、どれも助けにはなりませんでした。

SSLをiisでホストされているbasichttpbindingおよびWCFサービスで動作させるようにしています。問題はIISまたは証明書にあると思います。 iisマネージャーで自己署名証明書を作成しました。私の証明書は「mycomputer」と呼ばれ、信頼されたルート証明書にも配置されています。クライアントは証明書を見つけるのに問題はありません。

Iisでの私の設定は、匿名認証を有効にし、その他はすべて無効にすることです。また、SSLを要求し、クライアント証明書を受け入れます。あれは正しいですか?無視するとエラーになります。

私の設定で何も問題がありません、これらは正しいですか?

サービス構成:

<system.serviceModel>
<services> 
  <service behaviorConfiguration="MyBehaviour" name="BasicHttpSecTest.Service1"> 
    <endpoint name="MyEndPoint" address="https://mycomputer/wp/" binding="basicHttpBinding" bindingConfiguration="ClientCertificateTransportSecurity" contract="BasicHttpSecTest.IService1" /> 
    <!--<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />-->
  </service> 
</services> 
<behaviors> 
  <serviceBehaviors> 
    <behavior name="MyBehaviour"> 
      <serviceMetadata httpsGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
      <serviceCredentials>
        <clientCertificate>
          <authentication certificateValidationMode="PeerOrChainTrust" revocationMode="NoCheck"/>
        </clientCertificate>
      </serviceCredentials>
    </behavior> 
  </serviceBehaviors> 
</behaviors> 
<bindings> 
  <basicHttpBinding> 
    <binding name="ClientCertificateTransportSecurity"> 
      <security mode="Transport"> 
        <transport clientCredentialType="Certificate" />
      </security> 
    </binding> 
  </basicHttpBinding> 
</bindings>
</system.serviceModel> 

クライアント構成:

<system.serviceModel> 
<client>
    <endpoint address="https://mycomputer/wp/Service1.svc" binding="basicHttpBinding"
        bindingConfiguration="MyEndPoint" contract="ServiceSSLref.IService1"
        name="MyEndPoint1" behaviorConfiguration="ClientCertificateCredential"/>
</client>

<bindings>
    <basicHttpBinding>
        <binding name="MyEndPoint">
            <security mode="Transport">
                <transport clientCredentialType="Certificate" />
            </security>
        </binding>
    </basicHttpBinding>
</bindings>

<behaviors> 
  <endpointBehaviors> 
    <behavior name="ClientCertificateCredential"> 
      <clientCredentials> 
        <clientCertificate findValue="mycomputer" storeLocation="LocalMachine" storeName="My" x509FindType="FindByIssuerName" />
        <serviceCertificate>
          <authentication certificateValidationMode="PeerOrChainTrust" revocationMode="NoCheck"/>
        </serviceCertificate>
      </clientCredentials> 
    </behavior> 
  </endpointBehaviors> 
</behaviors>
</system.serviceModel>
8
Zeezer

あなたの問題はクライアント証明書にあるのではないでしょうか。 clientCredentialType = "Certificate"を設定すると、クライアントはサーバーが信頼する証明書を指定する必要があることをWCFに伝えます。私が理解したように、サーバー側で生成された証明書しかありません。設定してみてください

 <transport clientCredentialType="None" /> 

これにより、サーバーが信頼する証明書を必要とせずにメッセージを送信できます。または、クライアント側で証明書を生成して、サーバーの信頼済みフォルダーに配置することもできます。多分この状態はあなたを助けるでしょう http://msdn.Microsoft.com/en-us/library/ms731074.aspx

6
Alex