• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Mit Swiftmailer signieren

Peter Silje

Neues Mitglied
Das Signieren mit Swiftmailer und der Funktion f_send_mail (s.u.) ergibt eine Fehlermeldung, die ich nicht verstehe.
Unklar ist auch, welche Dateien und Pfade in den Befehl
$smimeSigner->setSignCertificate( $pk ,$pk );
gehören.
Ich habe vom Zertifizierer nur eine Datei bekommen (wise.crt), die hier zu Testzwecken mit fopen erfolgreich ausgelesen wird (crt und pem ergeben keinen Unterschied (durch Umbenennen die Endung geändert)),
OpenSSL ist auf dem Webserver (1blu) installiert (geprüft über phpinfo).
Aufgefallen ist mir noch, dass in der vorletzten Zeile der Fehlermeldung beim Namen von myApp_b das b fehlt (myApp_).
Hat jemand eine Idee? Vielen Dank für hilfreiche Hinweise.

PHP:
<?php

#~~~~~~~~~~ swift_mail ~~~~~~~~~~~--http://swiftmailer.org/
#~~~~~~~~~~~http://aktuell.de.selfhtml.org/artikel/php/form-mail-advanced/index.htm

function f_send_mail($absenderadresse, $betreff, $zieladresse, $body) {

//  zum Testen------------------------------------------
  error_reporting(E_ALL);
  ini_set ('display_errors', 'On');
//--------------------------------------------------------

require_once "swift_mail/lib/swift_required.php"; // Swift initialisieren
$absendername = "";

if ($_SERVER['REQUEST_METHOD'] === "POST") {
   
  #$message = Swift_Message::newInstance();//Normalfall: ok
  $message = Swift_SignedMessage::newInstance();
  $mailer = Swift_Mailer::newInstance(Swift_MailTransport::newInstance());
  $smimeSigner = Swift_Signers_SMimeSigner::newInstance();
//-----------------------------------------------------------

#$pk="http://www.xxx.de/myApp_b/includes/zertifikate/wise.crt";
#$pk="/hp/bh/ab/pn/www/myApp_b/includes/zertifikate/wise.crt";

$pk="../includes/zertifikate/wise.crt";

// Signierung mit wise-Zertifikat für privat-Nutzer
$smimeSigner->setSignCertificate( $pk ,$pk );
   
#------------------------------------------------  
$fp=fopen($pk,"r");
echo "<br>pk: ".fread($fp,100);
echo "<br>Dirname:  dirname ($pk)<br>";
fclose($fp);
#------------------------------------------------   
   
  $message
  ->setFrom(array($absenderadresse => $absendername))
  ->setTo(array($zieladresse)) // alternativ existiert setCc() und setBcc()
  ->setSubject($betreff);

  $message->setBody($body, 'text/plain');
$message->attachSigner($smimeSigner);//zum Signieren
  $result = $mailer->send($message);
  return $result;
  } //if post ende
 
header("Content-type: text/html; charset=utf-8");
}
// ende f_send_mail
?>

ergibt folgenden Ausdruck :

pk: -----BEGIN CERTIFICATE----- MIIFCDCCA/CgAwIBAgIKFnBlsgAAAAAumTANBgkqhkiG9w0BAQUFADCBkjELMAkG A1UEB
Dirname: ../includes/zertifikate

mit folgender Fehlermeldung:

Warning: openssl_pkcs7_sign() [function.openssl-pkcs7-sign]: error getting private key in /hp/bh/ab/pn/www/myApp_b/includes/swift_mail/lib/classes/Swift/Signers/SMimeSigner.php on line 290

Fatal error: Uncaught exception 'Swift_IoException' with message 'Failed to sign S/Mime message. Error: "error:0906D06C:PEM routines:PEM_read_bio:no start line".' in /hp/bh/ab/pn/www/myApp_b/includes/swift_mail/lib/classes/Swift/Signers/SMimeSigner.php:291 Stack trace: #0 /hp/bh/ab/pn/www/myApp_b/includes/swift_mail/lib/classes/Swift/Signers/SMimeSigner.php(253): Swift_Signers_SMimeSigner->messageStreamToSignedByteStream(Object(Swift_ByteStream_TemporaryFileByteStream), Object(Swift_ByteStream_TemporaryFileByteStream)) #1 /hp/bh/ab/pn/www/myApp_b/includes/swift_mail/lib/classes/Swift/Signers/SMimeSigner.php(213): Swift_Signers_SMimeSigner->toSMimeByteStream(Object(Swift_ByteStream_TemporaryFileByteStream), Object(Swift_Message)) #2 /hp/bh/ab/pn/www/myApp_b/includes/swift_mail/lib/classes/Swift/Message.php(197): Swift_Signers_SMimeSigner->signMessage(Object(Swift_Message)) #3 /hp/bh/ab/pn/www/myApp_b/includes/swift_mail/lib/classes/Swift/Message.php(153): Swift_Message->doSign() #4 /hp/bh/ab/pn/www/myApp_ in /hp/bh/ab/pn/www/myApp_b/includes/swift_mail/lib/classes/Swift/Signers/SMimeSigner.php on line 291
 
