如何将PEM私钥转换为Windows可用于.NET的格式

5

我得到了一个私钥,发现它的格式是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参数,但它告诉我No certificate matches private key。如果我不使用-in参数进行尝试,那么就什么都不会发生(我的意思是没有任何响应,只有一个空白的行,直到我按下ctrl-c)。

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

这个问题的第一部分是从这里的答案得到的。

找到了一个答案,让我有些希望,它说要运行此命令(-nocerts):

openssl pkcs12 -export -nocerts -inkey your.private.key.pem -out your.private.key.p12

但是当我尝试将该文件导入Windows密钥库时,它会显示指定的文件为空

我还成功生成了一个证书签名请求从这里的说明中,它生成了一个证书文件,但是命令仍然没有接受它,显示没有证书与私钥匹配

另一个答案建议生成公钥,我也这样做了,但当我将其用作-in参数时,它仍然显示没有证书与私钥匹配,我不明白,因为这个公钥是使用以下命令从私钥生成的:openssl rsa -in privkey.pem -pubout > key.pub

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

1个回答

3

看起来:

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

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

openssl pkcs8 -nocrypt -in dealerPrivate.key -inform der -outform pem -out private.pem

将证书从x509/DER格式转换为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>

响应:

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>

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接