Jump to content
Sign in to follow this  
addy0604

Signaturdatei mit openssl als Batch

Recommended Posts

Hallo Zusammen,

 

mir wachsen gerade graue Haare, ich hoffe ihr könnt mir helfen...

 

Ich habe hier XML-Dateien, für die ich jeweils eine Signatur-Datei mittels einem PEM-Zertifikat mit openssl erstellen muss.

Mit openssl dgst -sha512 -binary -out <Dateiname-mit-Suffix>.sig -sign Zertifikat.pem <Dateiname-mit-Suffix> geht das auch prima.

Man wird nach der Pass-Phrase gefragt und nach Eingabe des Kennwortes wird die Signaturdatei erstellt.

 

Nun hab ich aber 1097 XML-Dateien und zukünftig werden täglich Dateien erzeugt, die genauso bearbeitet werden müssen.

Mir tun bei dem Gedanken jetzt schon die Finger weh, deshalb würde ich das gern automatisieren.

Gibt es die Möglichkeit das Kennwort für die Pass-Phrase dort mit einzubauen? In den Howto's zu OpenSSL hab ich jedenfalls nichts gefunden. Hat da schon jemand Erfahrungen mit?

Das Kennwort aus dem Zertifikat entfernen wird wahrscheinlich nicht gehen, weil es dann nicht mehr in der Gegenstelle (BZSt) verifiziert werden kann.

 

Und wenn ja, wie könnte ein Script aussehen, das nach und nach alle 1097 Dateien aus dem Verzeichnis mit einer Signaturdatei versieht?

Ich denke da an eine for-Schleife, hab aber wenig Erfahrungen damit...

 

Grüße

Matthias

Share this post


Link to post
Share on other sites

Moin,

 

dasselbe Kennwort für mehrere (oder gar alle) privaten Schlüssel wäre ziemlich sinnfrei. Was ist denn die Anforderung, wozu soll das dienen?

 

mir scheint, ich war auf dem falschen Dampfer. Kannst du bitte trotzdem mal beschreiben, was da eigentlich erreicht werden soll?

 

Gruß, Nils

 

Edited by NilsK

Share this post


Link to post
Share on other sites

Hallo Nils,

 

mach ich gerne. Also:

Ich hab hier die besagten 1097 XML-Dateien, die zum BZSt (Bundeszentralamt für Steuern) hochgeladen werden müssen.

Das BZSt schreibt vor, das zu jeder XML-Datei eine Signaturdatei erzeugt und mit hochgeladen werden muss.

Die Signaturdatei soll mit dem gleichen PEM-Zertifikat erzeugt werden, mit dem wir uns auch am online-Portal vom BZSt anmelden.

Ich denke mal, das BZSt nutzt die Signaturdatei als Sicherheit zur Verifizierung der Dateien.

 

Als Tool wird vom BZSt das OpenSSL Commandline-Tool vorgeschlagen.

Mit einer einzelnen Datei funktioniert das in der Dos-Box auch prima.

Man gibt openssl mit allen Parametern ein (siehe oben), gibt danach nach Aufforderung das Kennwort für das PEM-Zertifikat ein, die Sig-Datei wird erzeugt, fertig.

Bei über 1000 Dateien wird das ganze recht eintönig...

 

Deshalb war meine Frage, ob jemand einen Trick kennt, um das Kennwort mit in diesen Befehl zu packen.

Es muss ja auch nicht unbedingt OpenSSL sein. Vielleicht gibt es auch andere Tools, die das können....

 

Die zweite Frage wäre, wie eine Schleife aussehen könnte, das für alle Dateien nacheinander eine Signatur erstellt wird...

 

 

Grüße

Matthias

 

 

Share this post


Link to post
Share on other sites

Ich werd verrückt, da hat doch jemand genau mein Problem.... wieso hab ich das nicht gefunden??? Mein Google muss kaputt sein...

 

Ich schau mir das morgen früh mal in Ruhe an, momentan ist es etwas stressig...

Share this post


Link to post
Share on other sites

Hmm, so richtig klappt es mit dem Script aus dem oben genannten Link nicht. Hier noch einmal das Script:

 

@echo off
Rem placeholder for cert-file
set cert=""

for %%g in (*.pem) do (
  echo "Certificate found: " %%g
  set cert=%%g
  Rem exit loop as we found a cert-file
  goto :SignFiles
)

echo "No cert file found"
exit

