shiva1990
Goto Top

(OpenVPN) Zertifikate erstellen per Batch

Hallöle zusammen face-smile

Seit circa einer Woche durchforste ich die Tiefen des Internets nach einer passenden Lösung für mein Problem und doch wurde ich bisher nicht fündig, bzw fand ich nichts, was mir mit meinem aktuellen Kenntnisstand in irgeneiner Weise weiter half.

Ich bin in der Ausbildung zum Systemintegrator & habe primär nichts mit Programmierung zu tun, da mich die Materie allerdings sehr interessiert, bringe ich mir diese gerne selber bei. Da ich noch Anfänger bin, fehlt mir allerdings einfach noch ne Menge Wissen.

Ich wurde damit beauftragt eine Batch zu erstellen, welche automatisiert Zertifikate für eine VPN-Verbindung erstellt.
Wie ich das in der Kommandozeile an sich mache weiß ich mittlerweile aus dem FF aber um das Ganze in eine Batch umzusetzen, fehlt mir dann doch das know-how.

Bisher habe ich mich so weit in die Materie gewuselt, dass bestimmte Dinge hin und wieder (oder auch mal gar nicht) funktionieren und bin mittlerweile leider ratlos.
Hier mal der Code:

@echo off
set home=C:\Program Files\OpenVPN\easy-rsa
cd %home%
echo %cd%
:start
SETLOCAL enabledelayedexpansion
@echo Geben Sie die Gueltigkeit des Zertifikats an:
@echo [1] = 10 Jahre; [2] = 20 Jahre; [3] = 30 Jahre; [4] = 40 Jahre; [5] = 50 Jahre
SET /P Jahre=Eingabe: 

