Astaro ASG as OpenVPN Access Server client

Just about four weeks ago I posted about the resurrection of the .ovpn to .apc converter script. In the meantime Alois told me in the comments that while this was nice it didn’t work for current versions of the OpenVPN Access Server and the .ovpn files it creates.

Well, since there’s been nothing much else to do I did some more work on the script and I can now happily say that it now also converts the new .ovpn format to an .apc the Astaro can understand. Unfortunately, there’s a little catch: the OpenVPN Access Server relies on ‘tls-auth’ for client connections and the Astaro neither knows of that concept not provides a method to import the needed key file. So I had to do some creative manipulation to make the Astaro do my bidding to include the necessary config statements. In addition, you will need to manually copy the key file to the Astaro to make everything work as expected. To make things as easy as possible, the script will tell you what to do.

If you’re interested, check out the latest version of on Gitorious. If it works for you, let me know. If it doesn’t, let me know, too.

32 thoughts on “Astaro ASG as OpenVPN Access Server client

  1. inx

    I used your script and ran into a few errors, so I modified the code a little bit.

    1. I needed the tlsremote field and some quotations marks. The reason for the quotations where that UTM 9 is converting the file to:

    tls-remote "server
    tls-auth ta.key
    key-direction 1

    This results in an Quotations Error and a connection ist not possible, so I changed it to:

    tls-remote "server"
    tls-auth ta.key
    key-direction "1"

    2. The ovpn file has to be in unix format so I convert it at the beginning.

    3. The user field is requiered so I copied your password dummy code.

  2. inx

    And here is the diff:

    <       echo "/CN=OpenVPN_Server" > ${takey}
    <       echo "tls-auth /etc/${tafile:2}" >> ${takey}
    <       echo "key-direction 1" >> ${takey}
    >       tlsremote=`grep "^tls-remote " ${OvpnFile} | cut -d ' ' -f2 |tr -d '\r\n'`
    >       if [ -z "${tlsremote}" ]; then
    >           echo "/CN=OpenVPN_Server"" > ${takey}
    >       else
    >           echo ${tlsremote}" > ${takey}
    >       fi
    >       echo "tls-auth /etc/${tafile:2}" >> ${takey}
    >       echo -n "key-direction "1" >> ${takey}
    > ##
    > # Convert Dos to Unix
    > ##
    > `tr -d '\r' < ${OvpnFile} > tmp.ovpn`
    > `rm ${OvpnFile}`
    > `mv tmp.ovpn ${OvpnFile}`
    < # Passwort field is required by Astaro but
    < # wrong content doesn't hurt operations
    > # Passwort and User field is required by Astaro
    > # but wrong content doesn't hurt operations
    > if [ -z "${user}" ]; then
    >     user="dummy"
    > fi

    If you need the whole file, just write me.
    Best regards

  3. Stefan Rubner Post author

    How about sending me a merge request on Gitorious? ;)

  4. Daryl Morse

    Hi Stefan,

    I hope you’re in a caring mood today!

    I merged the diffs into the script myself and tried it. For some reason, utm is rejecting the opc file, says “config package is corrupt”. The control codes in the header were different from an opc file generated by utm so I modified the script to generate the same header. It still rejects the script. Not sure what’s wrong, but if you have any suggestions, I’d really appreciate them. I’m going to have to abandon utm if I can’t get it to talk with an openvpn server. I can’t figure out why they won’t fix this. It’s gotta be a trivial thing for them to address. I’ll send you the script with the changes I made.

    Thanks for your help.

  5. Steven Opfermann

    Hi Darly,

    i had the same problem with the script. So i modified the code.
    The changes from Stefan are incorrect, so you can ignore the diff. The Script check if is the ovpn a xml (isxml). Normaly it isn’t a xml.

    Original File:

    Here is the diff:
    (to find under the function “get_ta” in the if-statement “if [ -z “${isxml}” ]; then”

    line 111:
    > echo “${tlsremote}\”” > ${takey}

    line 114:
    > ${takey}
    > echo -n “key-direction \”1” >> ${takey}

    now the apc-file on astaro is correct.

  6. Steven Opfermann

    Hi Darly,

    i had the same problem with the script. So i modified the code.
    The changes from Stefan are incorrect, so you can ignore the diff. The Script check if is the ovpn a xml (isxml). Normaly it isn’t a xml.

    Original File:

    Here is the diff:
    (to find under the function “get_ta” in the if-statement “if [ -z “${isxml}” ]; then”

    line 111:
    < echo "${tlsremote}" > ${takey}
    > echo "${tlsremote}"" > ${takey}

    line 114:  
    < echo "key-direction "1" >> ${takey}
    > echo -n "key-direction "1" >> ${takey}

    now the apc-file on astaro is correct.

  7. Stefan Rubner Post author

    I just had a look at the original code available on Gitorious. The code at line 114 there looks different than the one in your post above. Any chance you made more changes to the file than the ones above? Could you perhaps get a clean copy from Gitorious and do a

    diff -Naur <orginal code dir> <your code dir>

    and send the output? I’d then incorporate your changes into the Gitorious repo.
    Also, from my experience, every *commercial* OpenVPN version outputs its config as XML, that’s why it is included. Please also note that the changes above weren’t made by me ;)

  8. Steven O.

    Hi Stefan,

    sorry i made i mistake in the code. Here is the correct diff:

    ---      2013-07-08 13:47:05.000000000 +0200
    +++  2013-07-08 13:44:59.000000000 +0200
    @@ -108,10 +108,10 @@
                            if [ -z "${tlsremote}" ]; then
                                    echo "/CN=OpenVPN_Server" > ${takey}
    -                               echo "${tlsremote}" > ${takey}
    +                               echo "${tlsremote}"" > ${takey}
                            echo "tls-auth /etc/${tafile:2}" >> ${takey}
    -                       echo "key-direction 1" >> ${takey}
    +                       echo -n "key-direction "1" >> ${takey}
                    # Create file with the ta.key

    Note: Your changes are not wrong, but in my case not the right ones. Thanks for your good work and the support for the script. ;-)

  9. Brendan

    I cant seem to get either version of the script to generate a apc file that will work. while I understand the concept; I seem to be missing the “period out of place” and thus causing a problem.


  10. Sandro

    I merged inx and Steven information together in my script file and everything is working just fine.
    If someone needs it, just drop me an email: smanet at blackhole dot eu dot org.
    Thank you everybody for the great work.
    I’m running Sophos (Astaro) 9.1 home edition plus my vpn now!


  11. Stefan Rubner Post author

    If you could send it to me, I’d male the necessary changes to the files on GitHub.


  12. Sandro

    HI Stefan,
    do I need a git account to do that? Otherwise (and faster) send me an email and I will reply with the new file.

  13. Marcel

    Hallo Stefan,

    ich möchte mit meiner UTM Home eine openvpn Verbindung zum Anbieter “nVPN” herstellen.

    Ich habe “username”, “password” und “ca.crt” bekommen. KEIN “client.key” und “client.crt”.

    Die openvpn config hat folgenden Inhalt:

    dev tun
    proto udp
    remote xxxx.xx 1194
    resolv-retry infinite
    ca nVPN.crt
    verb 3

    Das Skript bleibt bei Zeile 323 stehen – also client.cert.
    Gibt es einen Trick, wie ich die UTM zum Verbinden bewege? Shell Zugriff habe ich und da die UTM nur für den Eigenbedarf ist, habe ich auch kein Problem daran rumzubasteln :).

    Beste Grüße und ein erfolgreiches, gesundes neues Jahr!!

  14. Stefan Rubner Post author

    Hi Marcel,

    die Astaro/Sophos UTM kann nur mit OpenVPN-Gegenstellen Kontakt aufnehmen, wenn dazu ein User-Zertifikat und ein Key verwendet werden. Nur mit Username und Passwort funktioniert auf keinen Fall, da die UTM immer ein Key-basiertes Verfahren verwendet. Die vom Script optional abgefragten Werte für Username und Passwort dienen nur zum Zugriff auf den eben nicht optionalen User-Key, sollte dieser mit einem Passwort geschützt sein.


  15. Marcel

    Hallo Stefan,

    fast hätte ich es vergessen – ich wünsche dir noch ein gesundes und erfolgreiches neues Jahr 2014! :)
    Danke für deine schnelle Antwort. Hab mir das schon gedacht :(
    Weißt du ob es eine Möglichkeit gibt das zu ändern?

    Habe mal die UTM per telnet nach openvpn durchsucht – das Gefundene hat mir aber leider nicht weitergeholfen. Habe auch mal eine Testvpn eingerichtet und diese gesucht – leider erfolglos.

    Vorab vielen Dank!

  16. Stefan Rubner Post author

    Hi Marcel,

    Auch dir ein Gutes Neues! Leider muss ich dir das neue Jahr auch gleich versauen: Es gibt keine Möglichkeit, das zu ändern – zumindest keine einfache. Die UTM benutzt das .apc-File lediglich dazu, die Werte für die Verbindung in die interne Postgres-Datenbank einzulesen. Aus dieser Datenbank erzeugt die UTM dann on-the-fly (also beim Aktivieren des jeweiligen Tunnels) die eigentlichen OpenVPN-Configs mit denen dann die einzelnen Tunnel innerhalb einer eigenen Chroot-Umgebung gestartet werden.

    Natürlich kannst du jetzt per Root-Login direkt auf der UTM den jeweiligen Tunnel im Chroot manuell stoppen, die Config entsprechend anpassen, so dass sie ohne Key und nur mit Username/Passwort funktioniert und dann den Tunnel in der Chroot wieder anschmeissen. Du ahnst aber sicher schon, wo das Problem ist: Wenn der Tunnel mal ausfällt, die UTM neu gestartet wird oder, oder, oder – dann geht das ganze Spiel wieder von vorne los, da die UTM dann wieder die gespeicherten Werte aus der Datenbank holt.

    Jetzt könnte man natürlich auf die Idee kommen, die Daten direkt in der Datenbank zu ändern. Ich glaub’ das hab ich sogar mal probiert – es aber nie geschafft, dass dann daraus auch wieder eine lauffähige Config für das OpenVPN in der Chroot-Umgeung erzeugt wird. Das liegt schlicht daran, dass die UTM halt eben ausschließlich auf die Arbeit mit Key und Zertifikat ausgelegt ist und dementsprechend die normalen Config-Statements für User/Passwort gar nicht kennt und daher auch nicht in die Configs schreibt.

    Oder in kurz: geht halt ned :/ Und leider bieten nur die wenigsten (genauer: kein mir bekannter) Public-(Open)VPN-Anbieter die Variante mit Key und Zertifikat an, weil das zum einen für den Anbieter einen ziemlicher Mehraufwand und natürlich auch Zusatzkosten bedeutet und zum anderen, weil es die meisten Anwender schlicht überfordert.


  17. Marcel

    Hallo Stefan,

    ganz im Gegenteil, du hast mir den richtigen Tipp gegeben!!!
    Es funktioniert!!! :-)

    1. Ich habe mit Hilfe deines Scripts eine pac erstellt mit:
    – richtigem Username
    – richtigem Password
    – richtigem CA.cert
    – rest der nVPN openvpn.config
    – fake user.key
    – fake user.cert

    2. Habe ich mich mit telnet eingeloggt.
    3. Die SSL-VPN (client) gestartet, damit die “REF_SslClixxxxx” erstellt werden (DANKE!!).
    4. Unter “/var/chroot-openvpn/etc/openvpn/client/REF_SslClixxxxx/” den Datei-Inhalt angeschaut.
    5. Die SSL-VPN (client) gestoppt
    6. Unter “/var/chroot-openvpn/etc/openvpn/client/” die “config-default” entsprechend abgeändert:

    dev tun

    proto [<PROTOCOL>]
    ;tls-remote "[<SERVER_DN>]"

    resolv-retry infinite
    mark 4458

    ca /etc/openvpn/client/[<NAME>]/ca_cert
    ;cert /etc/openvpn/client/[<NAME>]/certificate
    ;key /etc/openvpn/client/[<NAME>]/key
    auth-user-pass /etc/openvpn/client/[<NAME>]/credentials
    auth-retry nointeract


    ;cipher [<CIPHER>]
    ;auth [<AUTH>]
    comp-lzo [<DISABLE_COMP>]

    verb [<DEBUG>]
    reneg-sec 0
    keepalive 10 60
    remap-usr1 SIGHUP


    management [<SOCKET_FILE>] unix
    management-client-user root
    management-client-group root

    plugin /usr/lib/openvpn/plugins/ [<NAME>]

    7. Die SSL-VPN (client) wieder gestartet – und siehe da… Es klappt!

    Nun habe ich glaube ich noch ein kleines NAT Problem. Nach dem Verbindungsaufbau habe ich kein Internet mehr. Von der UTM aus kann ich jedoch problemlos durch die VPN pingen.


  18. Marcel

    PS. Klappt auch nach einem Neustart der UTM – die default.conf bleibt erhalten.

    Da ich keine anderen SSL-VPNs habe ist das kein Problem für mich.

  19. Stefan Rubner Post author

    Ok, wenn du natürlich gleich den ganz großen Hammer auspackst :-D Musst du halt nur aufpassen bei Firmware-Updates der UTM. Wegen der Default-Route ist das so ‘ne Sache. Die UTM routet nicht automatisch die lokalen Netze über das VPN. Stattdessen erwartet sie, dass ihr die Gegenstelle “sagt”, welche Netze “safe for Routing” sind. Auf der OpenVPN-Gegenstelle (also dem VPN-Server aus Sicht der UTM) mache ich das immer indem ich über CCA Routen pushe. Zusätzlich braucht die UTM Anweisungen der Form “setenv-safe” für die “sicheren” lokalen und entfernten Netze. Das sieht dann z.B. so aus:

    push "route"
    push "setenv-safe remote_network_1"
    push "setenv-safe local_network_1"
  20. Marcel

    Ist zwar “OffTopic” aber ich habe mein Problem letztendlich nicht durch ein SSL-VPN gelöst sondern mit den Parent-Proxie Einstellungen der UTM gearbeitet, die nVPN anbietet (Squid, Socks5). Ab der v9.2 ist ja auch endlich das lästige “Scan HTTPS (SSL) Traffic” Problem für mich gelöst.

    Nochmal vielen Dank für die Hilfe!

  21. John

    Hi Stefan!
    I have the same problem like Marcel, after connection to remote OpenVPN server I can’t open domain, just direct IP addresses to the location. In the connection session, I can see some errors in my log, so I would be grateful if you can help me. From log:

    2014:04:30-00:35:22 firewall openvpn[10267]: Options error: option 'explicit-exit-notify' cannot be used in this context ([PUSH-OPTIONS])

    2014:04:30-00:35:22 firewall openvpn[10267]: Options error: Unrecognized option or missing parameter(s) in [PUSH-OPTIONS]:4: dhcp-pre-release (2.3.0)

    2014:04:30-00:35:22 firewall openvpn[10267]: Options error: Unrecognized option or missing parameter(s) in [PUSH-OPTIONS]:5: dhcp-renew (2.3.0)

    2014:04:30-00:35:22 firewall openvpn[10267]: Options error: Unrecognized option or missing parameter(s) in [PUSH-OPTIONS]:6: dhcp-release (2.3.0)

    2014:04:30-00:35:22 firewall openvpn[10267]: Options error: Unrecognized option or missing parameter(s) in [PUSH-OPTIONS]:18: register-dns (2.3.0)

    2014:04:30-00:35:22 firewall openvpn[10267]: Options error: Unrecognized option or missing parameter(s) in [PUSH-OPTIONS]:19: block-ipv6 (2.3.0)
  22. david c

    Hi Stefan

    First of all thanks for your hard work! It’s a shame that Sophos still didn’t implement OVPN format :/

    I’m trying to convert ovpn to apc using your script but unfortunately I’m getting error> line 323: printf: missing hex digit for \x

    In our ovpn config we are using only CA cert, no CLIENT cert.
    I’m attaching ovpn conf, please, could you provide me some help?

    thanks a lot

    auth SHA256
    dev tun
    proto udp
    remote remote_address 999
    resolv-retry infinite
    ca cert_file.crt
    remote-cert-tls server
    cipher AES-256-CBC
    verb 1
    reneg-sec 0

  23. xianx

    Hi All,

    This is a great tool.

    Is there a version that works correctly.

    I really like to use this to conv openvpn file to sophos utm.


  24. xianx

    Hi Stefan,

    Is there a place white an example how to run the script.

    Can u please provide me with instruction how to convert ovpn file to apc for use on Sophos UTM 9.3.

    Like an example which command i need to use to run the batch script in Windows or Linux (Ubuntu).

    Me verry NooB at this point.


  25. Stefan Rubner Post author

    If you call the script (on Ubuntu) without any parameters it should tell you the intended syntax.

    [bash] ./ openvpn-config.ovpn output.apc [username [password]]

    Chances are you need to make the main script executable first by running

    chmod 755 ovpn-tp-apc-sh

    If anything goes wrong, the script will most likely tell you. Also, there’s a dummy.ovpn file with comments as to what the different options mean. Just don’t add things from the dummy file to your .ovpn file without knowing what you’re doing ;)

    And lastly, if after importing the generated .apc file the OpenVPN connection doesn’t work, have a look at the live log. Most problems come from disagreements about the certificate to check with the “tls-remote” statement. The script tries to guess that from the certificate but you may need to manually specify the expected remote string in the .ovpn file to make everything work.


  26. xianx

    Hi Stefan,

    Thanks for the guide.
    This is the error i get:

    cat: : No such file or directory
    ./ line 323: printf: missing hex digit for \x

  27. Stefan Rubner Post author

    Most likely you’re missing a certificate file or the path names in the .ovpn file aren’t correct.


  28. xianx

    Hi Stefan,

    My steps look like this:

    I downloaded the openvpn files from PIA and extract the files.

    Then i copy the Netherlands.ovpn and the CA.crt file to the admintools-ovpn-to-apc dir. and run the command:
    chmod 755 ovpn-tp-apc-sh
    ./ Netherlands.ovpn Netherlands.apc [username [password]]

    Thit i miss somthing.
    Can you plz help me get this to work, i really don’t have a clue where to start.

    thnx i.a

  29. Stefan Rubner Post author

    If you only have the certificate from the VPN endpoint but no personal certificates then I have to assume that the login process at your VPN provider requires a username and a password. Such username/password protected VPN connections aren’t supported by the Astaro/Sophos UTM and thus aren’t supported by the script either.


  30. Jonas

    This is very cool, thank you for making this tool!

    I do get an error though;
    “ 240: [: unexpected operator”
    Everything else seems ok, and the file gets created and looks good to me.
    The UTM says corrupt config. Do you have any idea?
    Using files from a Netgear router.


  31. Michael


    Gitourios is no longer working, could you please send me the software via mail or provide a different download link?

    Thank you a lot,

Comments are closed.