SSL-VPN Inline-Zertifikate - Zertifikate und Keys als Text in Konfig

Allgemeine Fragen zu Problemen. Keine Fehlerberichte oder Feature-Anfragen

Moderator: Securepoint

Antworten
Franz
Beiträge: 387
Registriert: Sa 02.04.2011, 17:52
Wohnort: Westerwald
Kontaktdaten:

SSL-VPN Inline-Zertifikate - Zertifikate und Keys als Text in Konfig

Beitrag von Franz »

Seit einiger Zeit ist es möglich, die benötigten Keys und Zertifikate direkt als Text in der Konfigurationsdatei (.ovpn) abzulegen, statt sie separat anzugeben und mitzuliefern.
Diese Inline-Zertifikate vereinfachen insbesondere den Profilimport auf Android Geräten.
 
Hier ein kleines Skript für Windows (mit PowerShell 5), um die von den UTMs bereitgestellten Konfigurationsdateien in dieses Format zu konvertieren.
Ein Pendant für die bash findet sich hier:
viewtopic.php?f=30&t=6804

Konvert.bat

Code: Alles auswählen

@echo off
echo.
:: Version 0.02 / 2017-02-28
:: Diese Batch dient nur dazu, das Konvertierungs-Skript mit der 
:: per Drag & Drop übergebenen Datei als Parameter aufrufen
:: (es kann immer nur eine Datei übergeben werden).
::
:: Damit der Trick mit dem "%~dpn0" auch funktioniert, muss das PS-Skript
:: vor der Dateiendung den gleichen Namen wie die Batch haben.
PowerShell.exe -ExecutionPolicy Bypass -Command "& '%~dpn0.ps1' %1"
exit
Konvert.sh1

Code: Alles auswählen

#     Version 0.03 / 2017-02-28
#
#    1.  Beide Dateien (Konvert.bat und Konvert.ps1)
#        in einem Ordner an beliebiger Stelle auf einem
#        lokalen Laufwerk ablegen
#    
#    2.  Per Drag & Drop die "Securepoint-SSL-VPN-Config.zip"
#        auf die Konvert.bat ziehen. 
#        WICHTIG: Der Benutzer muss Schreibrechte für den 
#        Ordner mit der Zip-Datei besitzen, weil dort der
#        Ordner "_KONVERTIERT" erstellt wird, um dort die 
#        konvertierte Inline-OVPN-Datei als Zip abzulegen.
#
function global:VpnKonfKonvert {
    param ([System.String]$InputFile)
    
# Eine temporäre Datei generieren lassen, diese wieder löschen,  
# dann den Dateinamen für das Erzeugen eines Ordners weiterverwenden
$TMPDIR = New-TemporaryFile | %{ rm $_; mkdir $_ }

# Entpacken der "Securepoint-SSL-VPN-Config.zip"
# ACHTUNG: PowerShell 5.0 erforderlich!
Expand-Archive "$InputFile" $TMPDIR -Force

$zipFile       = "$InputFile"
$zipFilePath  = Split-Path "$InputFile"
$zipFileName  = Split-Path "$InputFile" -leaf -resolve

$ovpnFile     = Get-ChildItem "$TMPDIR\*.tblk\*.ovpn"
$ovpnFileName = Split-Path "$ovpnFile" -leaf -resolve
$ovpnFilePath = Split-Path "$ovpnFile"

# Key- und Zertifikatangaben in der OVPN-Datei auskommentieren bzw. entfernen
(get-content "$ovpnFile") -Replace '^ca .*', '# ca [inline]' -Replace '^cert .*', '# cert [inline]' -Replace '^key .*', '# key [inline]' | set-content "$ovpnFile" 

# Key- und Zertifikate als Text in die OVPN-Datei einfuegen
Add-Content "$ovpnFile" "<ca>", (get-content "$ovpnFilePath\*-ca.pem"), "</ca>"
Add-Content "$ovpnFile" "<cert>", (get-content "$ovpnFilePath\*-cert.pem"), "</cert>"
Add-Content "$ovpnFile" "<key>", (get-content "$ovpnFilePath\*-cert.key"), "</key>"

# Den Ausgabeordner erzeugen (falls nicht schon vorhanden)
if ((Test-Path $zipFilePath\_KONVERTIERT) -ne $True) {New-Item $zipFilePath\_KONVERTIERT -type directory}

# Konvertierte Datei als Zip speichern
Compress-Archive "$ovpnFile" "$zipFilePath\_KONVERTIERT\Konv-$zipFileName" -Force

# Den temporären Ordner samt Inhalt löschen
Remove-Item "$TMPDIR" -Recurse -Force #-WhatIf
}

