Jump to content

Signaturdatei mit openssl als Batch


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

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

Link zu diesem Kommentar

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

 

bearbeitet von NilsK
Link zu diesem Kommentar

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

 

 

Link zu diesem Kommentar

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

Link zu diesem Kommentar

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)

Link zu diesem Kommentar

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.

Link zu diesem Kommentar

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?

Link zu diesem Kommentar
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.

bearbeitet von BOfH_666
Tippfehler korrigiert
Link zu diesem Kommentar

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....

Link zu diesem Kommentar
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?

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...