2015-09-10 10 views
10

Angenommen, ich möchte ein kommerzielles Produkt versenden, das zwei in Java geschriebene Komponenten enthält, die über ein REST-API in einem lokalen Netzwerk miteinander kommunizieren. Es könnte ein Musikmanager, eine Kontaktdatenbank, ein Kochbuch sein - wichtig ist, dass dies ein vernünftiges und extrem wahrscheinliches Szenario ist.Sichere HTTP-Kommunikation für Komponenten kommerzieller Produkte

Beachten Sie, dass es sich um zwei Komponenten handelt, die über ein lokales Netzwerk miteinander kommunizieren - nicht über die Kommunikation mit meinem Server.

Wie also mache ich die Kommunikation sicher?

Ich weiß, wenn ich einen HTTP-Server für die Welt einrichten, kann ich (sogar billig) ein SSL-Zertifikat kaufen. Ich habe es getan. Aber ich kann dem Benutzer nicht sagen, dass er ein Zertifikat kaufen soll - sie werden keine Ahnung haben, wovon ich rede, und ich würde niemals herausfinden, wie ich es installieren soll.

Also was mache ich? Jedem mein selbstsigniertes Zertifikat schicken und eine sehr schlechte Sache wie disable certificate validation in Java machen? Schrecklich, ich weiß. Aber zumindest werden die Informationen nicht im Klartext über die Linie gehen.

Wer hat bessere Lösungen?

+0

Ihre verknüpfte Antwort stellt eine andere Lösung dar: Anstatt die Zertifikatsüberprüfung für selbstsignierte Zertifikate zu deaktivieren, "Exportieren Sie das Zertifikat (...) und importieren Sie es in Ihren JVM-Truststore" – mjn

+0

möchten Sie den Inhalt der Anfragen vollständig ausblenden oder einfach sicherstellen, dass sie nicht von überall her kommen und akzeptiert werden? – cahen

+0

Ich möchte die Kommunikation so gut wie möglich sichern, aber in erster Linie möchte ich nicht, dass die Kommunikation eindeutig über die Leitung geht (und ich meine nicht, dass ich sie nur verschleiern will). –

Antwort

2

Suchen Sie nach OAuth 2.0, um Ihre Dienste zu sichern, und Sie sollten nur Token für Ihre Clients anstelle von SSL bereitstellen. Facebook, Google usw. verwendet es.

https://en.wikipedia.org/wiki/OAuth

+0

Ich bin gespannt wie das helfen würde? OP war an Verschlüsselung interessiert, und in genau diesem Link heißt es: "OAuth 2.0 unterstützt keine Signatur, Verschlüsselung, Kanalbindung oder Client-Verifikation. Es basiert vollständig auf SSL für ein gewisses Maß an Vertraulichkeit und Server-Authentifizierung." Dies scheint keine Lösung für sichere Kommunikation zu bieten. – Austin

+0

OP interessiert, die Interaktion zwischen seinen Dienstleistungen und Kunden zu sichern. Anstatt 2-Wege-SSL zu verwenden, sollte es möglich sein, One-Way-SSL mit OAuth-Protokoll zu verwenden, das Funktionen zur Authentifizierung von Benutzern nach Token anstelle eines Certs bietet. Es ist keine Transportsicherungs-Technologie, es ist eine auf Anfrage basierende Sicherung. Ich habe gerade eine Alternative angeboten. – Taras

0

Ihre linked answer stellt eine andere Lösung: Statt Zertifikatsvalidierung für selbstsignierte Zertifikate zu deaktivieren, ‚Exportieren Sie das Zertifikat (...) und es in Ihrer JVM-Vertrauens importieren‘.

Nur zum ersten Mal, wenn ein unbekanntes Zertifikat gefunden wird, fragen Sie nach Benutzerbestätigung.

+0

Ich liefere ein kommerzielles Produkt an Joe/Jane User. Erwarte ich wirklich, dass er oder sie eine Eingabeaufforderung öffnet und ein Zertifikat in einen JVM-Truststore importiert? Er/sie weiß nicht, was ein Zertifikat oder ein Truststore ist. Er weiß, dass er/sie sich nicht damit herumärgern muss, wenn er einen Browser oder einen Mediaplayer installiert oder irgendetwas anderes, das von durchschnittlichen Leuten verwendet werden soll. Ich sehe nicht, wie das eine realistische Option ist. Wenn mein Zielmarkt Programmierer wären, hätte ich überhaupt kein Problem ... –

+0

... weil die Art und Weise, wie ich die Antwort an dem Link lese, ist, dass das Importieren in einen JVM-Truststore eine manuelle Sache ist von der Eingabeaufforderung. Kann ich das programmatisch von in einem Java-Programm machen? Wenn nicht, dann halte ich das nicht für eine praktikable Lösung. –

6

20. September '15aktualisiert in den Kommentaren

angehoben, um die Punkte zu klären

