Я изо всех сил пытаюсь пробиться через реализацию рукопожатия DTLS 1.2, используя ECDSA, и у меня возникают проблемы с сертификатом клиента. Когда я генерирую его, кажется, что subjectPublicKeyInfo неверен: в wireshark вместо того, чтобы видеть ECParameters: namedCurve
внутри алгоритма, я, кажется, получаю непарсированный OID.
Что я ожидаю:
Что я вижу:
Я создаю сертификат примерно так (я полагаю, что он полон ошибок, я хотел бы получить любое руководство там!):
Генерация пары ключей:
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()
}
Что я здесь не так делаю? Я примерно на правильном пути?