OpenSSL Zertifikate prüfen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • OpenSSL Zertifikate prüfen

    Schönen guten Tag

    Es geht um folgendes Thema.
    Ich habe ein CA-Zertifikat mit OpenSSL erstellt, jetzt möchte ich Partnerfirmen auch ein Zertifikat geben.

    Es geht um Bibliotheken, welche auf einer PHP Webapplication laufen sollen, diese sollten natürlich wegen der Sicherheit signiert werden.

    Mit den Zertifikaten erstellen usw. gibt es keine Probleme... auch anhand dieser Zertifikate die Bibliotheken zu signieren. Auch das prüfen klappt.

    Das große Problem ist, wie prüfe ich ob das Zertifikat wirklich ein abkömmling des CA-Zertifikates ist. Es bringt leider ja nichts nur die Daten zuprüfen ob diese mit dem Zertifikat übereinstimmen, wenn das Zertifikat nicht Orginal ist.

    Mit freundlichen Grüßen
    FlowPX

  • #2
    war mir nicht so das es immer ein schlüsselpaar gibt?? ein eigenes und ein öffentlichen und dabei nur EINS weggibt?
    Gruß
    Uzu

    private Homepage

    Kommentar


    • #3
      Hi UzumakiNaruto

      Mit dem Privatenschlüssel werden die Zertifikate singiert. Der öffentliche Schlüssel ist selbst im Zertifikat mit enthalten. Das Problem ist also das herausgegebene Child Zertifikat mit dem Parent Zertifikat zu prüfen.

      Das Programm bringt im Umfang das CA-Zertifikat mit. Mit diesem wurden die Child Zertifikate welche geprüft werden sollen signiert.
      Aus dem CA-Zertifikat kann ich auch Problemlos einen öffentlichen Schlüssel lesen, genau so wie aus den Child Zertifikaten. Nur wie prüft man jetzt anhand der vorhandenen Daten. Ob das Zertifikat von uns verteilt wurde.

      Mit freundlichen Grüßen
      FlowPX

      Kommentar


      • #4
        Ich habs bisher so verstanden: Du hast ein "Mutterzertifikat", welches du von einer Zertifizierungsstelle hast ausstellen lassen. Nun stellst du selbst "Tochterzertifikate" aus und verteilst sie an Hersteller von Libraries.
        Jetzt will so eine Lib deine Applikation verwenden. Die Lib wurde mit einem "Tochterzertifikat" signiert. Du willst prüfen, ob es ein von dir ausgestelltes ist.

        Möglichkeit 1: Speichere eine Kopie aller Tochterzertifikate, die du ausstellst. Findest du das Zertifikat einer Lib in deinem Speicher, ist es valide.

        Möglichkeit 2: Das "Tochterzertifikat" enthält den Namen der Zertifizierungsstelle (die Mutter) und noch weitere Details. Mit openssl_x509_parse() kannst du da ran und kannst es mit den Daten vergleichen, die du bei der Ausstellung irgendwo gespeichert hast. Aber Vorsicht: Du prüfst hier nicht das Zertifikat, sondern seine Metadaten. Das ist nicht besonders sicher.

        Möglichkeit 3: Das "Tochterzertifikat" enthält die digitale Unterschrift der Zertifizierungsstelle (Mutter). Besorge dir das "Mutterzertifikat". In diesem befindet sich der öffentliche Schlüssel dieser Authentifizierungsstelle (der Mutter) mit dem die digitale Unterschrift des "Tochterzertifikates" überprüft werden kann.

        Kommentar


        • #5
          Genau möglichkeit 3 meine ich. Wie realisiere ich das in php? mit welchen befehlen prüfe ich die? mfg. flowpx

          Kommentar


          • #6
            Wenn du die Signatur schon hättest, könntest du sie mit openssl_verify() prüfen. Aber PHP bietet kein Mittel, um die Signatur aus einem Zertifikat zu extrahieren und auch keine Funktion, bei der man das ganze Zertifikat reinsteckt und die Signatur geprüft wird.

            Was bleibt dir übrig?
            Du kannst openssl auf der Kommandozeile aufrufen (-verify).
            Oder du verwendest PEAR::Crypt_RSA.
            Oder du extrahierst die Signatur selbst. Dazu brauchst du einen ASN.1 Parser und schließlich openssl_verify().

            Kommentar


            • #7
              Schon ein bisschen ärgerlich das PHP dafür keine funktion bietet... genau so ist die verify Methode noch Experimentell.

              Könnte zwar ein komplett neues System für Zertifikate und Signieren der Libs erstellen. Doch die anderen Zertifikate werden vom System Direkt erkannt und können vom System geöffnet werden. Also die Zertifikate mit OpenSSL bieten schon vorteile.

              Naja werd mir mal die vorgeschlagenen Sachen genauer anschauen, aber das ist genau das was ich wissen wollte... Vielen Dank

              Kommentar


              • #8
                Was ein glück xD

                http://www.krisbailey.com/manually-p...ificate-in-php
                Also damit kann man das Zertifikat parsen.
                Und ich denke im Array liegt an der stelle [0][1][2][1] der "signierte" code part. Jetzt hab ich versucht das zu entschlüssel mit "openssl_public_decrypt" und dem passenden PublicKey.. Aber was heraus kommt ist ein leerer String... Mit einem falschen Key versucht... wieder ein leeren String.

                Wie müsste ich jetzt damit weiter vorran gehen, dachte mit dem entschlüsseln mit dem Publickey wäre die sache jetzt dann getan. Nur irgendwie geht das doch nicht so einfach.

                Mit freundlichen Grüßen
                FlowPX

                Kommentar


                • #9
                  Original geschrieben von FlowPX
                  Also damit kann man das Zertifikat parsen.
                  Und ich denke im Array liegt an der stelle [0][1][2][1] der "signierte" code part.
                  "Signierter Code Part"? Was soll das sein? Ich kenne den Parser nicht, welcher auf der verlinkten Seite verwendet wird. Du brauchst aber nichts "signiertes" sondern die Signatur.

                  Jetzt hab ich versucht das zu entschlüssel mit "openssl_public_decrypt" und dem passenden PublicKey.
                  Und wo hast du den her? Scheint ja nicht das zu sein, was du glaubst.

                  Ein X.509 Zertifikat enthält u.a.
                  - den Public Key des Inhabers,
                  - Angaben zur Gültigkeit,
                  - den Namen des Inhabers,
                  - den Namen des Ausstellers und
                  - die Signatur des Ausstellers.

                  Bis zu meinem letzten Beitrag dachte ich noch, du möchtest prüfen, ob der Aussteller die o.g. "Mutter" ist. Dazu wolltest/solltest du die Signatur des Ausstellers (Mutter) validieren, nicht den PubKey des Inhabers (Tochter).

                  Keine Ahnung, wo jetzt die Signatur in diesem Array steckt, das dir der ASN.1 Parser liefert. Irgendwo muss es sein. Vielleicht ist es auch das, was du für den PubKey hältst.
                  Wenn du die Signatur hast, musst du sie an openssl_verify() verfüttern. Vorher evtl. noch base64_decode()-n.

                  Kommentar


                  • #10
                    Ich denke ich drücke mich nur wieder bisschen unverständlich aus... Denke schon wieder zuweit.

                    Ich hab ein CA-Zertifikat erstellt, davon hab ich den Publickey und den Privatenkey.

                    Und die Parterfirmen bekommen ein Child Zertifikat was mit dem CA Zertifikat signiert ist.

                    Jetzt soll geprüft werden, ob das Zertifikat von den Partnerfirmen wirklich von uns herausgegeben wurde.

                    Du liegst also mit deiner Vermutung total richtig ;-)

                    Jetzt hab ich versucht die Signatur zu entschlüsseln um zu schauen ob da ein MD5 oder ein SHA1 Hash von dem Zertifikat drin ist, welches sich mit dem PublicKey vom CA-Zertifikat entschlüseln lässt. Da liege ich aber scheinbar mit meiner vermutung falsch.

                    Mit der verify Methode komm ich gerade nicht weiter, da ich nicht weiß mit was für Informationen ich diese füttern sollte. Publickey vom CA-Zertifikat denk ich mal und die Signatur vom Child Zertifikat. Nur die Methode verlangt auch nach weiteren Daten ($Data in der PHP beschreibung)...

                    Nur was entspricht $Data? Das Zertifikat ohne Signatur? Das komplette Zertifikat Base64 encoded? und und und ^^

                    Leider gibt es über das Thema sehr wenig Informationen im Netz.

                    Mit freundlichen Grüßen
                    FlowPX

                    Kommentar


                    • #11
                      Sehr wenig ist gut, eigentlich gar nichts, was mit PHP zu tun hat.
                      Ich bin da auch nicht so firm, wie du vielleicht denkst. Hatte dazu mal einen Vortrag im Studium, aber an vieles erinnere ich mich nur sehr wage. Mag mich auch irren ...

                      openssl_verify ist jedenfalls die einzige PHP-Funktion, die irgendwas mit Signatur zu tun hat. Was da als $data verlangt wird, ist eine gute Frage. Selbstverständlich die Daten, die signiert wurden. Aber das kann ja eigentlich nicht das ganze Child-Zertifikat sein, denn dabei würde sich die Signatur ja selbst enthalten ... Henne-Ei-Problem.

                      EDIT:
                      Lies mal http://en.wikipedia.org/wiki/X.509#S...9_certificates

                      Kommentar


                      • #12
                        Man wird leider nicht Schlau aus der ganzen Sache. Mal schauen vielleicht such ich doch nach einer Alternative demnächts... Oder finde genaue spezifikationen wie das ganze funkioniert. Naja mal schauen.

                        Aufjedenfall schon einmal Danke für die große Mühe.

                        Mit freundlichen Grüßen
                        FlowPX

                        Kommentar


                        • #13
                          du willst mit den herausgegebenen zertifikaten ja die ankommenden libs signieren?!?

                          wie werden den die libs übertragen?
                          dient die zertifizierung dafür um zu erfahren WOHER die lib kommt?

                          evtl köntest du den übertragungsweg vom lib hersteller zu euch verschlüsseln .. dann kümmert sich darum der ssh-server, apache server, etc ... je nachdem welcher übertragungsweg benutzt wird.

                          passen dort die zertifikate nicht zusammen gibt es keine verbindung.
                          wie beim apache der user zertifikate zur authentifizierung benutzt .. nur wer eins bekommen und im browser importiert hat kann die webseite example.de besuchen

                          kommt natürlich darauf an wofür das zertifikat wichtig ist.
                          Gruß
                          Uzu

                          private Homepage

                          Kommentar


                          • #14
                            Tag

                            Das System funktioniert so. Der Kunde hat die Webapplication auf seine Server. Das Programm bringt Automatisch eine Liste von möglichen update Servern mit. Will der Kunde jetzt eine bestimmte funktion nach installieren, wird diese vom Server geladen und das Zertifikat geprüft ob der Herausgeber uns bekannt ist.

                            Genau so kann der Kunde aber in seinem System neue Updateserver hinzufügen, von denen Libs geladen werden können.
                            Zum Beispiel wenn ein Entwickler für dieses Produkt einen eigenen Update Server betreiben möchte um seine Libs immer aktuell zuhalten.
                            Doch so können wir keine Sicherheit garantieren, dass das System fehlerfrei und sicher läuft.

                            Aber man könnte auch Manuell Libs auf den Serverladen, welche man von anderen Quellen bekommen hat.

                            Und um den Herausgeber genau zu kennen sollte das ganze halt per Zertifikat sein.

                            Mit freundlichen Grüßen
                            FlowPX

                            Kommentar

                            Lädt...
                            X