【问题标题】:How can I convert a private key file from Java into .net x509Certificate2如何将私钥文件从 Java 转换为 .net x509Certificate2
【发布时间】:2013-10-26 05:52:06
【问题描述】:

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

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

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

googling suggests这个文件有点是私钥散列(虽然我可能错了)。

有没有办法在 .Net 中使用它或将其转换为 .Net 可以使用的东西?

This link 提到转换公钥/私钥,但我没有两者,或者它是否可以工作。有没有人有更多的信息可以处理?比如这个文件到底是什么?

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

This documentation 表明它符合 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 args 也出现类似错误。

和:

openssl asn1parse -in private.key

给我错误:

"Error: offset too large"

我刚刚发现,如果我将它转换为 base 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

还有什么建议吗?

【问题讨论】:

    标签: java .net wcf wcf-security public-key-encryption


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 不幸的是,该工具不允许我导入证书。我也没有获得链或密钥库文件。另外,我不知道类型,我只知道他们在他们提供的 Java 源代码中使用 PKCS8EncodedKeySpec 的代码。
      • 也许可以尝试通过等效的 c# 类来理解此证书,请参阅此处的第二个答案 stackoverflow.com/questions/2274836/…
      【解决方案3】:

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

      您可以使用openssl 命令行工具创建一个PKCS#12 密钥库,然后该密钥库应该能够用于构造X509Certificate2 对象。

      首先,您可能需要将您的私钥从 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");
      

      【讨论】:

      • 我必须使用来自openssl.org/related/binaries.html 的二进制文件来执行此操作吗?
      • 我将它复制到我们的一个 linux 机器并运行您建议的命令,但我收到以下错误:openssl rsa -in private.key -inform der -out privatekey.pem 无法加载 Private Key 26201:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag:tasn_dec.c:1306: 26201:error:0D06C03A:asn1 encoding routines:ASN1_D2I_EX_PRIMITIVE:nested asn1 error:tasn_dec.c:830: 26201:error:0D08303 asn1 编码例程:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 错误: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 解决这个问题。试试这个命令:openssl pkcs8 -inform der -nocrypt -in private.key -out privatekey.pem。如果可行,请尝试答案中的 openssl pkcs12 命令。
      猜你喜欢
      • 1970-01-01
      • 2019-11-15
      • 2013-07-17
      • 1970-01-01
      • 2013-08-30
      • 2021-07-14
      • 2011-05-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多