# Nun der Aufruf der Funktion mit der Zip-Datei als Parameter
VpnKonfKonvert -InputFile $args[0]

Franz
Beiträge: 387
Registriert: Sa 02.04.2011, 17:52
Wohnort: Westerwald
Kontaktdaten:

Beitrag von Franz »

Skript in aktueller Version.
 
Änderungen:
- Bisschen aufgeräumt
- TMP-Ordner wird nun im Quellordner der VPN-Config erstellt
- Fehler bei der Übergabe von Pfaden mit Leerzeichen in der bat-Datei behoben
- Anstelle der Auskommentierung der Zertifikat- bzw. Key-Namen werden die Einträge nun durch "ca [inline]", "cert [inline]" und "key [inline]" ersetzt (bei den Securepoint SSL-VPN-Clients konnte es sonst zu Fehlern kommen, wenn die importierte Config die erste importierte Config war)

Konverter.bat

Code: Alles auswählen

@echo off
echo.
:: Version 0.03 / 2017-03-03
:: Diese Batch dient nur dazu, das Konvertierungs-Skript mit der 
:: per Drag & Drop übergebenen Datei als Parameter aufrufen
:: (es kann immer nur eine Datei übergeben werden).
::
:: Damit der Trick mit dem "%~dpn0" auch funktioniert, muss das PS-Skript
:: vor der Dateiendung den gleichen Namen wie die Batch haben.
PowerShell.exe -ExecutionPolicy Bypass -Command "& '%~dpn0.ps1' "%1""
exit
Konverter.ps1

Code: Alles auswählen

#     Version 0.09 / 2017-03-15 
#
#    1.  Beide Dateien (Konvert.bat und Konvert.ps1)
#        in einem Ordner an beliebiger Stelle auf einem
#        lokalen Laufwerk ablegen
#    
#    2.  Per Drag & Drop die "Securepoint-SSL-VPN-Config.zip"
#        auf die Konvert.bat ziehen. 
#        WICHTIG: Der Benutzer muss Schreibrechte für den 
#        Ordner mit der Zip-Datei besitzen, weil dort der
#        Ordner "_KONV" erstellt wird, um dort die 
#        konvertierte Inline-OVPN-Datei (unified format)
#        als Zip abzulegen.
#
function global:VpnKonfKonvert {
    param (
        [Parameter(Mandatory = $true,
            HelpMessage = 'Die zu konvertierende Datei angeben')]
        [ValidateNotNullOrEmpty()]
        [Alias('Input')]
        [System.String]$InputFile
    )

$zipFile       = "$InputFile"
$zipFilePath  = Split-Path "$InputFile" -resolve
$zipFileName  = Split-Path "$InputFile" -leaf -resolve
    
# Temporären Ordner fürs entpacken des Zip-Files erzeugen  
$TMPDIR = New-Item -Path "$zipFilePath" -Name "TMP" -ItemType directory


# Entpacken der "Securepoint-SSL-VPN-Config.zip"
# ACHTUNG: PowerShell 5.0 erforderlich!
Expand-Archive "$InputFile" "$TMPDIR" -Force

$ovpnFile     = Get-ChildItem "$TMPDIR\*.tblk\*.ovpn"
$ovpnFileName = Split-Path "$ovpnFile" -leaf -resolve
$ovpnFilePath = Split-Path "$ovpnFile" -resolve

# Key- und Zertifikatangaben in der OVPN-Datei auskommentieren bzw. entfernen
(get-content "$ovpnFile") -Replace '^ca .*', 'ca [inline]' -Replace '^cert .*', 'cert [inline]' -Replace '^key .*', 'key [inline]' | set-content "$ovpnFile" 

# Key- und Zertifikate als Text in die OVPN-Datei einfuegen
# erste Zeile auskommentiert, weil UTM V11.6.12 z.Zt. noch kein "tls-auth" unterstuetzt
#Add-Content "$ovpnFile" "key-direction 1", "<tls-auth>", (get-content "$ovpnFilePath\*-ta.key"), "</tls-auth>"
Add-Content "$ovpnFile" "<ca>", (get-content "$ovpnFilePath\*-ca.pem"), "</ca>"
Add-Content "$ovpnFile" "<cert>", (get-content "$ovpnFilePath\*-cert.pem"), "</cert>"
Add-Content "$ovpnFile" "<key>", (get-content "$ovpnFilePath\*-cert.key"), "</key>"

# Namen für das ovpn-File neu aufbauen
$newOvpnFileName = $zipFileName -Replace '^Securepoint-SSL-VPN-Config-','' -Replace '.zip$', '.ovpn'

rename-item -path $ovpnFile -newname $ovpnFilePath\$newOvpnFileName

# Namen für das Zip-File neu aufbauen
$DateTime = Get-Date -Format yyyy-MM-dd_hh.mm
$newZipFileName = $zipFileName -Replace '^Securepoint-SSL-','' -Replace '.zip$', " ($DateTime).zip"

# Den Ausgabeordner erzeugen (falls nicht schon vorhanden)
if ((Test-Path "$zipFilePath\_KONV") -ne $True) {New-Item "$zipFilePath\_KONV" -type directory}
# Konvertierte Datei als Zip speichern
Compress-Archive "$ovpnFilePath\$newOvpnFileName" "$zipFilePath\_KONV\$newZipFileName" -Force

# Den temporären Ordner samt Inhalt löschen
Remove-Item "$TMPDIR" -Recurse -Force #-WhatIf
}

