【问题标题】:Struggling with REST call and certificates在 REST 调用和证书中苦苦挣扎
【发布时间】:2015-02-18 08:15:57
【问题描述】:

我正在尝试与需要证书才能进行调用的 REST Web 服务通信。我从我的客户那里得到了两个文件——一个*.pem 和一个*.key 文件。

使用这两个文件,我可以在命令行上使用curl 调用该网络服务:

curl.exe -k -v "MyUrl" --cert mycert.pem --key mycertkey.key

这行得通。但我想使用 Fiddler 并最终使用我自己的 C# 代码来进行调用 - 但是如何?

在 Fiddler 中,我正在阅读有关必须在特定目录中以 ClientCertificate.cer 文件的形式提供证书.....但我有一个 .pem 和一个 .key文件 - 如何将这些“翻译”成*.cer 文件?

我如何在自己的 C# 代码 中使用这些 *.pem 和 *.key 文件来调用该 Web 服务(使用 RestSharp 或只是一个普通的 WebRequest)?

更新:按照 Drew Burchett 的回答,我将我的 .pem 文件导入我机器上的证书存储区,然后将其导出到 .cer 文件(“DER 编码, binary") 并将其放在 Fiddler 的文件夹中。尝试调用 REST 服务时,我仍然从 Fiddler 收到此错误:

[Fiddler] 与“......”的连接失败。
System.Security.SecurityException 无法与 server.fiddler.network.https 协商 HTTPS 连接;与 (url) 的 HTTPS 握手失败。
System.Security.Authentication.AuthenticationException SSPI 调用出错,请参阅内部异常;收到的消息的格式是意外或错误的

有趣的是,最后一段(System.Security.Authentication.AuthenticationException 段)在我的系统上显示为德语,而其余的则为英语......奇怪......

更新 #2:
在 C# 代码中使用带有 https:// 前缀的 WebRequest 和安装在证书存储中的证书(我自己的证书、受信任的根证书)尝试此操作失败并出现错误:

System.Net.WebException 被捕获
HResult=-2146233079
Message=请求中止:无法建立安全的 SSL/TLS 通道。

有什么想法吗?

【问题讨论】:

    标签: c# rest curl fiddler restsharp


    【解决方案1】:

    您应该能够通过证书管理器将 .pem 文件转换为 .cer 文件。在 Windows 7 中,单击开始 |运行并输入 certmgr.msc。在 Windows 8 中,右键单击开始按钮并选择运行。输入 certmgr.msc 并单击确定。打开证书管理器后:

    1. 展开个人文件夹并单击证书文件夹
    2. 右键单击证书文件夹(如果证书不存在,则右键单击个人文件夹)并单击导入。
    3. 浏览到 .pem 文件的保存位置并选择它。
    4. 选择将证书导入指定文件夹。

    导入过程完成后,您应该会看到证书。然后,您可以右键单击它并选择导出。选择 .cer 文件并提供保存证书的路径和文件名。

    如果这是一个用于识别您正在连接的服务器的证书(我怀疑它是)并且它是一个自签名证书,为了在您的 C# 代码中使用它,您需要放置它在您的受信任的根证书颁发机构文件夹中。然后,当您使用 WebRequest 和 https 前缀调用服务时,证书将被信任并且调用将成功。您可以使用上述过程将证书导入到正确的文件夹中,也可以使用Microsoft 中的方法将证书嵌入到应用程序的“根”文件夹中:

    1. 将服务器证书导出到 .der 文件
    2. 在您的应用程序中包含证书(我将我的证书放在资产目录中) 将证书包含在项目中后右键单击它,然后 一种。将构建操作设置为内容 湾。将复制到输出目录设置为始终复制
    3. 通过右键单击在文本或 XML 编辑器中打开 package.appxmanifest 并将您的证书添加到“根”

        <Extensions>
      <!--Certificates Extension-->
      <Extension Category="windows.certificates">
        <Certificates>
          <Certificate StoreName="Root" Content="Assets\jsanders4.cer" />
      
        </Certificates>
      </Extension>
      

    【讨论】:

    • 谢谢,我按照你的步骤,得到了一个.cer 文件,将它作为ClientCertificate.cer 存储在Fiddler 文件夹中 - 错误仍然是一样的...... [Fiddler] 连接到'......' 失败的。 System.Security.SecurityException 无法与 server.fiddler.network.https 协商 HTTPS 连接;与 (url) 的 HTTPS 握手失败。 System.Security.Authentication.AuthenticationException SSPI 调用出错,请参阅内部异常;收到的消息的格式是意外或错误的
    • 我不熟悉使用 Fiddler,但是当我使用证书滚动自己的 WCF 服务并收到 SSPI 错误时,这几乎总是意味着 RSA 密钥要么与证书属性无关或者不存在。 .cer 文件不包含 RSA 密钥,因此这可能是问题所在。我会尝试将 .pem 文件导入到受信任的根证书颁发机构文件夹中,看看是否能解决问题。
    • 我试过你的提示 - 不幸的是,它根本没有改变任何东西:-( Fiddler 中的错误仍然是一样的......
    • 有没有办法查看它所指的内部异常?这可能会提供一些清晰度。
    • 很抱歉 - 我不知道如何在 Fiddler 中执行此操作 :-( .... 我将这些内容作为简单的文本字符串返回,并且我没有找到任何设置或选项来告诉 Fiddler 返回该内部异常:-(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    相关资源
    最近更新 更多