带有crt的c#https调用和带有密码短语的密钥文件

带有crt的c#https调用和带有密码短语的密钥文件,c#,https,httpclient,x509certificate,C#,Https,Httpclient,X509certificate,我有一个crt和密钥文件以及一个密码短语 我通过Postman成功地使用这些函数调用外部API。 我如何在c#中实现这一点 我看到了将X509Certificate与httpclient一起使用的示例,但是我没有看到任何构造函数的选项,我可以将其与2个文件一起使用并设置密码短语。.NET不会为您轻松做到这一点 老实说,您最好的选择是使用类似OpenSSL的东西将证书和密钥粘合到一个PFX中 假设您决定不这样做,答案将继续 关于如何在没有证书的情况下加载密钥的问题不计其数,例如: 一旦

我有一个crt和密钥文件以及一个密码短语

我通过Postman成功地使用这些函数调用外部API。 我如何在c#中实现这一点


我看到了将X509Certificate与httpclient一起使用的示例,但是我没有看到任何构造函数的选项,我可以将其与2个文件一起使用并设置密码短语。.NET不会为您轻松做到这一点

老实说,您最好的选择是使用类似OpenSSL的东西将证书和密钥粘合到一个PFX中

假设您决定不这样做,答案将继续

关于如何在没有证书的情况下加载密钥的问题不计其数,例如:

一旦你知道了如何加载密钥,你就有了一个密钥和一个证书,而它们彼此并不理解。有解决办法

最安全、最简单的下一步: 如果您在.NETCore上,或者正在使用.NETFramework4.7.2,则可以使用

X509Certificate2 certWithKey = cert.CopyWithPrivateKey(privateKey);
如果要将certWithKey添加到X509存储区,则需要使用持久化密钥,或者导出到PFX并使用
X509KeyStrageFlags.PersistKeySet

在遥远的第二天: 如果(全部):

  • 您使用的是.NETFramework(不是.NETCore)
  • 您的密钥是
    RSACryptoServiceProvider
    DSACryptoServiceProvider
  • 您的密钥已加载到密钥容器中(
    !string.IsNullOrEmpty(key.CspKeyContainerInfo.KeyContainerName)
  • 您可能尚未从X509Store获得此证书,或者您并不担心可能出现意外的副作用
然后可以使用X509Certificate2.PrivateKey的setter

最后的想法
关于制作PFX,在我的答案底部有一些p/Invoke建议。一旦您制作了PFX,您就回到了“简单”领域。

感谢@bartonjs的回复。因此,如果我改为pfx(使生活更轻松),我可以使用X509Certificate(字符串文件名、SecureString密码)吗ctr@Noel是的。虽然只有在通过
Console.ReadKey()
提示用户时才应该使用SecureString,但字符串重载更适合大多数人的需要