:SignFiles
Rem Ask user for Cert-Password
set /p password="Please input cert-password: "

Rem debug
echo %password%

Rem sign all xml-files in directory
for %%g in (*.xml) do (
  echo "Sign XML-File: " %%g
  Rem sign file and pass saved password for signing
  openssl dgst -binary -sha512 -out %%g.sig -sign=%cert% %%g < %password%
)

pause
exit


 

 

Das Zertifikat wird gefunden und möchte das Kennwort haben. Soweit so gut.

Danach kommt die Meldung: Das System kann die angegebene Datei nicht finden. -> Das Problem hatte der User im Link von BOfH_666 (siehe oben) auch gehabt.

Mit den Antworten in dem Forum komme ich nicht zurecht:

 

You need to echo %password%| openssl..., that is the redirector should be pipe. Using < expects a file named %password% which probably doesn't exist, so the error messsage you report is generated.

After I changed the openssl command to correctly pass the password via -passin parameter it works. Thanks for helping me by showing my syntax errors!

 

Mit dem -passin Parameter hatte ich es auch schon probiert.

Da kommt allerdings die Meldung: dgst: Can only sign or verify one file.

Und das mit dem "echo %password%| openssl... " hab ich gar nicht verstanden.

 

Hat noch jemand eine Idee??

 

Grüße

Matthias

Share this post


Link to post
Share on other sites

Hmmm ... also ich bin kein Freund von Batch/cmd und auch nie richtig warm geworden damit, aber wenn ich das nicht falsch verstanden habe, sollte es mit Powershell ungefähr so funktionieren:

$SourcePath = 'Pfad zum Ordner mit XML-Dateien'
$CertFile = 'Zertifikat.pem'   # am Besten vermutlich inclusive Pfad
Get-ChildItem -Path $SourcePath -Filter *.xml |
    ForEach-Object {
        $outfile = $_.BaseName + '.sig'
        Start-Process -FilePath openssl -ArgumentList "dgst -sha512 -binary -out $outfile -sign $CertFile  $_.FullName -passin pass:""hier das Passwort"""
    }

Probier ma!  ;-)  (natürlich erstmal nur an 2 oder 3 Test-XML-Dateien)

Share this post


Link to post
Share on other sites

Hallo BOfH_666,

 

es knirschelt noch etwas. Mit dem SourcePath scheint etwas nicht zu stimmen und das Script will das Zertifikat öffnen und fragt nach einem entsprechenden Programm... siehe Screenshot

 

 

1.JPG

Share this post


Link to post
Share on other sites

Hmmm ... wenn Du noch ne Weile in "Windows-Umgebungen unterwegs sein möchtest", nimmst Du Dir bei nächster Gelegenheit mal bitte etwas Zeit und schaffst Dir die Grundlagen von Powershell drauf. Ich glaube, es wird sich für Dich auszahlen und man kommt in Zukunft einfach nicht mehr dran vorbei.  ;-)

Bei der Zuweisung der Variablen gehören die "Werte" in Anführungszeichen - so wie es oben in meinem Code-Beispiel zu sehen ist.

Share this post


Link to post
Share on other sites

Grundsätzlich hast du natürlich recht, das immer mehr mit Powershell gemacht wird. Leider, ich gestehe, ich bin eingefleischter Mausschubser und finde Powershell zum... übergeben, sorry.

Ich finde da echt keinen Draht hin. Aber auch Grundlagen (selbst wenn ich sie hätte) verblassen, wenn man einmal im Jahr ein kleines Script braucht. Eine Batchdatei ist für mich halbwegs nachvollziehbar, Powershell ist für mich ein Sack voll Hieroglyphen und bin da völlig überfordert.

 

Wenn du noch etwas Geduld mit mir hast würde ich gern noch einmal zu deinem Script zurückkommen.

Nachdem die Hochkommata eingefügt sind kommt zumindest keine Fehlermeldung mehr. Es erscheint nur ganz kurz ein Konsolenfenster.

Allerdings wird auch keine Signaturdatei erstellt.

Ich hab mal versucht mit > Output.txt eine Ursache zu finden, aber die Datei bleibt leider leer. Wäre auch zu einfach gewesen ;)

 

Gibt es da andere Möglichkeiten herauszufinden, wo es klemmt?

Share this post


Link to post
Share on other sites

Häng an das Start-Process die Parameter -wait und -nonewwindow an. Dann sollten evtl. Fehler angezeigt werden.

