Не удается получить параметры EC: namedcurve в subjectPublicKeyInfo сертификата - PullRequest
1 голос
/ 08 апреля 2019

Я изо всех сил пытаюсь пробиться через реализацию рукопожатия DTLS 1.2, используя ECDSA, и у меня возникают проблемы с сертификатом клиента. Когда я генерирую его, кажется, что subjectPublicKeyInfo неверен: в wireshark вместо того, чтобы видеть ECParameters: namedCurve внутри алгоритма, я, кажется, получаю непарсированный OID.

Что я ожидаю: What I expect Что я вижу: What I see

Я создаю сертификат примерно так (я полагаю, что он полон ошибок, я хотел бы получить любое руководство там!):

Генерация пары ключей:

private fun generateEcKeyPair(): AsymmetricCipherKeyPair {
    val generator = ECKeyPairGenerator()

    val curveSpec = ECNamedCurveTable.getParameterSpec("secp256r1")
    generator.init(
    ECKeyGenerationParameters(
        ECDomainParameters(
            curveSpec.curve,
            curveSpec.g,
            curveSpec.n,
            curveSpec.h,
            curveSpec.seed
            ),
            SecureRandom()
        )
    )
    return generator.generateKeyPair()
}

Генерация сертификата (в котором используется пара ключей, сгенерированная описанным выше способом):

private fun generateX509Certificate(
    subject: X500Name,
    keyPair: AsymmetricCipherKeyPair
): org.bouncycastle.asn1.x509.Certificate {
    val now = System.currentTimeMillis()
    val notBefore = Date(now - Duration.ofDays(1).toMillis())
    val notAfter = Date(now + Duration.ofDays(7).toMillis())

    val certBuilder = X509v3CertificateBuilder(
        subject,
        BigInteger.valueOf(now),
        notBefore,
        notAfter,
        subject,
        SubjectPublicKeyInfoFactory.createSubjectPublicKeyInfo(keyPair.public)
    )
    val signatureAlgoIdentifier =
        DefaultSignatureAlgorithmIdentifierFinder().find(signatureAlgo)
    val digestAlgoIdentifier =
        DefaultDigestAlgorithmIdentifierFinder().find(signatureAlgoIdentifier)
    val signer =
        BcECContentSignerBuilder(signatureAlgoIdentifier, digestAlgoIdentifier).build(keyPair.private)

    return certBuilder.build(signer).toASN1Structure()
}

Что я здесь не так делаю? Я примерно на правильном пути?

1 Ответ

1 голос
/ 09 апреля 2019

Я думаю, что мне удалось наткнуться на исправление для этого. Я изменил мою generateEcKeyPair реализацию на следующую (после добавления BouncyCastleProvider в качестве провайдера):

fun generateEcKeyPair(): KeyPair {
    val keyGen = KeyPairGenerator.getInstance("EC", "BC")
    val ecCurveSpec = ECNamedCurveTable.getParameterSpec("secp256r1")

    keyGen.initialize(ecCurveSpec)

    return keyGen.generateKeyPair()
}

И, похоже, теперь я получаю правильное имя кривой в сертификате.

Может быть, раньше я неправильно передавал параметры? Или создание вручную не сохранило названную кривую правильно?

...