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?