【问题标题】:C# WCF client error "The private key is not present in the X.509 certificate"C# WCF 客户端错误“X.509 证书中不存在私钥”
【发布时间】:2011-08-09 11:59:56
【问题描述】:

我正在尝试创建一个非常简单的 WCF 客户端应用程序,它将 SOAP 消息发送到第 3 方服务。所有消息都必须经过数字签名。在我将代码添加到更大的应用程序之前,这确实是一个概念验证。

我有一个包含证书的 .cer 文件和一个包含私钥的 .pem 文件。我一直在尝试做的是使用 .cer 文件加载证书,然后发出一条消息。但我收到以下错误“X.509 证书中不存在私钥”。

问题,其中一个问题是,我真的对 WCF、数字证书、私钥和所有这些废话几乎一无所知。我做了一些阅读,我用谷歌搜索,直到我脸色发青,我一无所获。

如果我打开 .cert 文件,会出现一个标有“BEGIN ENCRYPTED PRIVATE KEY”的部分,这表明私钥包含在证书中。那么,为什么我收到一条消息说它不存在?另外,如果确实需要将私钥添加到证书中,我该怎么做?

这基本上就是我正在做的事情。这不是我的实际代码,但它包含所有相关内容:

MyWSClient c = new MyWSClient();
c.ClientCredentials.ClientCertificate.Certificate = new X509Certificate2(@"pathToFile.cer");
c.SomeValidCall();

【问题讨论】:

    标签: wcf wcf-security wcf-client x509certificate private-key


    【解决方案1】:

    您如何创建此证书/密钥对?您可以使用 openssl 将它们组合成 PKCS#12 证书:

    openssl pkcs12 -export -in yourcert.crt -inkey yourprivkey.key -out newcert.p12 
    

    您可能需要使用输入格式才能使其与 .pem 私钥一起使用。

    【讨论】:

    • 看起来 pkcs 是我们提供的证书类型。我假设这是因为证书的名称包含“_pkcs”
    • 您是否将证书导入 Windows 证书存储?如果是这样,您必须选中将密钥标记为可导出的复选框,否则 WCF 将无法使用它。
    • @JohnC 请问那个复选框在哪里?我已经启动了 certmgr.msc,但我似乎无法找到它
    【解决方案2】:

    我的同事找到了解决方案。我不知道为什么,但使用 .der 文件而不是 .cer 文件可以解决问题。这是他使用证书、私钥和根证书 as.pem 文件生成 .der 文件的命令:

    openssl pkcs12 -export -in cert.pem -inkey private_key.pem -certfile root_cert.cer -out pkcs12.der
    

    【讨论】:

    • 我相信这样做的原因是因为私钥通常不会在 .cer 文件中找到。过去我不得不使用 .pfx 文件来获取在 Windows 中加载的私钥。
    猜你喜欢
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 2011-10-25
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    相关资源
    最近更新 更多