Creación de certificados para la comunicación SSL.

Estoy trabajando en una aplicación distribuida con una serie de procesos esclavos identificados de forma única que se comunicarán con una aplicación maestra a través de sockets habilitados para SSL. La aplicación está escrita en java.

Necesito ayuda para entender SSLSockets, o más bien, los certificados que usan.

Lo que estoy buscando es alguien que pueda decirme si he entendido correctamente el funcionamiento básico de las cadenas de certificados, pero tampoco diría que no a un ejemplo de código.

Me gustaría una configuración en la que el propio servidor tenga un certificado firmado por CA, y cada esclavo obtendrá su propio certificado creado por la aplicación maestra.

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

Primera pregunta: ¿Es este tipo de cadena de certificados la forma correcta de abordar el problema? Estoy pensando que esta es la forma más sencilla de lograr que el maestro y los esclavos tengan una identidad única sin tener que firmar con CA cada certificado.

Segunda pregunta: ¿Cómo puedo programar un certificado SSL en Java? Estoy intentando crear el último certificado de la cadena aquí, asumiendo que ya tengo el "Certificado del servidor principal" por ahora. He llegado al punto de generar una clave para el certificado (donde tipo de 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);

¿No asumo que establecer el serverCert como emisor es suficiente para firmar el certificado? Por lo que he entendido, necesito firmar el nuevo certificado con el siguiente certificado de la cadena de alguna manera, pero ¿cómo hago eso? ¿Firmo el certificado con la clave privada de 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);

¿Hay otros pasos que me perdí?

Respuestas a la pregunta(1)

Su respuesta a la pregunta