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 

任何帮助将不胜感激!

+1

找出哪些格式和值的外部服务预计,使用比试验和错误以外的东西。 –

+0

我不相信你可以使用'openssl x509'来打印一个键。 'openssl x509'用于证书,而不是密钥。也许你应该使用Peter Gutmann的'dumpasn1'来打印你所拥有的东西并将其添加到问题中。但我的感觉是,这是堆栈溢出的主题。关于如何使用'keytool'或'openssl'等工具的问题,不应该使用Stack Overflow。它不能帮助未知的[web?]服务拒绝参数。 – jww

+0

*“具有未命名曲线的ECDSA证书不受支持”*可能表示您使用了域参数而不是像secp256r1这样的命名曲线。也许你应该指示Bouncy Castle使用命名曲线而不是域参数。下面是OpenSSL编程环境中的问题,但我不知道BC的等价物:[椭圆曲线密码学|命名曲线](https://wiki.openssl.org/index.php/Elliptic_Curve_Cryptography#Named_Curves)。 – jww

这是我想出了解决方案:

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