Как получить / создать TlsCredentialedSigner с помощью BouncyCastle? - PullRequest
0 голосов
/ 08 апреля 2019

Я пытаюсь реализовать рукопожатие 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? Некоторые проблемы с этим:

  1. Я бы использовал BC напрямую ... разве я не смогу использовать только классы JCA и получить доступ к провайдеру BC, где это необходимо?
  2. BcDefaultTlsCredentialedSigner требуется закрытый ключ в форме AsymmetricKeyParameter, но способ, которым я сгенерировал ключи, - это только экземпляр PrivateKey. Может ли одно быть получено из другого? Какая связь между AsymmetricKeyParameter и PrivateKey?
  3. BcDefaultTlsCredentialedSigner требуется экземпляр BcTlsCrypto. Опять же, я не уверен, должен ли я создавать экземпляр одного из них напрямую или я должен иметь возможность получать данные через JCA, используя BC в качестве поставщика каким-либо образом?

И, в более широком смысле:

  1. Это идиоматический способ создания сертификата с использованием провайдера? Я видел очень много разных способов генерирования сертификатов, некоторые с использованием BC напрямую, некоторые с использованием JCA с BC в качестве провайдера, а некоторые, кажется, делают смесь из двух. Как правильно?
...