【问题标题】:WCF certificate security with MonoMono 的 WCF 证书安全性
【发布时间】:2011-07-22 23:43:55
【问题描述】:

我正在尝试将现有应用程序迁移到 Mono (v2.10.2)。

因此,我创建了一个带有 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();

在 Mono 中,应用程序在 CreateChannel 中失败并抛出异常:

System.InvalidOperationException:绑定不支持合同“IService1”允许的任何通道类型。

我调试到Mono源代码,发现问题是AsymmetricSecurityBindingElement.InitiatorTokenParameter == null。

我是 Mono 的新手,也许您可​​以向我指出涵盖该主题的文档/教程。

更新:

在 konrad.kruczynski 的帮助下,证书对象现在有了一个私钥。例外仍然相同。所以这不是证书存储问题。

【问题讨论】:

  • 也许有人可以为我指出一种比在证书存储中搜索证书更好的方法来阅读证书。从 pfx 文件中读取它们对于我的目的来说是完美的。
  • 我会认为这是一个错误。值得添加到 bugzilla,它们有时会很快得到修复。
  • 我在单声道邮件列表中发布了同样的问题。
  • 消息安全不受官方支持。所以我不会从单声道邮件列表中获得帮助。
  • 我也有同样的需求,所以我对你在这里的成功很感兴趣。

标签: wcf mono certificate


【解决方案1】:

是的,在 Windows 上创建的证书通常不包含私钥。它们可以在某种缓存中找到。您应该能够使用 this 指令创建带有私钥的证书。 X509Certificate2 应该毫无问题地使用该文件。您也可以尝试here 描述的程序。有什么问题就写吧。

还值得补充的是,在 Linux 上以这种方式创建的证书也可以在 Windows 上完美运行。

更新:

我不确定我是否正确理解了您的评论。您可以使用以下代码加载 PFX 证书:

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

鉴于证书包含密钥,它对我有用。

【讨论】:

  • 我认为证书没问题,因为它在使用 .NET 运行时可以完美运行。但我不确定 Mono 证书存储是否与 Windows 证书存储相同。在第二个链接中,他们使用 ssl。但我的问题在于消息安全中的客户端证书。
  • 是的,当然读取证书文件就是这么容易!这使我可以使用私钥读取证书,但异常仍然相同。
猜你喜欢
  • 1970-01-01
  • 2010-10-21
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-16
  • 1970-01-01
相关资源
最近更新 更多