Создание сертификатов для связи SSL
Я работаю над распределенным приложением с несколькими уникально идентифицированными подчиненными процессами, которые будут взаимодействовать с главным приложением через сокеты с поддержкой SSL. Приложение написано на Java.
Мне нужна помощь в понимании SSLSockets, точнее, сертификатов, которые они используют.
То, что я ищу, - это тот, кто может сказать мне, правильно ли я понял основные принципы работы цепочек сертификатов, но я бы тоже не сказал «нет» образцу кода.
Я хотел бы настроить, где сам сервер имеет сертификат, подписанный CA, и каждый ведомый получит свой собственный сертификат, созданный главным приложением.
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
Первый вопрос: является ли этот вид цепочки сертификатов правильным способом решения проблемы? Я думаю, что это самый простой способ достижения главного и подчиненных, которые имеют уникальную идентификацию без необходимости подписывать CA каждый сертификат.
Второй вопрос: как мне программным образом создать сертификат SSL в Java? Я пытаюсь создать последний сертификат в цепочке, предполагая, что у меня уже есть «Сертификат главного сервера». Я дошел до генерации ключа для сертификата (где тип 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);
Я не предполагаю, что установки serverCert в качестве эмитента достаточно, чтобы подписать сертификат? Насколько я понял, мне нужно как-то подписать новый сертификат следующим сертификатом в цепочке, но как мне это сделать? Я подписываю сертификат с закрытым ключом serverCert как:
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);
Есть ли другие шаги, которые я пропустил?