2017-02-22 6 views
0

Я пытаюсь Der закодировать открытый ключ и использовать его с внешней службой.DER Encode 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' используется для сертификатов, а не для ключей. Возможно, вы должны использовать 'dumpasn1' Питера Гутмана для печати того, что у вас есть, и добавить его в вопрос. Но я чувствую, что это не по теме для переполнения стека. Переполнение стека не должно использоваться для вопросов о том, как использовать такие инструменты, как 'keytool' или' openssl'. И это не может помочь неизвестным службам [web?], Отклоняющим параметры. – jww

+0

* «Сертификаты ECDSA с неназванными кривыми не поддерживаются» *, вероятно, указывает, что вы использовали параметры домена вместо именованной кривой, например 'secp256r1'. Возможно, вам следует поручить Bouncy Castle использовать именованную кривую вместо параметров домена. Вот проблема в контексте программирования OpenSSL, но я не знаю эквивалент BC: [Эллиптическая кривая криптографии | Именованные кривые] (https://wiki.openssl.org/index.php/Elliptic_Curve_Cryptography#Named_Curves). – jww

ответ

0

Вот решение, которое я придумал:

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