ich habe einen Java-Keystore, in dem zwei Zertifikatsketten installiert sind. Ein CSR wurde generiert und von einer Zertifizierungsstelle signiert und beide Zertifikate mit den entsprechenden Zertifizierungsstellen wurden installiert. Wenn ich jedoch eine Anfrage an die Anwendung auf dem Port sende, wird nur ein Zertifikat angezeigt, aber ich möchte, dass beide Zertifikate im Keystore angezeigt werden, damit ich mich anhand des bevorzugten Zertifikats authentifizieren kann.
ich brauche Hilfe dabei
Antwort1
Abgesehen davon: Eine CA signiert keinen CSR; sie signiert ein Zertifikat, dasteilweisebasierend auf der CSR, teilweise jedoch nicht (und beide Teile sind wichtig).
Du sagst 'ACSR wurde generiert‘. Wenn Sie tatsächlich ein CSR (für einen Schlüssel) erstellt und zwei Zertifikate (jedes möglicherweise mit Kette) für dieses CSR erhalten und beide Zertifikatsketten in dem einen Privatekey-Eintrag in Ihrem Store installiert haben, dann hat das zweite das erste ersetzt und Sie haben nur das zweite in Ihrem Store.
Ich gehe davon aus, dass Sie stattdessen zwei private Schlüssel und zwei CSRs (einen für jeden Schlüssel) generiert haben und für jeden CSR eine Zertifikatskette erhalten und diese in den entsprechenden privaten Schlüssel installiert haben. Sie haben also tatsächlich zwei private Schlüssel mit unterschiedlichen Zertifikatsketten und möchten beide sehen. Verwenden Sie im Zweifelsfall keytool -list [-v]
zur Überprüfung.
Das SSL-Protokoll (jetzt TLS) tut das nicht; der Server sendet nur ein „Entity“-Zertifikat (Server-Zertifikat) mit seinen Kettenzertifikaten (sofern vorhanden) und weist den entsprechenden privaten Schlüssel in einem Handshake nach.
DuMaizwei Anfragen stellen zu können, von denen jedeeinsder gewünschten Zertifikatsketten:
Wenn die Zertifikate unterschiedliche Betreff-/SAN-Namen haben UND Ihr Client die SNI-Erweiterung verwendet (was bei neueren Browsern der Fall ist, bei anderer Software aber möglicherweise nicht), wird der Java 8-Server das Zertifikat bevorzugen, das mit dem SNI übereinstimmt. Die meisten Clients (aber nicht OpenSSL!) machen den SNI immer gleich dem Hostnamen, mit dem die Verbindung hergestellt wird, daher müssen Sie möglicherweise (vorübergehend?) Ihre Namensauflösung ändern, um mehrere Hostnamen auf denselben Server zu verweisen, beispielsweise mit Ihrer
hosts
Datei oder unbound oder Ähnlichem.Wenn die Zertifikate für verschiedene Schlüsseltypen (RSA, DSA, EC) sind und der Client nur Cipher Suites anbietet, die einen Schlüsseltyp verwenden, verwendet der Java-Server das Zertifikat für diesen Schlüsseltyp. Einige Clients ermöglichen Ihnen eine einfache Kontrolle der angebotenen Cipher Suites, andere nicht.
Wenn die Zertifikatsketten unterschiedliche (Sätze von) Signaturalgorithmen verwenden und der Client TLS1.2 mit der Erweiterung SignatureAlgorithms implementiert, wird der Java 7+-Server eine Zertifikatskette bevorzugen, die SigAlgs erfüllt. Aber ich kenne keine Clients, bei denen man SigAlgs einfach auswählen kann, und CAs bieten ohnehin kaum Auswahlmöglichkeiten, welche Signaturalgorithmen in Ketten für die von ihnen ausgestellten Zertifikate verwendet werden.