IF %Jahre% == 1 (
    ECHO Gueltigkeit auf 10 Jahre festgelegt.
    SET "build-ca.bat=C:\Program Files\OpenVPN\easy-rsa\build-ca.bat" (Habe hier jz nur eine Datei angegeben, sind aber insgesamt 5 die geändert werden müssen).  
    SET "suchen=3650"  
    SET "ersetzen_durch=3650"  
) ELSE (
IF %Jahre% == 2 (
    ECHO Gueltigkeit auf 20 Jahre festgelegt.
    SET "build-ca.bat=C:\Program Files\OpenVPN\easy-rsa\build-ca.bat"  
    SET "suchen=3650"  
    SET "ersetzen_durch=7300"  
) ELSE (
IF %Jahre% == 3 (
    ECHO Gueltigkeit auf 30 Jahre festgelegt.
    SET "build-ca.bat=C:\Program Files\OpenVPN\easy-rsa\build-ca.bat"  
    SET "suchen=3650"  
    SET "ersetzen_durch=10950"  
) ELSE (
IF %Jahre% == 4 (
    ECHO Gueltigkeit auf 40 Jahre festgelegt.
    SET "build-ca.bat=C:\Program Files\OpenVPN\easy-rsa\build-ca.bat"  
    SET "suchen=3650"  
    SET "ersetzen_durch=14600"  
) ELSE (
IF %Jahre% == 5 (
    ECHO Gueltigkeit auf 50 Jahre festgelegt.
    SET "build-ca.bat=C:\Program Files\OpenVPN\easy-rsa\build-ca.bat"  
    SET "suchen=3650"  
    SET "ersetzen_durch=18250"  
) ELSE (
IF %Jahre% GTR 5 (
    goto start
    ECHO Ungueltige Eingabe.
IF %Jahre% LSS 1 (
    goto start
    ECHO Ungueltige Eingabe.
)
)
)
)
)
)
Ich kann in der CMD zwar eine Auswahl treffen und ich bekomme das entsprechende ECHO dazu, an den Dateien ändert sich jedoch gar nichts.

Schritt 1: Hier, was sie (grob übersetzt) tun soll:

Gültigkeit festlegen:

bei Eingabe x (1/2/3/4/5), ersetze entsprechende Gültigkeit (Textzeile: (standardmäßig) -days 3650) auf anzahl Tage: xxxxx (3650/7300/10950/14600/18250) in folgenden Dateien:
build-ca.bat
build-key.bat
build-key-pass.bat
build-key-pkcs12.bat
build-key-server.bat.

Hier noch ein weiterer Versuch, etwas ausladender aber leider auch komplizierter für mich:
(CMD Ausgabe unten)
@echo off
set home=C:\Program Files\OpenVPN\easy-rsa
cd %home%
echo %cd%
:start
SETLOCAL enabledelayedexpansion
@echo Geben Sie die Gueltigkeit des Zertifikats an:
@echo [1] = 10 Jahre; [2] = 20 Jahre; [3] = 30 Jahre; [4] = 40 Jahre; [5] = 50 Jahre
set /p validity=Eingabe: 

if %validity%==1 (
   echo Gueltigkeit auf 10 Jahre festgelegt.
   set gueltigkeit=3650
)
if %validity%==2 (
    echo Gueltigkeit auf 20 Jahre festgelegt.
    set gueltigkeit=7300
)
if %validity%==3 (
    echo Gueltigkeit auf 30 Jahre festgelegt.
    set gueltigkeit=10950
)
if %validity%==4 (
    echo Gueltigkeit auf 40 Jahre festgelegt.
    set gueltigkeit=14600
)
if %validity%==5 (
   echo echo Gueltigkeit auf 50 Jahre festgelegt.
   set gueltigkeit=18250
)
if %validity% GTR 5 (
   echo Ungueltige Eingabe.
   goto start
)
if %validity% LSS 1 (
   echo Ungueltige Eingabe.
   goto start
)
PAUSE
@echo off
goto :if

:if %gueltigkeit% (
  set files=build-ca
  set files[1]=build-key
  set files[2]=build-key-pass
  set files[3]=build-key-pkcs12
  set files[4]=build-key-server
  
  set "x=0"  

  :SymLoop
  if defined files[%x%] (
    @echo off
    setlocal EnableExtensions EnableDelayedExpansion
    set "INTEXTFILE=%%files[%x%].bat"  
    set "OUTTEXTFILE=%%files[%x%]_temp.bat"  
    set "REPLACETEXT=3650"  

    findstr /m "-days 3650" %INTEXTFILE%  
    if %errorlevel%==0 (
      set bisherigeGueltigkeit=3650
    )
    findstr /m "-days 7300" %INTEXTFILE%  
    if %errorlevel%==0 (
      set bisherigeGueltigkeit=7300
    )
    findstr /m "-days 10950" %INTEXTFILE%  
    if %errorlevel%==0 (
      set bisherigeGueltigkeit=10950
    )
    findstr /m "-days 14600" %INTEXTFILE%  
    if %errorlevel%==0 (
      set bisherigeGueltigkeit=14600
    )
    findstr /m "-days 18250" %INTEXTFILE%  
    if %errorlevel%==0 (
      set bisherigeGueltigkeit=18250
    )

  set /a "x+=1"  

    set "SEARCHTEXT=%bisherigeGueltigkeit%"  
    set "REPLACETEXT=%gueltigkeit%"  
    set "modified=!%SEARCHTEXT%=%REPLACETEXT%!"  
      echo !modified!>>"%OUTTEXTFILE%"  
    )

    del "%INTEXTFILE%"  
    rename "%OUTTEXTFILE%" "%INTEXTFILE%"  

    goto :SymLoop
  ) else (
    echo "Bitte treffen Sie eine gültige Auswahl!"  
    PAUSE
    goto :Choose
  )
)

Das war zwar bloß der Anfang & ich werde eure Hilfe sicher nochmal benötigen aber alles Schritt für Schritt..

Danke im Voraus!

batch error (2)

Content-Key: 1128881978

Url: https://administrator.de/contentid/1128881978

