Ankündigung

Einklappen
Keine Ankündigung bisher.

PDF signieren

Einklappen

Neue Werbung 2019

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

  • PDF signieren

    hallo leute,

    hat schon jemand versucht ein pdf mit einer digitalen signatur zu versehen.

    bin für jeden vorschlag dankbar. am coolsten wär ein lösungshinweis mit dem man aus einem php script eine dig. signatur in einem pdf-doc unterbringt.

    thankx

    zcmaster

  • #2
    hat schon jemand versucht ein pdf mit einer digitalen signatur zu versehen.
    Von welcher Erstellungsart von PDFs sprichst du ?
    PDFlib, FPDF, EZPDF, CPDF ... ?

    Kommentar


    • #3
      zur zeit verwende ich fpdf zur erstellung.

      mit fpdf gibt es leider keine möglichkeit ein pdf zu signieren.

      es wäre mir jedoch egal wie ich die pdf's signiere, einzige voraussetzung ist das die methode mit einem unix system zu realisieren ist.

      Kommentar


      • #4
        Hmmm, das einzigste was mir jetzt einfällt wäre SetAuthor().

        mit einer digitalen signatur zu versehen
        Najaa, analog geht ja schlecht

        Kommentar


        • #5
          kennt vielleicht jemand shell programme die ein pdf signieren können

          Kommentar


          • #6
            Ich habe auch schon vergeblich nach einer einfachen Methode gesucht. Das ganze scheint ein recht komplexer Vorgang zu sein. Falls doch jemand eine einfache Lösung parat hat würde auch ich mich brennend dafür interessieren. Bei mir sind die Voraussetzungen die Gleichen wie bei zcmaster: Mit FPDF erstellt und zum signieren ist mir alles recht was unter Linux läuft.

            Kommentar


            • #7
              Zitat von zcmaster
              kennt vielleicht jemand shell programme die ein pdf signieren können
              gpg -s datei.pdf

              Kommentar


              • #8
                Soweit ich weis müssen PDF-Dokumente mit einer internen Signatur ausgestattet sein um eine rechtliche Relevanz zu erlangen. Ich habe es aber einmal ausprobiert und das Ergebnis ist dass der Acrobat Reader die Datei nicht mehr öffen kann. Ich kenne mich nicht mit PGP aus, aber ich vermute man muss die Datei vorher noch mit dem öffentlichen Schlüssel dekodieren muss. Dann ist das ganze aber eindeutig keine Möglichkeit für mich. Einem Kunden kann man nicht zumuten sich vorher Software zu installieren um Informationen wie z.B. AGB's oder Rechnungen betrachten zu können.

                Kommentar


                • #9
                  hallo leute hab da was cooles gefunden.

                  für alle die dokument rechtsgültig mittels einer signatur karte unterschreiben/verschlüsseln wollen kann ich euch http://www.seccommerce.de/ empfehlen. diese firma bietet ein kostenlosen tool (SecSigner) zum signieren, verschlüsseln und zum prüfen an. dieses tool kann auch online (mittels java-applet) verwendete werden.

                  um signierte emails über einen webserver zu versenden hab ich vor kurzem auch eine lösung entwickelt.

                  voraussetzungen:

                  zertifikat (zbsp.: von trustcenter die bieten ein gratis zertifikat an)
                  openssl in php eingebunden


                  PHP-Code:
                  $mail_text "vspvm oisujo oijg gjjg ojgi goigoi jgoijgoi";

                  $file_name "xxx.pdf";

                  $boundary md5(uniqid(time()));
                  $body "MIME-Version: 1.0\n";
                  $body .= "Content-Type: multipart/mixed; boundary=\"" $boundary"\"\n";
                  $body .= "Content-Transfer-Encoding: quoted-printable\n\n";
                  $body .= "This is a multi-part message in MIME format.\n\n";
                  $body .= "--$boundary\n";
                  $body .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n";
                  $body .= "Content-Transfer-Encoding: quoted-printable\n\n";
                  $body .= $mail_text "\n\n";
                  // Add the attachment to the message
                  $body .= "--$boundary\n";
                  $body .= "Content-Type: application/pdf; name=\"".$file_name."\"\n";
                  $body .= "Content-Transfer-Encoding: base64\n";
                  $body .= "Content-Disposition: attachment;\n\n";
                  $fp fopen($file_name,'r');
                  while(!
                  feof($fp)){
                      
                  $file_buffer .= fgets($fp,1024);    
                  }
                  fclose($fp);
                  $body .= chunk_split(base64_encode($file_buffer)) . "\n\n";  
                  $body .= "--$boundary--\n";

                  // Save message to a file
                  $msg 'msg.txt';
                  $signed 'signed.txt';

                  $fp fopen($msg"w+");
                  fwrite($fp$body);
                  fclose($fp);

                  // Sign it
                  $passphrase="xyz";
                  $cert_file_name = ("mail_cert.pem");
                  $priv_key_file_name ="cert_key.pem");

                  $mail_headers = array("To" => "xyz@domain.xx",
                                        
                  "From" => "xyz@domain.xx",
                                        
                  "Subject" => "Betreff");             
                             

                  if (
                  openssl_pkey_get_private (array('file://'.$priv_key_file_name,$passphrase))){
                      if (
                  openssl_pkcs7_sign($msg$signed'file://'.$cert_file_name, array('file://'.$priv_key_file_name,$passphrase), $mail_headers)){
                          
                  // separate header and body, to use with mail function
                          //  unfortunate but required, else we have two sets of headers
                          //  and the email client doesn't decode the attachment
                          
                  $data file_get_contents($signed);
                          
                  $parts explode("\n\n"$data2);
                          
                          
                  // send mail (headers in the Headers parameter will override those
                          //  generated for the To & Subject parameters)
                          
                  mail($mail_headers['To'], $mail_headers['Subject'], $parts[1], $parts[0]);

                          print 
                  "Signed Mail send.";
                          
                  unlink($msg);
                          
                  unlink($signed);
                      }
                      else{
                          print 
                  "Mail send failed.";   
                      }
                  }
                  else {
                      print 
                  "\nPrivate key [b]NOT[/b] OK\n\n";

                  vielleicht kanns wer brauchen

                  ZcMaster

                  Kommentar


                  • #10
                    Das sieht echt interessant aus! Werde es mir heute Abend mal genauer anschauen. Vielen Dank zcmaster!

                    Kommentar


                    • #11
                      hallo leute,

                      wer mails digital signieren will kann einfach das script das ich weiter oben gepostet habe verwenden. man braucht dazu eigentlich nur ein fortgeschrittenes software zertifikat (für aut zbsp.: erhältlich bei www.a-cert.at) für € 120,- gültig für 5 Jahre.

                      nun aber zum eigentlich problem ein: pdf signieren mit fortgeschrittenem zertifikat.

                      hab für php keine lösung gefunden, allerdings gibts auf http://itextpdf.sourceforge.net/howtosign.html ein tut mit dem das relativ einfach geht. nötig dazu ist nur noch eine java lib (freeware) die sogenannte itext erhältlich unter http://www.lowagie.com/iText/.

                      mit diese lib hab ich mir einfach eine server/client app geschrieben die mir das pdf unterschreibt.

                      über php rufe ich lediglich den client auf und übergebe im den namen und den ort des zu unterschreibenden pdf's und fertig.

                      vielleicht hilfts ja jemanden!

                      so long zcmaster

                      Kommentar


                      • #12
                        Magst du dein Skript posten?

                        Hi zcmaster,

                        bin auf der Suche nach einer Perl Implementierung von itextpdf, leider bin ich nicht fündig geworden...
                        Magst du dein Skript posten, vielleicht finde ich ja einen Ansatz den ich brauchen kann, weil von Java hab ich überhaupt keine Ahnung...

                        Viele Grüße udo

                        Kommentar


                        • #13
                          hi udo,

                          meinst du das script zum e-mail signieren oder um pdf's zu signieren.

                          wenn du pdf's signieren willst wirst du um java nicht herumkommen.

                          zcmaster

                          Kommentar


                          • #14
                            hi zcmaster,
                            ich meine das Teil um pdfs zu signieren. Vielleicht kann ich mir aus deinem Server ohne Java Kenntnisse ein Kommandozeilentool zurecht frickeln, oder einen perl client dafür bauen...

                            Schöne Grüße Udo

                            Kommentar


                            • #15
                              hi udo,

                              so läuft der hase nicht, du mußt schließlich ein software-cert in die anwendung einbauen aus dem die signatur erstellt wird. mittels der itext lib wird danach die signatur in das pdf eingebettet.

                              ausserdem ist java nicht so schwer wie es am ersten blick aussieht.
                              am besten du sammelst erst mal erfahrung mit java dann liest du mal einiges über signaturen nach und dann codest du dir mit hilfe der beispiele unter http://itextpdf.sourceforge.net/howtosign.html deine java-app welches dir über die shell dein pdf signiert.

                              um das von mir implementierte tool einzusetzen müßte ich dieses so umbauen das als paramter das cert-file, key-file, passphrase und das pdf-file übergeben werden kann. und irgendwie hab ich nicht die lust und zeit dies zu tun.

                              schließlich lernt man am meisten wenn man es selber ausprobiert.

                              versuchmal so, hab das mal gefunden, is doch echt einfach oder?

                              Code:
                              import com.lowagie.text.Rectangle;
                              import com.lowagie.text.pdf.*;
                              import java.io.*;
                              import java.security.*;
                              import java.util.Enumeration;
                              
                              public class Main
                              {
                              
                                  public Main()
                                  {
                                  }
                              
                                  public static void main(String args[])
                                  {
                                      String s = "input.pdf";
                                      String s1 = "output.pdf";
                                      String s2 = "cert.pfx";
                                      try
                                      {
                                          for(int i = 0; i < args.length; i++)
                                          {
                                              if(args[i].toLowerCase().equals("-in") && args[i + 1] != null)
                                                  s = args[i + 1];
                                              if(args[i].toLowerCase().equals("-out") && args[i + 1] != null)
                                                  s1 = args[i + 1];
                                              if(args[i].toLowerCase().equals("-pfx") && args[i + 1] != null)
                                                  s2 = args[i + 1];
                                          }
                              
                                      }
                                      catch(Exception exception)
                                      {
                                          System.out.println("Usage: command -in input.pdf -out output.pdf -key key.pfx");
                                      }
                                      sign(s, s1, s2);
                                  }
                              
                                  public static void sign(String s, String s1, String s2)
                                  {
                                      try
                                      {
                                          KeyStore keystore = KeyStore.getInstance("pkcs12");
                                          keystore.load(new FileInputStream(s2), "PASSPHRASE".toCharArray());
                                          String s3 = (String)keystore.aliases().nextElement();
                                          PrivateKey privatekey = (PrivateKey)keystore.getKey(s3, "PASSPHRASE".toCharArray());
                                          java.security.cert.Certificate acertificate[] = keystore.getCertificateChain(s3);
                                          PdfReader pdfreader = new PdfReader(s);
                                          FileOutputStream fileoutputstream = new FileOutputStream(s1);
                                          PdfStamper pdfstamper = PdfStamper.createSignature(pdfreader, fileoutputstream, '\0');
                                          PdfSignatureAppearance pdfsignatureappearance = pdfstamper.getSignatureAppearance();
                                          pdfsignatureappearance.setCrypto(privatekey, acertificate, null, PdfSignatureAppearance.WINCER_SIGNED);
                                          pdfsignatureappearance.setContact("NAME");
                                          pdfsignatureappearance.setLocation("ORT");
                                          pdfsignatureappearance.setVisibleSignature(new Rectangle(450F, 60F, 650F, 80F), 1, null);
                                          pdfsignatureappearance.setExternalDigest(new byte[128], new byte[20], "RSA");
                                          pdfsignatureappearance.preClose();
                                          MessageDigest messagedigest = MessageDigest.getInstance("SHA1");
                                          byte abyte0[] = new byte[8192];
                                          InputStream inputstream = pdfsignatureappearance.getRangeStream();
                                          int i;
                                          while((i = inputstream.read(abyte0)) > 0) 
                                              messagedigest.update(abyte0, 0, i);
                                          byte abyte1[] = messagedigest.digest();
                                          PdfPKCS7 pdfpkcs7 = pdfsignatureappearance.getSigStandard().getSigner();
                                          Signature signature = Signature.getInstance("SHA1withRSA");
                                          signature.initSign(privatekey);
                                          signature.update(abyte1);
                                          pdfpkcs7.setExternalDigest(signature.sign(), abyte1, "RSA");
                                          PdfDictionary pdfdictionary = new PdfDictionary();
                                          pdfdictionary.put(PdfName.CONTENTS, (new PdfString(pdfpkcs7.getEncodedPKCS7())).setHexWriting(true));
                                          pdfsignatureappearance.close(pdfdictionary);
                                      }
                                      catch(Exception exception)
                                      {
                                          System.out.println("KeyStoreException aufgetreten.");
                                          exception.printStackTrace();
                                      }
                                  }
                              }
                              grüße zcmaster

                              Kommentar

                              Lädt...
                              X