2011-07-22 12 views
3

既存のアプリケーションをMono(v2.10.2)に移行しようとしています。Monoを使用したWCF証明書セキュリティ

したがって、私はBasicHttpBindingとメッセージセキュリティでテストWCFサービスを作成しました。クライアントは.NETで完全に動作しますが、Monoで実行すると失敗します。

次のようにクライアントの工場がインスタンス化される:モノラル

//var certificate = CertificateUtil.GetCertificate(StoreLocation.LocalMachine, 
// StoreName.My, X509FindType.FindBySubjectDistinguishedName, CertName, true); 
var certificate = new X509Certificate2("certificate.pfx", "password"); 

var binding = new BasicHttpBinding(); 
binding.Security.Mode = BasicHttpSecurityMode.Message; 
binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.Certificate; 

var epa = new EndpointAddress(
    new Uri("http://localhost:53076/Service1.svc"), 
    new X509CertificateEndpointIdentity(certificate)); 

var factory = new ChannelFactory<IService1>(binding, epa); 
factory.Credentials.ServiceCertificate.DefaultCertificate = certificate; 
factory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None; 
factory.Credentials.ServiceCertificate.Authentication.RevocationMode = X509RevocationMode.NoCheck; 
factory.Credentials.ClientCertificate.Certificate = certificate; 

var client = factory.CreateChannel(); 

アプリケーションが例外をスローCreateChannel以内に失敗します。

のSystem.InvalidOperationException:バインディングは、チャネルタイプのいずれかをサポートしていません。契約「IService1」に許されるものです。

私はMonoソースコードにデバッグし、問題がAsymmetricSecurityBindingElement.InitiatorTokenParameter == nullであることを確認しました。

私はMonoを初めて使っています。多分、このトピックをカバーするドキュメンテーション/チュートリアルを教えてくれるかもしれません。

UPDATE:証明書オブジェクトは、現在の秘密鍵を持っているkonrad.kruczynskiの助けを借りて

。例外は同じです。したがって、これは証明書ストアの問題ではありません。

+0

誰かが、証明書ストアで証明書を検索するよりも、証明書を読む方がいいかもしれません。 pfxファイルからそれらを読み取ることは、私の目的のために完全であるでしょう。 –

+0

最新の投稿をご覧ください。 –

+0

私はこれをバグと見なします。 bugzillaに追加する価値があり、時々修正されることがあります。 –

答えて

2

はい、Windowsで作成した証明書には、通常、秘密鍵が含まれていません。それらはある種のキャッシュで見つけることができます。 this命令を使用して秘密鍵で証明書を作成できるはずです。 X509Certificate2は問題なくファイルを消費する必要があります。 hereと記載されている手順を試すこともできます。問題が発生した場合は、ただ書いてください。

Linux上でこのように作成された証明書は、Windowsでも完全に動作します。

更新:

は私が正しくあなたのコメントを理解しているかどうかわかりません。

var myCert = new X509Certificate2("filename.pfx", "password"); 

certficateにキーが含まれていれば、私のために働いています。

+0

私は証明書が大丈夫だと思う。なぜなら、.NETで動作させると完全に動作するからだ。しかし、Mono証明書ストアがWindows証明書ストアと同じように動作するかどうかはわかりません。 2番目のリンクでは、sslを使用します。しかし、私の問題は、メッセージセキュリティのクライアント証明書にあります。 –

+0

もちろん、証明書ファイルを読むのは簡単です!これにより私は秘密鍵で証明書を読むことができますが、例外は同じです。 –

関連する問題