如何将Java中的私钥文件转换为.net x509Certificate2

如何将Java中的私钥文件转换为.net x509Certificate2,java,.net,wcf,wcf-security,public-key-encryption,Java,.net,Wcf,Wcf Security,Public Key Encryption,我正在编写一个.NET客户端应用程序,它使用Java web服务并需要对发送的请求进行签名(与相关) 我收到了一个private.key文件(和一个.X509证书)和一个Java源代码示例。证书看起来像服务的公钥,而private.key是我用来签署请求的 在Java源代码中,我可以看到他们将文件转换为字节数组,并将其传递到PKCS8EncodedKeySpec类的构造函数中 这个文件的一部分是私钥散列(尽管我可能错了) 有没有办法在.Net中使用它,或者将它转换成.Net可以使用的东西 提到转

我正在编写一个.NET客户端应用程序,它使用Java web服务并需要对发送的请求进行签名(与相关)

我收到了一个private.key文件(和一个.X509证书)和一个Java源代码示例。证书看起来像服务的公钥,而private.key是我用来签署请求的

在Java源代码中,我可以看到他们将文件转换为字节数组,并将其传递到PKCS8EncodedKeySpec类的构造函数中

这个文件的一部分是私钥散列(尽管我可能错了)

有没有办法在.Net中使用它,或者将它转换成.Net可以使用的东西

提到转换公钥/私钥,但我没有这两种密钥,或者它是否有效。有人有更多的信息要处理吗?比如这个文件到底是什么

如果我将其作为字节数组读入并将其转换为字符串,我会得到一个十六进制负载(例如AA-BB-06等),但无论使用何种编码,我都无法将其转换为任何有用的内容

表明它符合PKCS#8标准

我尝试了(由@gtrig建议)命令:

openssl rsa -in pkcs8privatekey.der -inform der -out privatekey.pem
但这给了我以下信息:

unable to load Private Key
32096:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag:tasn_dec.c:1306:
32096:error:0D06C03A:asn1 encoding routines:ASN1_D2I_EX_PRIMITIVE:nested asn1 error:tasn_dec.c:830:
32096:error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error:tasn_dec.c:749:Field=n, Type=RSA
32096:error:0D09A00D:asn1 encoding routines:d2i_PrivateKey:ASN1 lib:d2i_pr.c:99:
NET和PEM-inform参数也有类似的错误

以及:

给我一个错误:

"Error: offset too large"
我刚刚发现如果我把它转换成一个64进制的字符串

  Dim ba As Byte() = IO.File.ReadAllBytes("C:\private.key")
  Dim toString1 As String = System.Convert.ToBase64String(ba)
这给了我一个以
MIICdgIBADANB
开头的字符串,长度为924个字符

尝试下面的命令会给我

openssl rsa -in private.key -text -noout

unable to load Private Key
17978:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:647:Expec                            ting: ANY PRIVATE KEY
还有什么建议吗?

这可能不是私钥的“散列”。它很可能是PKCS#8格式的私钥

您可以使用命令行工具创建PKCS#12密钥库,然后可以使用该密钥库构造对象

首先,您可能需要将私钥从DER转换为PEM格式,这也可以在openssl中完成:

openssl rsa -in pkcs8privatekey.der -inform der -out privatekey.pem
然后使用以下内容创建PKCS#12密钥库:

openssl pkcs12 -export -name myalias -in mycert.crt -inkey privatekey.pem -out keystore.p12
最后,您应该能够将其导入X509Certificate2对象:

X509Certificate2 cert = X509Certificate2("C:\Path\keystore.p12", "password");

您可以使用。您需要知道他们给您的证书类型,通常是PEM的JKS密钥。

以下命令将其转换为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中使用。

我必须使用二进制文件的from来执行此操作吗?我将其复制到我们的一个linux框中,并运行了您建议的命令,但是我得到了以下错误:openssl rsa-in private.key-notify der-out privatekey.pem无法加载私钥26201:错误:0D0680A8:asn1编码例程:asn1_CHECK_TLEN:错误标记:tasn_dec.c:1306:26201:错误:0D06C03A:asn1编码例程:asn1_D2I_EX_原语:嵌套asn1错误:tasn_dec:83001:26201:错误:0D03A:asn1编码例程:ASN1_TEMPLATE_NOEXP_D2I:nested ASN1 error:tasn_dec.c:749:Field=n,Type=RSA 26201:error:0D09A00D:ASN1编码例程:D2I_PrivateKey:ASN1 lib:D2I_pr.c:99:我尝试了其他-imform args(NET和PEM),但这也不起作用。您的私钥是二进制文件还是文本?我还有一个想法。我能够在旧版本的openssl上复制您的错误。您使用的是什么版本的openssl?但是,我仍然能够使用较旧版本的openssl解决这个问题。尝试以下命令:
opensslpkcs8-inform der-nocrypt-in private.key-out privatekey.pem
。如果可以,那么在答案中尝试opensslpkcs12命令。不幸的是,该工具不允许我导入证书。我也没有提供链或密钥库文件。另外,我不知道类型,我只知道他们在提供的Java源代码中使用PKCS8EncodedKeySpec的代码。也许可以尝试通过Equalnt c#类理解此证书,请参见此处的第二个答案