挣扎于 REST 调用和证书
Struggling with REST call and certificates
我正在尝试与需要证书才能进行调用的 REST Web 服务通话。我从我的客户那里得到了两个文件——一个 *.pem
和一个 *.key
文件。
使用这两个文件,我可以使用 curl
:
在命令行上调用该 Web 服务
curl.exe -k -v "MyUrl" --cert mycert.pem --key mycertkey.key
这行得通。但我想使用 Fiddler 并最终使用我自己的 C# 代码来进行调用 - 但是如何?
在 Fiddler 中,我正在阅读有关必须将证书作为特定目录中的 ClientCertificate.cer
文件提供的信息......但我有一个 .pem
和 .key
文件 - 如何将这些 "translate" 放入 *.cer
文件?
以及如何在我自己的 C# 代码 中使用这些 *.pem
和 *.key
文件来调用该 Web 服务(使用 RestSharp 或只是一个普通的 WebRequest
) ?
更新: 按照 Drew Burchett 的回答,我将我的 .pem
文件导入到我机器上的证书存储中,然后将其导出到 .cer
文件 ("DER-encoded, binary") 并将其放在 Fiddler 的文件夹中。尝试调用 REST 服务时,我仍然从 Fiddler 收到此错误:
[Fiddler] The connection to '......' failed.
System.Security.SecurityException Failed to negotiate HTTPS connection with server.fiddler.network.https; HTTPS handshake to (url) failed.
System.Security.Authentication.AuthenticationException Error with SSPI call, see internal exception; the format of the received message was unexpected or erroneous
有趣的是,最后一段(System.Security.Authentication.AuthenticationException
段)在我的系统中显示为德文,而其余部分为英文....奇怪......
更新#2:
在 C# 代码中使用带有 https://
前缀的 WebRequest
和证书存储中安装的证书(我自己的证书、受信任的根证书)尝试此操作失败并出现错误:
System.Net.WebException was caught
HResult=-2146233079
Message=The request was aborted: no secure SSL/TLS channel could be established.
有什么想法吗?
您应该能够通过证书管理器将 .pem 文件转换为 .cer 文件。在Windows7中,点击开始| 运行 并输入 certmgr.msc。在Windows8中,右击开始按钮,select运行。输入 certmgr.msc 并单击“确定”。打开证书管理器后:
- 展开个人文件夹并单击证书文件夹
- 右键单击“证书”文件夹(如果证书不存在,则右键单击“个人”文件夹),然后单击“导入”。
- 浏览到您的 .pem 文件的保存位置并select它。
- Select将证书导入指定文件夹。
导入过程完成后,您应该会看到证书。然后您可以右键单击它并 select 导出。选择 .cer 文件并提供路径和文件名以保存证书。
如果这是一个用于识别您正在连接的服务器的证书(我怀疑它是)并且它是一个自签名证书,为了在您的 C# 代码中使用它,您需要将其放在受信任的根证书颁发机构文件夹中。然后,当您使用 WebRequest 和 https 前缀调用服务时,证书将被信任并且调用将成功。您可以使用上述过程将证书导入适当的文件夹,也可以使用 Microsoft:
中的方法将证书嵌入应用程序的 "Root" 文件夹中
- 将服务器证书导出到 .der 文件
- 在你的应用程序中包含证书(我把我的放在资产目录中)
将证书包含在项目中后右键单击该证书,然后
一种。将构建操作设置为内容
b.将复制到输出目录设置为始终复制
在文本或 XML 编辑器中右键单击打开 package.appxmanifest,然后将您的证书添加到 "Root"
<Extensions>
<!--Certificates Extension-->
<Extension Category="windows.certificates">
<Certificates>
<Certificate StoreName="Root" Content="Assets\jsanders4.cer" />
</Certificates>
</Extension>
我正在尝试与需要证书才能进行调用的 REST Web 服务通话。我从我的客户那里得到了两个文件——一个 *.pem
和一个 *.key
文件。
使用这两个文件,我可以使用 curl
:
curl.exe -k -v "MyUrl" --cert mycert.pem --key mycertkey.key
这行得通。但我想使用 Fiddler 并最终使用我自己的 C# 代码来进行调用 - 但是如何?
在 Fiddler 中,我正在阅读有关必须将证书作为特定目录中的 ClientCertificate.cer
文件提供的信息......但我有一个 .pem
和 .key
文件 - 如何将这些 "translate" 放入 *.cer
文件?
以及如何在我自己的 C# 代码 中使用这些 *.pem
和 *.key
文件来调用该 Web 服务(使用 RestSharp 或只是一个普通的 WebRequest
) ?
更新: 按照 Drew Burchett 的回答,我将我的 .pem
文件导入到我机器上的证书存储中,然后将其导出到 .cer
文件 ("DER-encoded, binary") 并将其放在 Fiddler 的文件夹中。尝试调用 REST 服务时,我仍然从 Fiddler 收到此错误:
[Fiddler] The connection to '......' failed.
System.Security.SecurityException Failed to negotiate HTTPS connection with server.fiddler.network.https; HTTPS handshake to (url) failed.
System.Security.Authentication.AuthenticationException Error with SSPI call, see internal exception; the format of the received message was unexpected or erroneous
有趣的是,最后一段(System.Security.Authentication.AuthenticationException
段)在我的系统中显示为德文,而其余部分为英文....奇怪......
更新#2:
在 C# 代码中使用带有 https://
前缀的 WebRequest
和证书存储中安装的证书(我自己的证书、受信任的根证书)尝试此操作失败并出现错误:
System.Net.WebException was caught
HResult=-2146233079
Message=The request was aborted: no secure SSL/TLS channel could be established.
有什么想法吗?
您应该能够通过证书管理器将 .pem 文件转换为 .cer 文件。在Windows7中,点击开始| 运行 并输入 certmgr.msc。在Windows8中,右击开始按钮,select运行。输入 certmgr.msc 并单击“确定”。打开证书管理器后:
- 展开个人文件夹并单击证书文件夹
- 右键单击“证书”文件夹(如果证书不存在,则右键单击“个人”文件夹),然后单击“导入”。
- 浏览到您的 .pem 文件的保存位置并select它。
- Select将证书导入指定文件夹。
导入过程完成后,您应该会看到证书。然后您可以右键单击它并 select 导出。选择 .cer 文件并提供路径和文件名以保存证书。
如果这是一个用于识别您正在连接的服务器的证书(我怀疑它是)并且它是一个自签名证书,为了在您的 C# 代码中使用它,您需要将其放在受信任的根证书颁发机构文件夹中。然后,当您使用 WebRequest 和 https 前缀调用服务时,证书将被信任并且调用将成功。您可以使用上述过程将证书导入适当的文件夹,也可以使用 Microsoft:
中的方法将证书嵌入应用程序的 "Root" 文件夹中- 将服务器证书导出到 .der 文件
- 在你的应用程序中包含证书(我把我的放在资产目录中) 将证书包含在项目中后右键单击该证书,然后 一种。将构建操作设置为内容 b.将复制到输出目录设置为始终复制
在文本或 XML 编辑器中右键单击打开 package.appxmanifest,然后将您的证书添加到 "Root"
<Extensions> <!--Certificates Extension--> <Extension Category="windows.certificates"> <Certificates> <Certificate StoreName="Root" Content="Assets\jsanders4.cer" /> </Certificates> </Extension>