Um zu verstehen, wie dies getan werden kann, lassen Sie uns ein mögliches Einsatzszenario einer solchen Anwendung untersuchen. Angenommen, die fragliche Anwendung besteht aus zwei Komponenten - dem Client-Teil und dem Server-Teil, die auf verschiedenen Computern in einem lokalen Netzwerk installiert werden sollen. Wir möchten, dass unser Server nur sichere Verbindungen akzeptiert, daher wird das lokale Netzwerk als feindlich betrachtet.

  1. Installieren Sie den Server Teil. Zum Zeitpunkt der Installation erstellen Sie programmgesteuert ein selbstsigniertes Zertifikat mit dem Hostnamen eines Zielcomputers. Wenn es keinen DNS-Eintrag für den Computer gibt (wie myserver.mycorp.com), verwenden Sie seine IP-Adresse - es muss statisch sein, da wir den Client-Teil darauf verweisen müssen. Sie können Bouncy Castle API verwenden, um ein Zertifikat in Code zu erstellen.

  2. Installieren Sie das Client-Teil auf einem anderen Computer und kopieren Sie das generierte Zertifikat in den Installationsordner. Wenn Sie dies manuell tun, wird effektiv Vertrauensstellung zwischen dem Server und dem Client hergestellt. Der Versuch, dies automatisch über eine unverschlüsselte Verbindung über ein feindliches Netzwerk zu tun, würde den Zweck vereiteln.

  3. Da Sie die Kommunikation strikt zwischen Ihren eigenen Anwendungsteilen sichern, haben Sie die volle Kontrolle darüber, welche Zertifikate die betreffende Anwendung anvertraut.Auf dem Client erstellen einen Schlüsselspeicher, und fügen Sie das generierte Zertifikat, um es:

    FileInputStream fis = new FileInputStream(yourCertificateFile); 
    CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
    X509Certificate c = (X509Certificate)cf.generateCertificate(fis); 
    
    KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); 
    ks.load(null, aRandomKeystorePasswordCharArray); 
    ks.setCertificateEntry(aUniqueNameForYourCertificate, c); 
    
    FileOutputStream fos = new FileOutputStream(aRandomKeystoreFileName); 
    ks.store(fos, aRandomKeystorePasswordCharArray); 
    fos.close(); 
    

    die JVM sagen, dass Ihre Anwendung nur Zertifikate von seinem eigenen Schlüsselspeicher vertrauen wird.

    // replace backslashes '\' with slashes '/' in aRandomKeystoreFileName on Windows 
    System.setProperty("javax.net.ssl.trustStore", aRandomKeystoreFileName); 
    System.setProperty("javax.net.ssl.trustStorePassword", aRandomKeystorePassword); 
    
+0

Roman, wenn die programmgesteuerte Aktivierung eines Keystores so einfach ist wie das Festlegen einer Keystore-Eigenschaft zur Laufzeit, kann ich einfach jede Komponente mit einem in der JAR-Datei vorkonfigurierten Keystore ausliefern? Oder müsste ich es in einen nackten Dateipfad kopieren? Was ist der Vorteil/die Notwendigkeit, den Keystore im laufenden Betrieb zu erstellen? –

+0

@GarretWilson Siehe http://stackoverflow.com/questions/344748/how-to-use-a-file-in-a-jar-as-javax-net-ssl-keystore und http://stackoverflow.com/ a/7593421/2672392 – Omikron

+0

Omikron ist genau richtig. Wenn Sie 'javax.net.ssl.trustStore' verwenden wollen, müssen Sie eine separate Schlüsselspeicherdatei haben.Sie können jedoch einen Keystore verwenden, der zur Laufzeit (im Speicher) erstellt wird, um benutzerdefinierte SSL-Kontexte zu erstellen. Sie können einen solchen Kontext als den Standard festlegen, der von Ihrer Anwendung verwendet werden soll. Nebenbei bemerkt, habe ich auch die Antwort aktualisiert, um 'javax.net.ssl.trustStorePassword' zu erwähnen. –

0

Werfen Sie einen Blick auf Vergleich zwischen Facebook Connect, OAuth und OpenID bei TheNextWeb

OpenID: OpenID als dritte Partei dient, die überprüfen können, wer Sie sind

OAuth: Eine sicherere und sicherere Möglichkeit für Leute, Ihnen Zugang zu geben

Facebook Connect: Mit Facebook Connect sehen wir Elemente von OpenID und OAuth. Facebook Connect kann bestätigen, dass Sie der sind, der Sie für die Person halten, und Sie können dann auf Ihre Daten zugreifen, sobald Sie die entsprechende Erlaubnis dazu erteilt haben.

Zusammenfassung:

OpenID und OAuth denken, dass sie eine kollektive richtige Antwort haben, aber Facebook denkt klar, dass es seine eigene hat. Wir müssen sehen, wie es sich in Zukunft gestaltet.

+0

Was haben OpenID oder OAuth, die Authentifizierungsmechanismen sind, mit der Sicherung des Drahtprotokolls zu tun? –

+0

Werfen Sie einen Blick auf http://stackoverflow.com/questions/131091/openid-over-ssl-with-self -signed-certificate & http://security.stackexchange.com/questions/30524/openid-without-ssl-certificate –

+0

Also keiner von beiden hat irgendetwas damit zu tun, das Kabelprotokoll zu sichern, ich fürchte, das tut es nicht beantworte die Frage. –