# Nun der Aufruf der Funktion mit der Zip-Datei als Parameter
VpnKonfKonvert -InputFile $args[0]

merlin
Beiträge: 263
Registriert: So 01.07.2007, 12:34
Wohnort: Erlangen

Beitrag von merlin »

Hallo Franz!

Vielen Dank dafür!
Ich benutze es sehr regelmäßig und bin jedes Mal wieder froh darüber ;)
Einziges kleines "Problem" damit: 
Bei mir muss ich die drei folgenden Zeilen immer noch entfernen, sonst schluckt es der OpenVPN-Client nicht: 
ca [inline]
cert [inline]
key [inline]

Jedenfalls 1000 Dank dafür!

Gruß
Rolf

Franz
Beiträge: 387
Registriert: Sa 02.04.2011, 17:52
Wohnort: Westerwald
Kontaktdaten:

Beitrag von Franz »

Hallo Rolf!

Die Zeilen mit "...[inline]" hatte ich - wie oben geschrieben - für die Securepoint SSL-VPN-Clients eingefügt. Wenn das stören sollte, dann einfach diese Zeile in der ps1-Datei abändern:

Code: Alles auswählen

(get-content "$ovpnFile") -Replace '^ca .*', '# ca [inline]' -Replace '^cert .*', '# cert [inline]' -Replace '^key .*', '# key [inline]' | set-content "$ovpnFile"
 
Gruß

Franz

merlin
Beiträge: 263
Registriert: So 01.07.2007, 12:34
Wohnort: Erlangen

Beitrag von merlin »

Funktioniert!

Vielen Dank!

Franz
Beiträge: 387
Registriert: Sa 02.04.2011, 17:52
Wohnort: Westerwald
Kontaktdaten:

Beitrag von Franz »

Nochmal eine aktualisierte Version:

Konverter.bat

Code: Alles auswählen

