4

我得到了一个私钥,结果证明是 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,但它告诉我No certificate matches private key。如果我尝试不使用-inarg 则什么都不会发生(我的意思是什么,在我按下之前有一个空白行ctrl-c)。

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

这个问题的第一部分来自这里的答案

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

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

但是当我尝试将文件导入 Windows 密钥库The specified file is empty时,它会在导入时显示。

我还设法从此处的说明生成证书签名请求,该请求生成了一个证书文件,但该命令仍然不接受该说法No certificate matches private key

另一个答案建议生成公钥,我这样做了,但是当我使用它作为-inarg 它仍然说No certificate matches private key,我不明白,因为这个公钥是使用这个命令从私钥生成的:openssl rsa -in privkey.pem -pubout > key.pub

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

4

1 回答 1

2

看上去:

以下命令将其转换为可在 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>
于 2013-10-31T12:24:54.833 回答