Tôi đang làm việc trên một ứng dụng được phân phối với một số quy trình nô lệ được xác định duy nhất sẽ liên lạc với ứng dụng chính qua ổ cắm được bật SSL. Ứng dụng này được viết bằng java.Tạo chứng chỉ cho giao tiếp SSL
Tôi cần một số trợ giúp để hiểu SSLSockets hoặc đúng hơn là chứng chỉ mà họ sử dụng.
Điều tôi đang tìm kiếm là người có thể cho tôi biết nếu tôi đã hiểu hoạt động cơ bản của chuỗi chứng chỉ chính xác, nhưng tôi cũng sẽ không nói không với mẫu mã.
Tôi muốn thiết lập nơi bản thân máy chủ có chứng chỉ đã ký CA và mọi nô lệ sẽ nhận được chứng chỉ của riêng họ được tạo bởi ứng dụng chính.
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
Câu hỏi đầu tiên: Loại chuỗi chứng chỉ này có đúng cách để giải quyết vấn đề không? Tôi nghĩ đây là cách đơn giản nhất để đạt được bậc thầy và nô lệ tất cả đều có một bản sắc duy nhất mà không cần phải ký CA mọi chứng chỉ.
Câu hỏi thứ hai: Làm cách nào để lập trình tạo chứng chỉ SSL trong java? Tôi đang cố gắng tạo chứng chỉ cuối cùng trong chuỗi ở đây, giả sử tôi đã có "cert máy chủ chính" cho bây giờ. tôi đã nhận được cho đến nay là tạo ra một chìa khóa cho chứng chỉ (Nơi loại là 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);
Tôi không cho rằng việc thiết lập serverCert như tổ chức phát hành là đủ để ký vào giấy chứng nhận? Theo như tôi đã hiểu tôi cần phải ký giấy chứng nhận mới với giấy chứng nhận tiếp theo trong chuỗi bằng cách nào đó, nhưng làm thế nào để tôi làm điều đó? Tôi có ký giấy chứng nhận với khóa riêng của serverCert như:
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);
Tôi có bỏ sót các bước nào khác không?
createAuthorityKeyIdentifier (subjectKey)) createSubjectKeyIdentifier (issuerCert)) Điều này chỉ vì sự thiếu hiểu biết của riêng tôi, nhưng đúng hay không, hoặc subjectKey và issuerCert được đảo ngược? –
Vâng, bạn nói đúng. Tôi đã thực hiện một sai lầm, subjectKey và issuerCert phải được đảo ngược. Thx, tôi cập nhật câu trả lời. – Jcs
Không sao. Không có kiểm tra tốt hơn cho tôi thực sự hiểu những gì đang xảy ra: D –