Zertifikate für die SSL-Kommunikation erstellen

Ich arbeite an einer verteilten Anwendung mit einer Reihe von eindeutig identifizierten Slave-Prozessen, die über SSL-fähige Sockets mit einer Master-Anwendung kommunizieren. Die Anwendung ist in Java geschrieben.

Ich benötige Unterstützung beim Verständnis von SSLSockets bzw. der von ihnen verwendeten Zertifikate.

Was ich suche, ist jemand, der mir sagen kann, ob ich die grundlegenden Funktionen von Zertifikatketten richtig verstanden habe, aber ich würde auch zu einem Codebeispiel nicht nein sagen.

Ich hätte gerne ein Setup, bei dem der Server selbst ein CA-signiertes Zertifikat hat und jeder Slave sein eigenes Zertifikat erhält, das von der Master-Anwendung erstellt wird.

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

Erste Frage: Ist diese Art der Zertifikatskette der richtige Weg, um das Problem anzugehen? Ich denke, dies ist der einfachste Weg, den Master zu erreichen, und alle Slaves haben eine eindeutige Identität, ohne dass CA jedes Zertifikat signieren muss.

Zweite Frage: Wie erstelle ich programmgesteuert ein SSL-Zertifikat in Java? Ich versuche, das letzte Zertifikat in der Kette hier zu erstellen, vorausgesetzt, ich habe bereits das "Hauptserver-Zertifikat". Ich habe es bis jetzt geschafft, einen Schlüssel für das Zertifikat zu generieren (wobei der Typ RSA ist):

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

Ich gehe nicht davon aus, dass das Festlegen des serverCert als Aussteller ausreicht, um das Zertifikat zu signieren. Soweit ich verstanden habe, muss ich das neue Zertifikat mit dem nächsten Zertifikat in der Kette irgendwie unterschreiben, aber wie mache ich das? Unterschreibe ich das Zertifikat mit dem privaten Schlüssel von serverCert wie folgt:

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

Gibt es noch andere Schritte, die ich verpasst habe?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage