Criando Certificados para Comunicação SSL

Eu estou trabalhando em um aplicativo distribuído com um número de processos escravo identificados exclusivamente que irão se comunicar com um aplicativo mestre através de soquetes com SSL ativado. O aplicativo é escrito em java.

Eu preciso de alguma ajuda para entender SSLSockets, ou melhor, os certificados que eles usam.

O que eu estou procurando é alguém que pode me dizer se eu entendi o funcionamento básico de cadeias de certificados corretamente, mas eu não diria não a um exemplo de código também.

Eu gostaria de uma configuração em que o próprio servidor tenha um certificado assinado pela CA e cada escravo obterá seu próprio certificado criado pelo aplicativo mestre.

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

Primeira pergunta: Esse tipo de cadeia de certificados é a maneira correta de resolver o problema? Eu estou pensando que esta é a maneira mais simples de alcançar o mestre e os escravos todos têm uma identidade única sem ter que assinar todos os certificados da CA.

Segunda pergunta: Como faço programaticamente para criar um certificado SSL em java? Eu estou tentando criar o último certificado na cadeia aqui, assumindo que eu já tenho o "certificado de servidor principal" por agora. Cheguei até a gerar uma chave para o certificado (onde o tipo é 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);

Não suponho que definir o serverCert como o emissor seja suficiente para assinar o certificado? Tanto quanto eu entendi eu preciso assinar o novo certificado com o próximo certificado na cadeia de alguma forma, mas como faço isso? Eu assino o certificado com a chave privada do serverCert como:

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

Existem outras etapas que eu perdi?

questionAnswers(1)

yourAnswerToTheQuestion