Printed on: April 29, 2024 at 04:04 o'clock

Member: aqui
aqui Aug 06, 2021 at 09:45:28 (UTC)
Goto Top
Hilfreich für die Community wäre gewesen in der Überschrift darauf hinzuweisen das es um OpenVPN geht.
Zertifikate für Wireguard oder IPsec erstellt das o.a. Script nämlich nicht. face-sad
P.S.:
Es gibt ja noch den „Bearbeiten“ Button. face-wink
Member: NordicMike
NordicMike Aug 06, 2021 updated at 09:48:59 (UTC)
Goto Top
Du suchst nach Werten in einer Datei und ersetzt sie durch neue Werte.
Anstatt die Textdatei (oder .bat Datei) zu modifizieren würde ich die Ergebnisse der Fragen in eine Variable schreiben und dann die Tools mit den Variablen als Schalter aufrufen.

Also statt:
openssl req -days 3650 ...

solltest du dann direkt unten den Fragen einfach

openssl req -days $days ...

ausführen.
Member: Shiva1990
Shiva1990 Aug 06, 2021 at 09:53:43 (UTC)
Goto Top
Zitat von @aqui:

Hilfreich für die Community wäre gewesen in der Überschrift darauf hinzuweisen das es um OpenVPN geht.
Zertifikate für Wireguard oder IPsec erstellt das o.a. Script nämlich nicht. face-sad
P.S.:
Es gibt ja noch den „Bearbeiten“ Button. face-wink

Entschuldigung, wird geändert ^^'
Member: Shiva1990
Shiva1990 Aug 06, 2021 at 10:13:19 (UTC)
Goto Top
Zitat von @NordicMike:

Du suchst nach Werten in einer Datei und ersetzt sie durch neue Werte.
Anstatt die Textdatei (oder .bat Datei) zu modifizieren würde ich die Ergebnisse der Fragen in eine Variable schreiben und dann die Tools mit den Variablen als Schalter aufrufen.

Also statt:
openssl req -days 3650 ...

solltest du dann direkt unten den Fragen einfach

openssl req -days $days ...

ausführen.

In meinem Code steht nichts von openssl, kann dir daher nicht ganz folgen.
Member: SlainteMhath
SlainteMhath Aug 06, 2021 at 10:17:21 (UTC)
Goto Top
Moin,

die Gültigkeitsdauer wird nicht in den .bat's festgelegt, sondern per Umgebungsvariable in der "vars" Datei. Wenn du dir also die Umgebungsvariable aus der vars raussuchst, kannst du die einfach per SET auf die gewünschte Tagesanzahl setzen und die .bat's aufrufen

lg,
Slainte
Member: SlainteMhath
SlainteMhath Aug 06, 2021 at 10:18:12 (UTC)
Goto Top
In meinem Code steht nichts von openssl, kann dir daher nicht ganz folgen.
easy-rsa ist ein wrapper für pkitool bzw openssl face-smile
Member: miniversum
miniversum Aug 06, 2021 at 10:28:11 (UTC)
Goto Top
Hallo,

also in der ersten Batch setzt du ja nur die "suchen" und die "ersetzen_durch" variable. Aber ein tatsächliches suchen und ersetzen sehe ich hier nicht.

Grundsätzlich kannst du ja die Anzahl an Tagen, wenn er in diesen 5 Batches die aufgerufen werden sollen, als Parameter mit übergeben. Dann musst du nicht erst was suchen und ersetzen sondern gibst die Dauer direkt einfach mit.
z.B.
Aufruf:
build-ca.bat 7300
und in der build-ca.bat dann so verwenden
set "dauer=%~1"

Das funktioniert natürlich entsprechen in allen 5 Batches.

Gruß
...
Member: TK1987
TK1987 Aug 06, 2021 updated at 17:01:40 (UTC)
Goto Top
Moin,

