如何将pem私钥转换为可在.NET中使用的windows格式

如何将pem私钥转换为可在.NET中使用的windows格式,.net,openssl,x509certificate,.net,Openssl,X509certificate,我得到了一个私钥,它是pkcs8格式的,我使用以下命令将其转换为pem文件: openssl pkcs8 -inform der -nocrypt -in private.key -out pkey.pem 我现在需要将其转换为pkcs12,以便在.NET中使用它创建X509证书(我还想将其导入windows证书管理器) 我试过这个命令: openssl pkcs12 -export -name myalias -in mycert.crt -inkey pkey.pem -out keyst

我得到了一个私钥,它是pkcs8格式的,我使用以下命令将其转换为pem文件:

openssl pkcs8 -inform der -nocrypt -in private.key -out pkey.pem
我现在需要将其转换为pkcs12,以便在.NET中使用它创建X509证书(我还想将其导入windows证书管理器)

我试过这个命令:

openssl pkcs12 -export -name myalias -in mycert.crt -inkey pkey.pem -out keystore.p12
但是,我没有公钥,我尝试使用pkey.pem文件作为-in参数,但它告诉我没有与私钥匹配的证书。如果我尝试在arg中不使用
-in,则什么也不会发生(我的意思是什么也没有,在我按下
ctrl-c
之前,会有一个空行)

如何从私钥生成公钥,或在没有公钥的情况下转换为pkcs12

问题的第一部分是

这给了我一些希望,它说运行这个命令(-nocerts):

但是,当我尝试将文件导入windows密钥存储时,它会在导入时显示指定的文件为空

我还成功地生成了一个证书签名请求,该请求生成了一个证书文件,但命令仍然不接受这样的说法:没有证书匹配私钥

建议生成公钥,我是这样做的,但当我在
arg中将其用作
-in时,它仍然会说
没有与私钥匹配的证书
,我不理解这一点,因为此公钥是使用以下命令从私钥生成的:
openssl rsa-in privkey.pem-pubout>key.pub

编辑: 我在下面发布了一个答案,但正如前面提到的,我无法验证这些信息,也无法判断它是否有效。如果有人有任何进一步的信息,请告诉我。

看起来:

以下命令将其转换为可在windows中使用的格式:

将pkcs8/DER中的私钥转换为PEM文件格式

openssl pkcs8 -nocrypt -in dealerPrivate.key -inform der -outform pem -out private.pem
openssl x509 -inform der -in dealerCertificate.x509 -out public.pem
将证书从x509/DER转换为PEM文件格式

openssl pkcs8 -nocrypt -in dealerPrivate.key -inform der -outform pem -out private.pem
openssl x509 -inform der -in dealerCertificate.x509 -out public.pem
将这两个文件合并到一个pkcs12文件中–系统将提示您输入密码以保护p12

openssl pkcs12 -export -inkey private.pem -in public.pem -out mycert.p12
这给了我一个pkcs12证书(我想),我已经将其添加到windows密钥存储中,然后可以从.NET访问并将其附加到我的WCF请求中

不幸的是,我无法验证这是否作为服务响应使用与我的请求相同的数据,这完全令人困惑:

请求:

POST http://[HOST].com/services/fsa/1.0 HTTP/1.1
Content-Type: text/xml; charset=utf-8
VsDebuggerCausalityData: uIDPo0ii5Jr5wONMi6i/jkMQdFkAAAAArRV2zOsUrEioQMkqYDWulG6ktjqzCoRLtP+/9VQSARUACQAA
SOAPAction: ""
Host: [HOST]
Content-Length: 299
Expect: 100-continue
Connection: Keep-Alive

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><list xmlns="http://[HOST].com/services/fsa/1.0"><String_1 xmlns="">[MY_STRING]</String_1></list></s:Body></s:Envelope>
POST http://[HOST].com/services/fsa/1.0 http/1.1
内容类型:text/xml;字符集=utf-8
VsDebuggerCausalityData:uIDPo0ii5Jr5wONMi6i/JKMQDFKAAAARRV2ZOSREIOQMKQYDWULG6KTJQZCORLTP+/9VQSARUACQAA
SOAPAction:“
主持人:[主持人]
内容长度:299
预期:100人继续
连接:保持活力
[我的字符串]
答复:

HTTP/1.1 200 OK
Date: Thu, 31 Oct 2013 12:19:38 GMT
Server: Apache/2.2.17 (Unix) mod_ssl/2.2.17 OpenSSL/1.0.0a mod_jk/1.2.31
X-Powered-By: Servlet 2.5; JBoss-5.0/JBossWeb-2.1
VsDebuggerCausalityData: uIDPo0ii5Jr5wONMi6i/jkMQdFkAAAAArRV2zOsUrEioQMkqYDWulG6ktjqzCoRLtP+/9VQSARUACQAA
SOAPAction: ""
host: [HOST]
Expect: 100-continue
connection: Keep-Alive, Keep-Alive
Content-Length: 299
Keep-Alive: timeout=2, max=100
Content-Type: text/xml;charset=utf-8

<s:Envelope xmlns:s='http://schemas.xmlsoap.org/soap/envelope/'><s:Body xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><list xmlns='http://[HOST].com/services/fsa/1.0'><String_1 xmlns=''>[MY_STRING]</String_1></list></s:Body></s:Envelope>
HTTP/1.1200正常
日期:2013年10月31日星期四格林尼治标准时间12:19:38
服务器:Apache/2.2.17(Unix)mod_ssl/2.2.17 OpenSSL/1.0.0a mod_jk/1.2.31
X-Powered-By:Servlet 2.5;JBoss-5.0/JBossWeb-2.1
VsDebuggerCausalityData:uIDPo0ii5Jr5wONMi6i/JKMQDFKAAAARRV2ZOSREIOQMKQYDWULG6KTJQZCORLTP+/9VQSARUACQAA
SOAPAction:“
主持人:[主持人]
预期:100人继续
连接:保持活力,保持活力
内容长度:299
保持活动状态:超时=2,最大值=100
内容类型:text/xml;字符集=utf-8
[我的字符串]

您创建的是一个由您自己的私钥签名的自签名证书。注意…为避免混淆,证书的文件扩展名不应为“.csr”。指的是签名请求。我的问题是,你的私钥和证书在你的客户端应用程序中的用途到底是什么?它是用于身份验证/授权(通过SSL),还是用于对服务器上的某些内容进行签名?或者别的什么?我是由第三方提供私钥和x509证书的,因此我假设我需要使用私钥对请求进行签名和/或加密,并使用公钥从他们的web服务读取响应。我这里有一个关于绑定的问题:。在某种程度上,不知道。显然我不得不猜测,但现在我在.Net中有了一些可用的东西,我比以前领先了一步。通常,客户端和Web服务器之间的加密通信是通过SSL/TLS完成的。URL以“https://”开头。如果这是您应该使用的机制,并且为您提供了私钥,则它们可能需要“双向”或“双向”SSL,这意味着客户端必须向服务器进行身份验证。这是通过私钥及其匹配证书完成的。如果服务器信任签署客户端证书的CA,则可以对其进行身份验证和授权。如果客户端信任签署服务器证书的CA,它将确保所有安全连接。您的证书是否与私钥匹配?也就是说,证书中的公钥是私钥对吗?当我使用openssl pkcs12命令时,它似乎不是,它不匹配(因此我假设不是,但我无法判断)。它不是https url,只是http。也许我只需要签名,而不是加密。