@echo off
:: Version 0.05 / 2017-05-20
:: Diese Batch dient nur dazu, das Konvertierungs-Skript mit den 
:: per Drag & Drop übergebenen Dateien als Parameter aufzurufen
::
:: Damit der Trick mit dem "%~dpn0" auch funktioniert, muss das PS-Skript
:: vor der Dateiendung den gleichen Namen wie die Batch haben.
::
:: Erweiterung:
:: Schleife fürs Abarbeiten mehrerer per Drag and Drop übergebener Dateien
:: (Es kann jedoch nur eine BEGRENZTE ZAHL an Dateien per Drag and Drop
:: übergeben werden. Das ist Abhängig von der Pfadlänge der übergebenen Dateien)
::
:: Statt %1 enthält hier der "Schleifenzähler" %%A die Parameter für den
:: Aufruf des PS-Skripts
:: 
FOR %%A IN (%*) DO (
    PowerShell.exe -ExecutionPolicy Bypass -Command "& '%~dpn0.ps1' '%%A'"
)
:: Auf Anregung meines Kollegen Bastian gibt es nun auch die Option,
:: die BAT-Datei per Doppelklick zu starten, um ein Fenster zu
:: öffnen, dem die zu konvertierenden Dateien per Drag und Drop 
:: übergeben werden können (das aufrufende Konsolenfenster kann
:: optional ausgeblendet werden)
::
:: Mit "-ExecutionPolicy Bypass" wird für die Ausführung des PS-Skripts
:: die Sicherheitsrichtlinie temporär ausgehebelt
IF "%1"=="" PowerShell.exe -ExecutionPolicy Bypass -Command "& '%~dpn0.ps1' 'oeffneFenster'"
::
exit

Konverter.ps1

Code: Alles auswählen

#     Version 0.14 / 2017-05-20 
#
#    1.  Beide Dateien (Konvert.bat und Konvert.ps1)
#        in einem Ordner an beliebiger Stelle auf einem
#        lokalen Laufwerk ablegen
#    
#    2.  Per Drag & Drop die "Securepoint-SSL-VPN-Config.zip"
#        auf die Konvert.bat ziehen. 
#        WICHTIG: Der Benutzer muss Schreibrechte für den 
#        Ordner mit der Zip-Datei besitzen, weil dort der
#        Ordner "_KONV" erstellt wird, um dort die 
#        konvertierte Inline-OVPN-Datei (unified format)
#        als Zip abzulegen
#
#     3.  Optional kann die Batch ohne Parameter per Doppelklick
#         geöffnet werden, dann öffnet sich ein Fenster, in das
#         die zu konvertierenden Dateien per Drag and Drop gezogen
#         werden können (ist bei der Konvertierung mehrer Dateien
#         vielleicht etwas einfacher)
#

# Importe fürs Verstecken der Konsole
Add-Type -Name Window -Namespace Console -MemberDefinition '
[DllImport("Kernel32.dll")]
public static extern IntPtr GetConsoleWindow();
 
[DllImport("user32.dll")]
public static extern bool ShowWindow(IntPtr hWnd, Int32 nCmdShow);
'

# Soll die Konsole wirklich versteckt werden (0 oder 1)? Dann werden
# jedoch im Fehlerfall keine Fehlermeldungen ausgegeben
$KonsoleVerstecken = 0