die Gültigkeitsabfrage würde ich mit Powershell machen - weil weniger Code, nicht so fehleranfällig und die Anzahl an Tagen kann exakt aus der eingegebenen Jahresanzahl errechnet werden.

Wie @miniversum schon gesagt hat, sollte man dann nicht die Skripte per suchen und ersetzen abändern, sondern die Tage einfach als Argument an die jeweiligen Batchskripte übergeben.
# Quellordner, indem die Batch-Skripte liegen
$Source = "C:\Program Files\OpenVPN\easy-rsa"  

# Maximale Gültigkeit in Jahren
$Max = 50

# Abfrage der Gültigkeit
$Years = Read-Host "Gültigkeit in Jahren"  

# Falls Eingabe falsch, frage so lange erneut, bis eine gültige Zahl eingegeben wurde
while (1..$Max -NotContains $Years){
  write-host -ForegroundColor 'red' "Keine gültige Zahl zwischen 1 und $Max eingegeben. "  
  $Years = Read-Host "Gültigkeit in Jahren"  
}

# Anzahl der Tage ermitteln
[int]$Tage = (New-TimeSpan -End (Get-Date).AddYears($Years)).TotalDays
write-host "Gültigkeit auf $Years Jahre ($Tage Tage) festgelegt. "  

# Die Anzahl an Tagen an jede Batch im Quellordner übergeben
Foreach ($File in Get-ChildItem -File -Path "$Source\*.bat") { &$File.Fullname $Tage }  

Gruß Thomas
Member: Shiva1990
Shiva1990 Aug 13, 2021 at 07:06:39 (UTC)
Goto Top
Hallo & danke an allen für die hilfreichen Denkanstösse!

Die Gültigkeit greife ich nun über die openssl config ab & somit brauch ich mich nicht um das Ändern der 5 anderen Dateien zu kümmern (viiieel angenehmer face-smile)

ABER:
1. Ich bin ein bisschen zwischen Batch & Powershell hin und her gerissen.
2. Scheinbar gib es einfache Lösungen um Zertifikate per Powershell zu erstellen, da bleibt mir nur die Frage, wie ich das in diesem Fall mit der Gültigkeit der Zertifikate anstelle.
3. bzw. nutze ich ja die easy-rsa "Methode", nur hab ich keine Ahnung, ob ich stattdessen vielleicht ein Powershell Script nutzen (erstellen) kann, was mit der openssl config (bzw den 5 Dateien danach) arbeitet. Im Netz hab ich nichts im Zusammenhang bezüglich Powershell und easy-rsa gefunden, was mir geholfen hätte.

1: Was würdet ihr mir mehr raten?
2: Jemand eine Idee?
3: Ich hoffe ich habe mich halbwegs verständlich ausgedrückt, bin ja relativ neu im Game & bin mir manchmal auch noch nicht sicher, wie ich die Fragen richtig formuliere.

Mein Entweder/oder:

Entweder ich versuche alles weiter per Batch mit meinem easy-rsa-Kram, den ich mittlerweile gewohnt bin zu automatisieren...
oder ich setze komplett auf die Powershell, weiß aber nicht, wie sich das mit easy-rsa verhält bzw muss ich herausfinden, wie ich Zertifikate per Powershell so erstelle, dass ich da ebenfalls an der Gültigkeit schrauben kann, das stellt mich nämlich vor der nächsten Herausforderung, da mir diese Abfolge völlig unbekannt ist.

Für easy-rsa hab ich mir überlegt, die Befehle, die normalerweise in die CMD eingetippt werden, als eben solche über die Powershell/CMD auszugeben und somit starten zu lassen. Das klappt zwar bei der init.config.bat, vars.bat & der clean-all.bat, nicht aber bei build-ca.bat & gerade diese ist ja für das Erstellen der Keys verantwortlich.

Ich hoffe, ihr versteht mein Dilemma & könnt mich erneut in die richtige Richtung weisen :D