DER编码BCECPublicKey
问题描述:
我试图编码公钥,并将其与外部服务一起使用。DER编码BCECPublicKey
当我得到编码的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
任何帮助将不胜感激!
答
这是我想出了解决方案:
KeyFactory keyFactory = KeyFactory.getInstance("EC");
X509EncodedKeySpec keySpec = keyFactory.getKeySpec(publicKey, X509EncodedKeySpec.class);
return keySpec.getEncoded();
找出哪些格式和值的外部服务预计,使用比试验和错误以外的东西。 –
我不相信你可以使用'openssl x509'来打印一个键。 'openssl x509'用于证书,而不是密钥。也许你应该使用Peter Gutmann的'dumpasn1'来打印你所拥有的东西并将其添加到问题中。但我的感觉是,这是堆栈溢出的主题。关于如何使用'keytool'或'openssl'等工具的问题,不应该使用Stack Overflow。它不能帮助未知的[web?]服务拒绝参数。 – jww
*“具有未命名曲线的ECDSA证书不受支持”*可能表示您使用了域参数而不是像secp256r1这样的命名曲线。也许你应该指示Bouncy Castle使用命名曲线而不是域参数。下面是OpenSSL编程环境中的问题,但我不知道BC的等价物:[椭圆曲线密码学|命名曲线](https://wiki.openssl.org/index.php/Elliptic_Curve_Cryptography#Named_Curves)。 – jww