2016-06-10 9 views
0

Ein weiteres Legacy-Support-Problem hier!
Wir haben ein Server-Netzwerk mit mehreren Clients, in dem jede Komponente ein selbstsigniertes Zertifikat hat und dem Truststore des Servers/Clients hinzugefügt wird. Wir verwenden hier keine Zertifizierungsstelle.
Jetzt ist unser Problem, dass wir alle Zertifikate für bessere Sicherheit aktualisieren müssen. Die neuen Clients werden mit neueren Zertifikaten geliefert und sogar der Server wird neue Zertifikate haben.
Unser Problem ist, wie man mit den alten Clients umgeht. Schlüsseltresore unserer alten Kunden zu aktualisieren, ist der letzte Ausweg.SSL: Wie werden mehrere Clients mit separaten Schlüsseln behandelt, die sich mit demselben Port verbinden?

Dinge, die nicht funktionieren:

  1. Hinzufügen sowohl die neuen und alten Zertifikate in Server-Vertrauens: Auch die Clients die Authentifizierung der Server und die Server-Zertifikat wird nicht in dem Client-Vertrauens vorhanden sein.

  2. Neuen Port für die neuen Clients verwenden: Wir haben überlegt, neue Ports für neue Clients zu verwenden und alte Ports für alte Clients fortzusetzen, aber das Problem besteht darin, dass mehrere Anwendungen mit diesem Problem konfrontiert sind mehrere neue Ports, die nicht von anderen Produkten genutzt werden.

FWIW: Die Server sind in Java und die Kunden sind in C++

EDIT nach EJP Antwort
Ich bin wahrscheinlich eine sehr dumme Frage hier fragen, aber ich wollte nur sicher sein. Es gibt absolut keine Möglichkeit, den SSL-Kontext eines Sockets zu bearbeiten, sobald er gebunden ist. Richtig?
Können wir auch das Serverzertifikat auswählen, das während des Handshakes verwendet wird? Ich kenne chooseClientAlias() und chooseServerAlias() Methoden, aber hier wissen wir nicht, welches Zertifikat zu verwenden, bis der Client Hallo Nachricht gesendet wird.

Antwort

2

Abgesehen mit verschiedenen Häfen:

  1. (1) wird so weit arbeiten, wie der Server mit den Client-Zertifikaten betroffen ist.
  2. Nichts funktioniert in Bezug auf das Abrufen von alten Clients, das neue Serverzertifikat zu erkennen, außer die Client-Truststores zu aktualisieren.

diesem Grund sollten Sie eine CA verwendet haben sollte, auch ein internes ein, und warum sollten Sie absolut nicht den gleichen Fehler wieder machen. Wenn die Clients der Zertifizierungsstelle statt eines selbstsignierten Serverzertifikats direkt vertraut hätten, hätten Sie dieses Problem jetzt nicht, und Sie werden es in Zukunft nicht mehr haben, egal wie oft Sie die Zertifikate upgraden, bis das CA-Zertifikat abläuft sollte 20 Jahre dauern.

Und während Sie dabei sind, stellen Sie sicher, dass Sie so bauen, dass Client-Truststores aktualisiert werden.

Es gibt absolut keine Möglichkeit, den SSL-Kontext eines Sockets zu bearbeiten, sobald es gebunden ist. Richtig?

Es gibt keine Möglichkeit, die SSLContext zu bearbeiten, wenn es initialisiert ist, die Schaffung von Steckdosen vorangeht, lassen sie allein verbindlich. Hmm, vielleicht könntest du die KeyManager und TrustManager nachladen und einfach nicht die SSLContext erzählen, aber ich sage nicht, dass es funktionieren würde (oder nicht).

Können wir auch das Serverzertifikat für den Handshake auswählen?

Ja, das ist, was die KeyManager Schnittstelle für ist, speziell chooseServerAlias().

Ich kenne chooseClientAlias() und chooseServerAlias() Methoden, aber hier wissen wir nicht, welches Zertifikat bis zum Client verwenden Hallo Nachricht gesendet wird.

chooseServerAlias wird nicht aufgerufen, bis die ClientHello empfangen wurde.

+0

Ich stimme Ihrem Punkt bei der Verwendung einer Zertifizierungsstelle zu. Ich habe die Frage mit einem weiteren Thread aktualisiert, der gerade diskutiert wird. Kannst du das auch beantworten? – Limit

+0

Ich werde die chooseServerAlias ​​() -Methode versuchen. Ich denke, das sollte unser Problem lösen. Verwenden Sie die alten Schlüssel für alte Agenten und neue Schlüssel für neue Server. Zumindest bis wir eine CA Architektur aufgebaut haben. – Limit

Verwandte Themen