Evtl. fehlt der Pfad zu Openssl und die Endung (.exe).

Share this post


Link to post
Share on other sites
vor 52 Minuten schrieb addy0604:

Grundsätzlich hast du natürlich recht, das immer mehr mit Powershell gemacht wird. Leider, ich gestehe, ich bin eingefleischter Mausschubser und finde Powershell zum... übergeben, sorry.

Ich finde da echt keinen Draht hin. Aber auch Grundlagen (selbst wenn ich sie hätte) verblassen, wenn man einmal im Jahr ein kleines Script braucht. Eine Batchdatei ist für mich halbwegs nachvollziehbar, Powershell ist für mich ein Sack voll Hieroglyphen und bin da völlig überfordert.

Wenn Du die Grundlagen einer Technologie einmal richtig gelernt hast, dann hilft Dir das auch weiter, wenn Du sie nur selten benutzt - 'ist wie Fahrradfahren - Du fällst ja auch nicht um, nur weil Du mal n' halbes Jahr nicht gefahren bist.

Ein guter und sogar ansatzweise unterhaltsamer Einstieg gelingt mit dem kostenlosen Videokurs der Microsoft Virtual Acadmy - Getting Started with Microsoft Poswershell. Das Anschauen der enthaltenen Videos dauert nur ca 8-10 Stunden, aber es wird Dir die Augen öffnen und vielleicht in Zukunft eine Menge Deiner Arbeitszeit einsparen weil Du viele Sachen einfach automatisieren kannst.

Wenn man des Englishen mächtig ist, ist Powershell-Code in Grenzen quasi selbsterklärend, weil eben keine Hieroglyphen benutzt werden, wie das z.B. bei machen Linux-Tools üblich ist oder war. z.B. braucht man cmdlets wie Test-Path oder Get-Process oder Get-Service nicht wirklich aufwändig erklären, oder?  ;-)

 

Nun zum Script: Wie Dukel schon geschrieben hat: Wenn die Openssl.exe nicht in der Umgebungsvariable "Path" zu finden ist, musst Du den kompletten Pfad angeben, inclusive der Erweiterung. Die Parameter -Wait und -NoNewWindow zu ergänzen kann auch nicht schaden. -NoNewWindow leitet die Konsolenausgabe von OpenSSL in die Powershell-Konsole um und -Wait wartet einfach mit der Ausführung bis die Aufgerufene externe Anwendung (also OpenSSL in diesem Fall) fertig ist und die Kontrolle wieder abgegeben hat.

Edited by BOfH_666
Tippfehler korrigiert
  • Like 1

Share this post


Link to post
Share on other sites

Ich fürchte ich muss mir das wirklich irgendwann mal zur Gemüte führen. Wahrscheinlich mal an einem Wochenende. Denn selbst in der Zeit, in der ich gerade deinen Text gelesen hab, war der Vorstand bei mir, weil die Mails nicht schnell genug auf seinem Blackberry landen und ein anderer mit Papierstau im MFP 2 Etagen über mir. Ich kann manchmal froh sein, wenn ich mal 30 min konzentriert an einer Sache arbeiten kann. Aber ich will auch nicht jammern oder mich beklagen, sind alles liebe Kollegen ;)

 

Aber zurück zum Script...

Ich hab also den ganzen Pfad der OpenSSL.exe angegeben und auch die beiden Schalter angehangen. Nun sieht man auch was gemacht wird.

Leider kommt wieder die altbekannte Meldung: dgst: Can only sign or verify one file.

Ich denke das wird mit dem Schalter -passin zusammenhängen. Das Problem hatte ich schon in der Batchdatei.

 

Dann wird es wohl kein generelles Problem mit Batch oder Powershell sein, sondern eher ein Problem mit openssl....

Share this post


Link to post
Share on other sites
vor 1 Minute schrieb addy0604:

Leider kommt wieder die altbekannte Meldung: dgst: Can only sign or verify one file.

Ich denke das wird mit dem Schalter -passin zusammenhängen.

Ich würde ja eher auf die Übergabe des Dateinamens der zu bearbeitenden Datei tippen. Was passiert denn, wenn Du das Kommando manuell mit einem spezifischen Dateienamen in einer Powershell-Konsole eingibst?

Share this post


Link to post
Share on other sites
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte überlege Dir, ob es nicht sinnvoller ist ein neues Thema zu erstellen.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

Werbepartner:



×
×
  • Create New...