これがシナリオです。私たちは、すべて私たちがホストする 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>
サービスを実行しているユーザーは、証明書と秘密鍵の両方にアクセスできます。では、インストールされている証明書を使用できないのはなぜですか?