Я пытаюсь реализовать рукопожатие DTLS v1.2 с помощью BouncyCastle. Для этого мне нужно расширить DefaultTlsServer
и реализовать getECDSASignerCredentials
(так как я использую ECDSA), но я не уверен, как получить TlsCredentialedSigner
, который мне нужно вернуть. Я создаю сертификат, подписанный ECDSA, примерно так (после установки BouncyCastlePRovider):
private fun generateCertificate(
subject: X500Name,
keyPair: KeyPair
): Certificate {
val now = System.currentTimeMillis()
val startDate = Date(now - Duration.ofDays(1).toMillis())
val expiryDate = Date(now + Duration.ofDays(7).toMillis())
val serialNumber = BigInteger.valueOf(now)
val certBuilder = JcaX509v3CertificateBuilder(subject, serialNumber, startDate, expiryDate, subject, keyPair.public)
val signer = JcaContentSignerBuilder("SHA256withECDSA").build(keyPair.private)
return certBuilder.build(signer).toASN1Structure()
}
Должен ли я просто создать новый BcDefaultTlsCredentialedSigner
? Некоторые проблемы с этим:
- Я бы использовал BC напрямую ... разве я не смогу использовать только классы JCA и получить доступ к провайдеру BC, где это необходимо?
BcDefaultTlsCredentialedSigner
требуется закрытый ключ в форме AsymmetricKeyParameter
, но способ, которым я сгенерировал ключи, - это только экземпляр PrivateKey
. Может ли одно быть получено из другого? Какая связь между AsymmetricKeyParameter
и PrivateKey
?
BcDefaultTlsCredentialedSigner
требуется экземпляр BcTlsCrypto
. Опять же, я не уверен, должен ли я создавать экземпляр одного из них напрямую или я должен иметь возможность получать данные через JCA, используя BC в качестве поставщика каким-либо образом?
И, в более широком смысле:
- Это идиоматический способ создания сертификата с использованием провайдера? Я видел очень много разных способов генерирования сертификатов, некоторые с использованием BC напрямую, некоторые с использованием JCA с BC в качестве провайдера, а некоторые, кажется, делают смесь из двух. Как правильно?