Создание сертификатов для связи SSL

Я работаю над распределенным приложением с несколькими уникально идентифицированными подчиненными процессами, которые будут взаимодействовать с главным приложением через сокеты с поддержкой SSL. Приложение написано на Java.

Мне нужна помощь в понимании SSLSockets, точнее, сертификатов, которые они используют.

То, что я ищу, - это тот, кто может сказать мне, правильно ли я понял основные принципы работы цепочек сертификатов, но я бы тоже не сказал «нет» образцу кода.

Я хотел бы настроить, где сам сервер имеет сертификат, подписанный CA, и каждый ведомый получит свой собственный сертификат, созданный главным приложением.

CA->Main server cert->Master SSL cert
CA->Main server cert->Slave SSL cert 1
CA->Main server cert->Slave SSL cert 2
CA->Main server cert->Slave SSL cert 3

Первый вопрос: является ли этот вид цепочки сертификатов правильным способом решения проблемы? Я думаю, что это самый простой способ достижения главного и подчиненных, которые имеют уникальную идентификацию без необходимости подписывать CA каждый сертификат.

Второй вопрос: как мне программным образом создать сертификат SSL в Java? Я пытаюсь создать последний сертификат в цепочке, предполагая, что у меня уже есть «Сертификат главного сервера». Я дошел до генерации ключа для сертификата (где тип RSA):

public KeyPair generateKeypair(String type, int bytes) 
throws NoSuchAlgorithmException{
    KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(type);
    keyPairGenerator.initialize(bytes);
    return keyPairGenerator.generateKeyPair();
}

X509Principal issuer = PrincipalUtil.getSubjectX509Principal(serverCert);
SubjectPublicKeyInfo key 
    = SubjectPublicKeyInfo.getInstance(kpair.getPublic().getEncoded());
X509v3CertificateBuilder certGen 
    = new X509v3CertificateBuilder(
        issuer, 
        BigInteger.valueOf(new SecureRandom().nextInt()), 
        before, 
        after, 
        subject, 
        key
    );
AlgorithmIdentifier sigAlgId 
    = new DefaultSignatureAlgorithmIdentifierFinder().find("SHA1withRSA");
AlgorithmIdentifier digAlgId 
    = new DefaultDigestAlgorithmIdentifierFinder().find(sigAlgId);

Я не предполагаю, что установки serverCert в качестве эмитента достаточно, чтобы подписать сертификат? Насколько я понял, мне нужно как-то подписать новый сертификат следующим сертификатом в цепочке, но как мне это сделать? Я подписываю сертификат с закрытым ключом serverCert как:

AsymmetricKeyParameter akp 
    = PrivateKeyFactory.createKey(serverPrivateKey.getEncoded());
AlgorithmIdentifier sigAlgId 
    = new DefaultSignatureAlgorithmIdentifierFinder().find("SHA1withRSA");
AlgorithmIdentifier digAlgId 
    = new DefaultDigestAlgorithmIdentifierFinder().find(sigAlgId);
ContentSigner sigGen 
    = new BcRSAContentSignerBuilder(sigAlgId, digAlgId).build(akp);

Есть ли другие шаги, которые я пропустил?

Ответы на вопрос(1)

Ваш ответ на вопрос