Moin,
deine wise.crt scheint in einem falschen Format zu sein.
Hier sagt er
Error: "error:0906D06C:pEM routines:pEM_read_bio:no start line
das er die start-line nicht findet.
-----BEGIN CERTIFICATE-----
muss in einer eigenen Zeile sein, genauso wie -----END CERTIFICATE-----

Evtl. stimmen auch andere Sachen nicht (64 Zeichen pro Zeile)

MfG
 
Wenn Du nur das Zertifikat bekommen hast reicht das nicht aus. Du brauchst auch den privaten Schlüssel für den Aufruf der Funktion. Welche Parameter die Funktion erwartet ist eigentlich im Handbuch klar erkennbar:
http://swiftmailer.org/docs/messages.html

Btw.: die Dateiendung ist Schall und Rauch. Es kommt auf den Inhalt der Dateien an (siehe Sentence).
 
Vielen Dank für die Hinweise.
@threadi: Welche Parameter die Funktion erwartet ist eigentlich im Handbuch klar erkennbar: eben nicht! es heisst dort zwar:
$smimeSigner->setSignCertificate('/path/to/certificate.pem', '/path/to/private-key.pem');
aber was in certificate.pem bzw private-key.pem drin stehen müsste, bleibt im Dunkeln. Ist -----BEGIN CERTIFICATE-----jetzt der Beginn des Certifikates oder des Private Keys?
BtW.: In dem Teil des Manuels ist leider auch noch ein Fehler: statt
$message = Swift_Message::newInstance(); sollte es heissen:
$message = Swift_SignedMessage::newInstance();
 
@Senteence:
Die Hinweise haben noch nicht zum Erfolg geführt:
tatsächlich fehlt vor -----END CERTIFICATE----- der Zeilenwechsel. Ich habe ihn noch nicht einfügen können.
Die Zeilen sind alle (bis auf die letzte) 64 Zeich lang, die Codiereung ist utf-8 ohne bom bzw ansi (beides probiert).
Ich werde jetzt erstmal die zweite Datei suchen (vermutlich private key).
Schönen Gruß
PS
 
aber was in certificate.pem bzw private-key.pem drin stehen müsste, bleibt im Dunkeln.

Das ist es nicht wenn man sich mit dem Aufbau von Zertifikaten auskennt oder jemanden (wie z.B. die Zertifizierungsstelle) hat der einem sagt was was ist was er da bekommt.

Ist -----BEGIN CERTIFICATE-----jetzt der Beginn des Certifikates oder des Private Keys?

Wie der Name schon sagt leitet das ein Zertifikat ein. Für private Schlüssel ist es:

Code:
-----BEGIN ENCRYPTED PRIVATE KEY-----

oder

Code:
-----BEGIN PRIVATE KEY-----

mit jeweils dazugehörigem END. Siehe auch:
http://how2ssl.com/articles/working_with_pem_files/

BtW.: In dem Teil des Manuels ist leider auch noch ein Fehler: statt
$message = Swift_Message::newInstance(); sollte es heissen:
$message = Swift_SignedMessage::newInstance();

Melde das am besten an diejenigen die die Doku geschrieben haben.
 
Problem gelöst:

Der Zertifizierer installiert/generiert Zertifikat auf dem lokalen PC.
Dieses Zertifikat ist z.B. in
FF>Extras>Einstellungen>Zertifikate anzeigen zusehen und kann dort über > Sichern als xxx.p12 Datei gespeichert werden.
Diese xxx.p12 Datei kann mit z.B.
https://www.sslshopper.com/ssl-converter.html
konvertiert werden in eine xxx.pem Datei.

Die enthält dann als reine txt-Datei den certification key und den private key.
Diese xxx.pem kann entsprechend für beide Parameter von
$smimeSigner->setSignCertificate('/path/to/certificate.pem', '/path/to/private-key.pem') eingesetzt werden.
(Man kann aber auch zwei Dateien aus xxx.pem basteln, eine mit dem certification key (z.B. cert.schall) und eine mit dem private.key (z.B. pk.rauch) und sie in die Funktion oben einsetzen.)
Die Hinweise von Senteence und threadi haben mich auf die richtige Spur gebracht. Vielen Dank und schönen Gruß P.S.
 
Zurück
Oben