0

これがシナリオです。私たちは、すべて私たちがホストする Web インターフェースを介してソフトウェアを提供しています。ただし、このサービスはお客様と少し通信する必要があるため、お客様のサイトに WCF サービスをインストールして、当社のサービスと対話できるようにすることを計画しています。

このサービスの役割の一部は、Active Directory に対してユーザーを認証することです。これは、ネットワーク経由でユーザー名とパスワードを送信することを意味します。これらを確保する必要があります。当初の計画は単純にそれらを暗号化することでしたが、その後プロジェクトに着手し、WCF サービスを証明書で保護できることに気付きました。

ただし、ローカル インストールごとに適切に署名された証明書を購入してインストールする必要はありません。つまり、makecert.exe 証明書を使用することは、多くのセキュリティ チェックをオフにすることを意味します。この時点で、セキュリティに関しては私の専門知識の限界に達しています。実稼働環境で署名されていない証明書を使用するのは悪い考えですか? もしそうなら、それはどのような点で安全ではありませんか?

いずれにせよ、証明書を使用してサービスをローカルで実行することに問題が発生しました。誰かが助けてくれれば幸いです。サービスは証明書がなくても正常に動作するため、問題は明らかにありません。サービスを開始しようとすると、次のようになります。

System.InvalidOperationException: The service certificate is not provided. Specify a service certificate in ServiceCredentials. 

つまり、証明書が見つからないことを意味しているようです。しかし、それは可能です: 検索条件を変更すると、探している証明書がストアにないという別のメッセージが表示されるためです。構成の関連ビットは次のとおりです。

  <system.serviceModel>
    <services>
      <service name="Namespace.Endpoint"
               behaviorConfiguration="default">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8000/Endpoint"/>
          </baseAddresses>
        </host>
        <endpoint address=""
                  binding="wsHttpBinding"
                  bindingConfiguration="secureWsHttpBinding"
                  contract="Namespace.IContract" />
        <endpoint address="mex"
                  binding="mexHttpBinding"
                  contract="IMetadataExchange" />
      </service>
    </services>
    <bindings>
      <wsHttpBinding>
        <binding name="secureWsHttpBinding">
          <security mode="Message">
            <message clientCredentialType="Certificate" />
          </security>
        </binding>
      </wsHttpBinding>  
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="default">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="False"/>
          <serviceCredentials>
            <clientCertificate>
              <authentication 
                 certificateValidationMode="ChainTrust"
                  revocationMode="NoCheck" />
              <certificate storeName="My" 
                            x509FindType="FindBySubjectName" 
                            storeLocation="LocalMachine"
                            findValue="MyTestCert" />
            </clientCertificate>
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

サービスを実行しているユーザーは、証明書と秘密鍵の両方にアクセスできます。では、インストールされている証明書を使用できないのはなぜですか?

4

1 に答える 1

1

エラー メッセージThe service certificate is not provided. Specify a service certificate in ServiceCredentialsに示されているように、サービス証明書を提供する必要があります。HTTPS には、サーバー証明書とオプションのクライアント証明書が含まれます。

<serviceCredentials>
    <serviceCertificate findValue="MyTestServerCert"
           storeLocation="LocalMachine"
               storeName="My" x509FindType="FindBySubjectName" />
</serviceCredentials>

自己署名証明書を使用する限り、証明書が使用されるマシンを制御できる場合は問題ありません。ルート CA を使用して証明書に署名し、このルート CA をマシンの信頼できる CA のリストに追加できる場合は、証明書チェックを緩和する必要はありません。では、なぜ人々はお金を払って資格を取得するのでしょうか? 答えは、すべてのマシンをこのように制御することはできないということです。公開サイトでは、ルート CA を信頼できる CA リストに追加するようすべての訪問者に求めることはできません。証明書を発行するために誰もが信頼する人が必要であり、それが CA の出番です。

ところで、すべてのユーザーに証明書を発行することを計画している場合、すべての証明書を管理するのは面倒で管理者のオーバーヘッドが大きくなります。

于 2013-06-28T15:24:04.947 に答える