【问题标题】:DER Encode BCECPublicKeyDER 编码 BCECPublicKey
【发布时间】:2017-07-12 23:00:55
【问题描述】:

我正在尝试对公钥进行 Der 编码,并将其与外部服务一起使用。

当我获得编码的org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey 并将其发送到外部服务时,它会以“不支持具有未命名曲线的 ECDSA 证书”作为响应。 (我正在调用publicKey.getEncoding() 来获取编码的密钥)

publicKey.getFormat();
// "X.509"
publicKey.getAlgorithm();
// "ECDH"
publicKey.getQ().curve.getClass().name;
// "org.bouncycastle.math.ec.custom.sec.SecP256R1Curve"

我不确定如何从这里进行调试。我尝试保存原始编码字节 到一个文件并使用 openssl 检查证书但没有成功:

> openssl x509 -in test.der -inform der -text -noout
unable to load certificate
62375:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag:/BuildRoot/Library/Caches/com.apple.xbs/Sources/OpenSSL098/OpenSSL098-64.30.2/src/crypto/asn1/tasn_dec.c:1344:
62375:error:0D06C03A:asn1 encoding routines:ASN1_D2I_EX_PRIMITIVE:nested asn1 error:/BuildRoot/Library/Caches/com.apple.xbs/Sources/OpenSSL098/OpenSSL098-64.30.2/src/crypto/asn1/tasn_dec.c:848:
62375:error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error:/BuildRoot/Library/Caches/com.apple.xbs/Sources/OpenSSL098/OpenSSL098-64.30.2/src/crypto/asn1/tasn_dec.c:768:Field=serialNumber, Type=X509_CINF
62375:error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error:/BuildRoot/Library/Caches/com.apple.xbs/Sources/OpenSSL098/OpenSSL098-64.30.2/src/crypto/asn1/tasn_dec.c:768:Field=cert_info, Type=X509

任何帮助将不胜感激!

【问题讨论】:

  • 找出外部服务期望的格式和值,使用试错法以外的方法。
  • 我不相信您可以使用openssl x509 来打印密钥。 openssl x509 用于证书,而不是密钥。也许您应该使用 Peter Gutmann 的 dumpasn1 打印您拥有的内容并将其添加到问题中。但我的感觉是,这与 Stack Overflow 无关。 Stack Overflow 不应用于有关如何使用 keytoolopenssl 等工具的问题。对于拒绝参数的未知 [web?] 服务也无济于事。
  • “不支持带有未命名曲线的 ECDSA 证书” 可能表明您使用了域参数而不是像 secp256r1 这样的命名曲线。也许您应该指示 Bouncy Castle 使用命名曲线而不是域参数。这是 OpenSSL 编程上下文中的问题,但我不知道 BC 等效项:Elliptic Curve Cryptography | Named Curves.
  • (@jww) openssl x509 需要证书,但 openssl pkey -pubin(或在 1.0.0 之前 openssl ec -pubin)(此处使用 -noout -text)采用 JCE 所称的 X.509 格式,即主题公钥信息。 markw:你是如何生成这个密钥的,或者如果你从某个东西中读取它,那是什么格式以及 it 是如何生成的?另外,您(或您是否想要)只发送 pubkey 或证书? cert 可以是特定的 ECDSA,但密钥无法将 ECDSA 与其他 EC 区分开来。

标签: java bouncycastle keytool pki der


【解决方案1】:

这是我想出的解决方案:

KeyFactory keyFactory = KeyFactory.getInstance("EC");
X509EncodedKeySpec keySpec = keyFactory.getKeySpec(publicKey, X509EncodedKeySpec.class);
return keySpec.getEncoded();

【讨论】:

    猜你喜欢
    • 2011-08-24
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    相关资源
    最近更新 更多