WSHttpBindingsを使用して自己ホスト型のWCFサービスを作成し、自分で生成した証明書を使用してメッセージレベルのセキュリティを実装しようとしています。残念ながら、「パッケージに提供されたクレデンシャルが認識されませんでした」という埋め込み例外が(Service Trace Viewerを介して)発生します。
いくつかのメモ:
- これは、構成ではなく、コードで実行する必要があります
- (サーバー/クライアント)証明書は、デバッグ中にユーザーがアクセスできる秘密鍵を持つローカルマシンストアにある証明書です。
- 私はこれから地獄をグーグルで検索し、ここでWCFメッセージベースのセキュリティを設定するための優れたリソースを見つけました
何が欠けているのかわかりません。エンドポイントIDを作成することを除いて、これらのほとんどは簡単に思えます。DnsEndpointIdentitiesを使用するか、証明書ベースのものを使用するか、IDをまったく使用しないかにかかわらず、同じメッセージで失敗します。
誰かが私を正しい方向に向けることができますか?
サーバ側:
var binding = new WSHttpBinding
{
Security =
{
Mode = SecurityMode.Message,
Message =
{
ClientCredentialType = MessageCredentialType.Certificate,
AlgorithmSuite = SecurityAlgorithmSuite.Basic256Sha256Rsa15
}
}
};
_host = new ServiceHost(this)
{
Credentials =
{
ServiceCertificate =
{
Certificate = ServiceCert
},
ClientCertificate =
{
Certificate = ClientCert,
Authentication =
{
TrustedStoreLocation = StoreLocation.LocalMachine,
RevocationMode = X509RevocationMode.NoCheck,
CertificateValidationMode = X509CertificateValidationMode.PeerOrChainTrust
}
}
}
};
var address = new Uri(string.Format(@"http://serviceaddress"));
var ep = _host.AddServiceEndpoint(typeof (IService), binding, address);
ep.Address = new EndpointAddress(address, EndpointIdentity.CreateX509CertificateIdentity(ServiceCert));
_host.Open();
クライアント側:
var binding = new WSHttpBinding
{
Security =
{
Mode = SecurityMode.Message,
Message =
{
ClientCredentialType = MessageCredentialType.Certificate,
AlgorithmSuite = SecurityAlgorithmSuite.Basic256Sha256Rsa15
}
}
};
var address = new Uri(@"http://serviceaddress");
var endpoint = new EndpointAddress(address, EndpointIdentity.CreateX509CertificateIdentity(ServerCert));
var channelFactory = new ChannelFactory<IService>(binding, endpoint)
{
Credentials =
{
ServiceCertificate =
{
DefaultCertificate = ServerCert,
Authentication =
{
RevocationMode = X509RevocationMode.NoCheck,
TrustedStoreLocation = StoreLocation.LocalMachine,
CertificateValidationMode = X509CertificateValidationMode.PeerOrChainTrust
}
},
ClientCertificate =
{
Certificate = ClientCert
}
}
};
var channel = channelFactory.CreateChannel();