Jump to content

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

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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

 

 

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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)

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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?

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
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
  • Like 1

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
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?

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden

×