Tworzenie certyfikatów do komunikacji SSL

Pracuję nad aplikacją rozproszoną z wieloma unikalnie zidentyfikowanymi procesami podrzędnymi, które będą komunikować się z aplikacją główną za pomocą gniazd obsługujących SSL. Aplikacja jest napisana w języku Java.

Potrzebuję pomocy w zrozumieniu gniazd SSL, a raczej certyfikatów, których używają.

To, czego szukam, to ktoś, kto może mi powiedzieć, czy poprawnie zrozumiałem podstawowe zasady działania łańcuchów certyfikatów, ale nie powiedziałbym też o próbce kodu.

Chciałbym konfigurację, w której serwer ma certyfikat podpisany przez CA, a każdy slave otrzyma własny certyfikat utworzony przez aplikację master.

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

Pierwsze pytanie: Czy ten rodzaj łańcucha certyfikatów jest właściwym sposobem rozwiązania problemu? Myślę, że jest to najprostszy sposób na osiągnięcie mistrzostwa, a niewolnicy mają unikalną tożsamość bez konieczności podpisywania każdego certyfikatu przez CA.

Drugie pytanie: jak programowo przejść do tworzenia certyfikatu SSL w Javie? Próbuję tutaj utworzyć ostatni certyfikat w łańcuchu, zakładając, że na razie mam już „Główny certyfikat serwera”. Do tej pory udało mi się wygenerować klucz do certyfikatu (gdzie typ to 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);

Nie zakładam, że ustawienie serwera serverCert jako wystawcy wystarczy do podpisania certyfikatu? O ile zrozumiałem, muszę jakoś podpisać nowy certyfikat kolejnym certyfikatem w łańcuchu, ale jak to zrobić? Czy podpisuję certyfikat kluczem prywatnym serverCert, takim jak:

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);

Czy są jakieś inne kroki, które przegapiłem?

questionAnswers(1)

yourAnswerToTheQuestion