Mail mit Anhang mit S/MIME verschlüsseln

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Okay, nachdem ich mich eine halben Tag mit der Problematik bschäftigt habe, bin ich jetzt am Ende:

    Ich befinde mich in einem Firmenintranet und kann über ein Webinterface die Zertifikate der Angestellten runter laden. Die daraus resultierenden Dateien habe die Endung .cer.
    Mche ich eine Doppleklick auf so eine Datei geht das typischw Windows-Zetifikat-Fenster auf und ich kann das Zertifikat auf dem rechner installieren. Mit dem installierten Zertifikat kann ich dann über Outlook eine Mail verschlüsseln.

    Das klappt alles ohne Probleme.

    Möchte ich das Ganze aber mit PHP machen, dann funktioniert das nicht. Hier mal die relevanten Code-Ausschnitte:

    Quellcode

    1. $mail->EncryptCert = file_get_contents(Base::getFPath('data') . 'testcert.cer');
    2. function smime_encrypt($body)
    3. {
    4. if ( !isset($this->EncryptCert) )
    5. {
    6. $this->error_handler('no encryption certificate specified');
    7. return;
    8. }
    9. $msg = tempnam(Base::getFPath('data') . 'cache', 'smime_');
    10. $signed = tempnam(Base::getFPath('data') . 'cache', 'smime_');
    11. $fp = @fopen($msg,'wb');
    12. if ( !$fp )
    13. {
    14. $this->error_handler("cannot open temporary file $msg for writing");
    15. return false;
    16. }
    17. fwrite($fp, $body);
    18. fclose($fp);
    19. if (!openssl_pkcs7_encrypt($msg, $signed, $this->EncryptCert, array()))
    20. {
    21. @unlink($msg);
    22. @unlink($signed);
    23. $this->error_handler("openssl_pkcs7_encrypt failed");
    24. return false;
    25. }
    26. $body = file_get_contents($signed);
    27. @unlink($msg);
    28. @unlink($signed);
    29. return $body;
    30. }
    Alles anzeigen


    openssl_pkcs7_encrypt gibt mir immer ein FALSE zurück. openssl_error_string sagt:

    error:0906D06C:PEM routines:func(109):reason(108)

    Nachdem auch Funktionen wie openssl_x509_read oder openssl_pkey_get_private nur ein FALSE zurück geben, nehme ich an, das openssl mit dem Zertifikat nichts anfangen kann.

    Leider habe ich von Verschlüsslung und Zertifikaten nur wenig Ahnung, aber vielleicht hat ja jemand von Euch eine Idee...

    70abc

    Update: So wie's aussieht, liegt das Zertifikat im Format "DER-codiertes binäres X.509" vor...
    We raise hopes, here ... until they're old enough to fend for themselves.
    - Mike Callahan
  • Hallo,

    ich bin wieder ein Stück weiter:

    openssl_pkcs7_encrypt versteht nur PEM codierte Zetifikate (könnte man ja auch mal irgendwo in die Doku schreiben). Da mein Zertifikat aber DER codiert ist, muss ich es erst über die Kommandozeile mit "openssl x509" richtig codieren.

    Jetzt kann ich eine Mail verschlüsseln, nur wird hinterher der Mailanhang nicht mehr angezeigt...

    70abc
    We raise hopes, here ... until they're old enough to fend for themselves.
    - Mike Callahan
  • Hallo,

    also verschlüsseln klappt nun. Aber ich habe wohl noch Probleme mit meinen MailHeadern.
    Ich habe drei "Typen" von Mails, die verschlüsslet werden sollen:

    1.) reine Text-Mails
    2.) HTML-Mails
    3.) Mails mit Dateianhang


    Diese drei Typen können natürlich auch kombiniert werden, also z.B. eine HTML-Mail mit Dateianhang, oder eine HTML-Mail mit alternativem reinen Text.

    Diese Mails ohne Verschlüsselung zu verschicken macht kein Problem, aber sobald ich verschlüssle, gehen Informationen verloren. So wird z.B. der Anhang mit geschcikt, aber im e-Mail Programm nicht angezeigt. Oder Ich sehe zusätzlich zum reinen text auch den HTML Teil:

    Quellcode

    1. Hallo
    2. Anbei ein Test.
    3. Gruesse,
    4. 70abc
    5. --b1_deb036db51224eeaf392c1fbadd6b77c
    6. Content-Type: text/html; charset = "iso-8859-1"
    7. Content-Transfer-Encoding: 8bit
    8. Hallo, <p>Anbei ein Test<p>Grüße,
    9. <br>70abc
    10. --b1_deb036db51224eeaf392c1fbadd6b77c--
    Alles anzeigen


    Das Ganze ist wohl ein Mail-Header Problem. Kennt sich jemand mit dem Thema aus? Oder gibt's irgendwo einen verständlichen Artikel dazu (bitte nicht den RFC)?

    70abc
    We raise hopes, here ... until they're old enough to fend for themselves.
    - Mike Callahan
  • Es geht!!!!

    Kurz das Vorgehen:

    Eine Mail mit Headern generieren (evtl. mit einer fertigen Klasse).
    Diese Mail von allen nicht Inhalt relevanten Header Informationen befreien (also alles was nicht irgndwie was mit multipart zu tun hat), dann den Rest verschlüsseln.
    Beim Verschlüsseln wird ein neuer Mail Header an den Anfang der verschlüsselten Mail gestellt. Diesen von der Mail trennen, das ist der neue Header. Dann das Ganze wie eine normale Mail z.B. mit "mail" versenden.

    Klingt jetzt ein wenig kryptisch, aber letzendlich hängt es vom Mail-Typ ab, welche Headerinformationnen man mit verschlüsseln muss und welche weg fallen.

    70abc
    We raise hopes, here ... until they're old enough to fend for themselves.
    - Mike Callahan