# Das ist die Hilfsfunktion zum Verstecken der Konsole
function Verstecke-Konsole {
    $consolePtr = [Console.Window]::GetConsoleWindow()
  #0 hide
 [Console.Window]::ShowWindow($consolePtr, 0)
}
function global:VpnKonfKonvert {
    param (
        [Parameter(Mandatory = $true,
            HelpMessage = 'Die zu konvertierende Datei angeben')]
        [ValidateNotNullOrEmpty()]
        [Alias('Input')]
        [System.String]$InputFile
    )

$zipFile       = "$InputFile"
$zipFilePath  = Split-Path "$InputFile" -resolve
$zipFileName  = Split-Path "$InputFile" -leaf -resolve
    
# Temporären Ordner fürs entpacken des Zip-Files erzeugen  
$TMPDIR = New-Item -Path "$zipFilePath" -Name "TMP" -ItemType directory


# Entpacken der "Securepoint-SSL-VPN-Config.zip"
# ACHTUNG: PowerShell 5.0 erforderlich!
Expand-Archive "$InputFile" "$TMPDIR" -Force

$ovpnFile     = Get-ChildItem "$TMPDIR\*.tblk\*.ovpn"
$ovpnFileName = Split-Path "$ovpnFile" -leaf -resolve
$ovpnFilePath = Split-Path "$ovpnFile" -resolve

# Key- und Zertifikatangaben in der OVPN-Datei auskommentieren bzw. entfernen
(get-content "$ovpnFile") -Replace '^ca .*', 'ca [inline]' -Replace '^cert .*', 'cert [inline]' -Replace '^key .*', 'key [inline]' | set-content "$ovpnFile" 

# Key- und Zertifikate als Text in die OVPN-Datei einfuegen
# erste Zeile auskommentiert, weil UTM V11.6.12 z.Zt. noch kein "tls-auth" unterstuetzt
#Add-Content "$ovpnFile" "key-direction 1", "<tls-auth>", (get-content "$ovpnFilePath\*-ta.key"), "</tls-auth>"
Add-Content "$ovpnFile" "<ca>", (get-content "$ovpnFilePath\*-ca.pem"), "</ca>"
Add-Content "$ovpnFile" "<cert>", (get-content "$ovpnFilePath\*-cert.pem"), "</cert>"
Add-Content "$ovpnFile" "<key>", (get-content "$ovpnFilePath\*-cert.key"), "</key>"

# Namen für das ovpn-File neu aufbauen
$newOvpnFileName = $zipFileName -Replace '^Securepoint-SSL-VPN-Config-','' -Replace '.zip$', '.ovpn'

rename-item -path $ovpnFile -newname $ovpnFilePath\$newOvpnFileName

# Namen für das Zip-File neu aufbauen
$DateTime = Get-Date -Format yyyy-MM-dd_hh.mm
$newZipFileName = $zipFileName -Replace '^Securepoint-SSL-','' -Replace '.zip$', " ($DateTime).zip"

# Den Ausgabeordner erzeugen (falls nicht schon vorhanden)
if ((Test-Path "$zipFilePath\_KONV") -ne $True) {New-Item "$zipFilePath\_KONV" -type directory}
# Konvertierte Datei als Zip speichern
Compress-Archive "$ovpnFilePath\$newOvpnFileName" "$zipFilePath\_KONV\$newZipFileName" -Force

# Den temporären Ordner samt Inhalt löschen
Remove-Item "$TMPDIR" -Recurse -Force #-WhatIf
}

# Drag and Drop-Fenster öffnen und übergebene Dateien konvertieren
Function DragDropFenster() {
    [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
    $form = New-Object Windows.Forms.Form
    $form.text = "Securepoint OVPN Konverter"
    $form.Size = New-Object Drawing.Size @(640,200)
    $listBox = New-Object Windows.Forms.ListBox
    $listBox.Dock = [System.Windows.Forms.DockStyle]::Fill
    $listBox.Items.Add("Die VPN-Konfig-Dateien per Drag and Drop")
    $listBox.Items.Add("in dieses Ferster ziehen!")
    $handler = {
        if ($_.Data.GetDataPresent([Windows.Forms.DataFormats]::FileDrop)) {
            foreach ($filename in $_.Data.GetData([Windows.Forms.DataFormats]::FileDrop)) {
                        if(([System.IO.Path]::GetExtension($filename).ToUpper() -eq ".ZIP"))  {
                            # Drop-Ereignis
                            $listBox.Items.Add("Config: "+$filename)
                            VpnKonfKonvert -InputFile $filename
                            $listBox.Items.Add(" -> Konvertiert")
                            # Schließe Fenster
                            #[System.Windows.Forms.Application]::Exit($null)
                            
                        }
                        else {
                        $listBox.Items.Add("Config: "+$filename)
                        $listBox.Items.Add("Das ist keine Zip-Datei!")
                        }
            }
        }
    }

    $form.AllowDrop = $true
    $form.Add_DragEnter($handler)
    $form.Controls.Add($listBox)
    $form.ShowDialog()
}


if ($args[0] -ne "oeffneFenster") {
    # Nun der Aufruf der Funktion mit der Zip-Datei als Parameter
    VpnKonfKonvert -InputFile $args[0]
}
else {
    if ($KonsoleVerstecken){
        Verstecke-Konsole | Out-Null
    }
    # oder Drag and Drop-Fenster
    DragDropFenster | Out-Null
}

Antworten