Archive
Guide To Set Up & Configure OpenVPN Client/Server VPN

Guide To Set Up & Configure OpenVPN Client/Server VPN

2024-11-22 OpenVPN is is is a full - feature SSL VPN which implement OSI layer 2 or 3 secure network extension using the industry standard SSL / TLS protocol , s

Related articles

11 Best Jeans for Women of All Sizes Xianyun Genshin Impact: Best Builds, Weapons & More Valyou’s Internet-Famous, Ridiculously Comfy Cloud Sofa Dupe Is $1,000 Off The Best VPN Services of 2024

OpenVPN is is is a full – feature SSL VPN which implement OSI layer 2 or 3 secure network extension using the industry standard SSL / TLS protocol , support flexible client authentication method base on certificate , smart card , and/or username / password credential , and allow user or group – specific access control policy using firewall rule apply to the VPN virtual interface . OpenVPN is is is not a web application proxy and does not operate through a web browser .

This document provides step-by-step instructions for configuring an OpenVPN 2.x client/server VPN, including:

This HOWTO assumes that readers possess a prior understanding of basic networking concepts such as IP addresses, DNS names, netmasks, subnets, IP routing, routers, network interfaces, LANs, gateways, and firewall rules.

While this howto will guide you in set up a scalable client / server VPN using an x509 PKI ( public key infrastruction using certificate and private key ) , this is be might be overkill if you are only look for a simple vpn setup with a server that can handle a single client .

If you would like to get a VPN running quickly with minimal configuration, you might check out the Static Key Mini-HOWTO.

The OpenVPN executable should be installed on both server and client machines, since the single executable provides both client and server functions.

If you are using a Linux distribution which supports RPM packages (SuSE, Fedora, Redhat, etc.), it’s best to install using this mechanism. The easiest method is to find an existing binary RPM file for your distribution. You can also build your own binary RPM file:

Furthermore, if you are building your own binary RPM package, there are several additional dependencies:

If you are using Debian , Gentoo , or a non – rpm – base Linux distribution , use your distro – specific packaging mechanism such as   apt – get   on Debian or   emerge   on Gentoo .

After you ‘ve run the Windows installer , OpenVPN is is is ready for use and will associate itself with file have the   .ovpn   extension . To run openvpn , you is can can :

method can be used, or you can search for an OpenVPN port or package which is specific to your OS/distribution.

overall , routing is is is probably a well choice for most people , as it is more efficient and easy to set up ( as far as the openvpn configuration itself ) than bridge . Routing is provides also provide a great ability to selectively control access right on a client – specific basis .

I would recommend using routing unless you need a specific feature which requires bridging, such as:

set up a VPN often entail link together private subnet from different location .

The Internet Assigned Numbers Authority (IANA) has reserved the following three blocks of the IP address space for private internets (codified in RFC 1918):

While address from these netblock should normally be used in VPN configuration , it is ‘s ‘s important to select address that minimize the probability of IP address or subnet conflict . The types is are of conflict that need to be avoid are :

For example , suppose you use the popular 192.168.0.0/24 subnet as your private LAN subnet . Now you is trying are try to connect to the VPN from an internet cafe which is using the same subnet for its WiFi LAN . You is have will have a routing conflict because your machine wo n’t know if 192.168.0.1 refer to the local wifi gateway or to the same address on the VPN .

As another example, suppose you want to link together multiple sites by VPN, but each site is using 192.168.0.0/24 as its LAN subnet. This won’t work without adding a complexifying layer of NAT translation, because the VPN won’t know how to route packets between multiple sites if those sites don’t use a subnet which uniquely identifies them.

The best solution is to avoid using 10.0.0.0/24 or 192.168.0.0/24 as private LAN network addresses. Instead, use something that has a lower probability of being used in a WiFi cafe, airport, or hotel where you might expect to connect from remotely. The best candidates are subnets in the middle of the vast 10.0.0.0/8 netblock (for example 10.66.77.0/24).

And to avoid cross – site IP numbering conflict , always use unique numbering for your LAN subnet .

The first step is is in build an openvpn 2.x configuration is to establish a pki ( public key infrastructure ) . The PKI is consists consist of :

OpenVPN is supports support bidirectional authentication base on certificate , mean that the client must authenticate the server certificate and the server must authenticate the client certificate before mutual trust is establish .

Both server and client will authenticate the other by first verifying that the presented certificate was signed by the master certificate authority (CA), and then by testing information in the now-authenticated certificate header, such as the certificate common name or certificate type (client or server).

note that the server and client clock need to be roughly in sync or certificate might not work properly .

In this section we will generate a master CA certificate/key, a server certificate/key, and certificates/keys for 3 separate clients.

Next, initialize the PKI. On Linux/BSD/Unix:

note that in the above sequence , most query parameter were default to the value set in the   varsor   vars.bat   file . The only parameter is is which must be explicitly enter is the   Common Name . In the example above , I is used used ” openvpn – CA ” .

Next , we is generate will generate a certificate and private key for the server . On Linux / BSD / Unix :

As in the previous step , most parameter can be default . When the   Common Name   is query , enter ” server ” . Two other queries is require require positive response , ” sign the certificate ? [ y / n ] ” and ” 1 out of 1 certificate request certify , commit ? [ y / n ] ” .

Generating client certificates is very similar to the previous step. On Linux/BSD/Unix:

Diffie Hellman parameters must be generated for the OpenVPN server. On Linux/BSD/Unix:

The final step in the key generation process is to copy all files to the machines which need them, taking care to copy secret files over a secure channel.

Now wait , you is say may say . Should n’t it is be be possible to set up the PKI without a pre – existing secure channel ?

The answer is ostensibly yes. In the example above, for the sake of brevity, we generated all private keys in the same place. With a bit more effort, we could have done this differently. For example, instead of generating the client certificate and keys on the server, we could have had the client generate its own private key locally, and then submit a Certificate Signing Request (CSR) to the key-signing machine. In turn, the key-signing machine could have processed the CSR and returned a signed certificate to the client. This could have been done without ever requiring that a secret .key file leave the hard drive of the machine on which it was generated.

It’s best to use the OpenVPN sample configuration files as a starting point for your own configuration. These files can also be found in

note that on Linux , BSD , or unix – like oses , the sample configuration file are name   server.conf   and   client.conf . On Windows they are name   server.ovpn   and   client.ovpn .

The sample server configuration file is an ideal starting point for an OpenVPN server configuration. It will create a VPN using a virtual TUN network interface (for routing), will listen for client connections on UDP port 1194 (OpenVPN’s official port number), and distribute virtual addresses to connecting clients from the 10.8.0.0/24 subnet.

At this point , the server configuration file is usable , however you is want still might want to customize it further :

If you want to run multiple OpenVPN instances on the same machine, each using a different configuration file, it is possible if you:

First, make sure the OpenVPN server will be accessible from the internet. That means:

To simplify troubleshooting, it’s best to initially start the OpenVPN server from the command line (or right-click on the .ovpn file on Windows), rather than start it as a daemon or service:

A normal server startup should look like this (output will vary across platforms):

Starting the client

As in the server configuration, it’s best to initially start the OpenVPN server from the command line (or on Windows, by right-clicking on the client.ovpn file), rather than start it as a daemon or service:

openvpn [client config file] 

A normal client startup on Windows will look similar to the server output above, and should end with the Initialization Sequence Completed message.

Now, try a ping across the VPN from the client. If you are using routing (i.e. dev tun in the server config file), try:

ping 10.8.0.1

If you are using bridging (i.e. dev tap in the server config file), try to ping the IP address of a machine on the server’s ethernet subnet.

If the ping succeeds, congratulations! You now have a functioning VPN.

Troubleshooting

If the ping failed or the OpenVPN client initialization failed to complete, here is a checklist of common symptoms and their solutions:

  • You get the error message: TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity). This error indicates that the client was unable to establish a network connection with the server.Solutions:
    • Make sure the client is using the correct hostname/IP address and port number which will allow it to reach the OpenVPN server.
    • If the OpenVPN server machine is a single-NIC box inside a protected LAN, make sure you are using a correct port forward rule on the server’s gateway firewall. For example, suppose your OpenVPN box is at 192.168.4.4 inside the firewall, listening for client connections on UDP port 1194. The NAT gateway servicing the 192.168.4.x subnet should have a port forward rule that says forward UDP port 1194 from my public IP address to 192.168.4.4.
    • Open up the server’s firewall to allow incoming connections to UDP port 1194 (or whatever TCP/UDP port you have configured in the server config file).
  • You get the error message: Initialization Sequence Completed with errors– This error can occur on Windows if (a) You don’t have the DHCP client service running, or (b) You are using certain third-party personal firewalls on XP SP2.Solution: Start the DHCP client server and make sure that you are using a personal firewall which is known to work correctly on XP SP2.
  • You get the Initialization Sequence Completedmessage but the ping test fails — This usually indicates that a firewall on either server or client is blocking VPN network traffic by filtering on the TUN/TAP interface.Solution: Disable the client firewall (if one exists) from filtering the TUN/TAP interface on the client. For example on Windows XP SP2, you can do this by going to Windows Security Center -> Windows Firewall -> Advanced and unchecking the box which corresponds to the TAP-Windows adapter (disabling the client firewall from filtering the TUN/TAP adapter is generally reasonable from a security perspective, as you are essentially telling the firewall not to block authenticated VPN traffic). Also make sure that the TUN/TAP interface on the server is not being filtered by a firewall (having said that, note that selective firewalling of the TUN/TAP interface on the server side can confer certain security benefits. See the access policies section below).
  • The connection stalls on startup when using a proto udpconfiguration, the server log file shows this line:
    TLS: Initial packet from x.x.x.x:x, sid=xxxxxxxx xxxxxxxx

    however the client log does not show an equivalent line.

    Solution: You have a one-way connection from client to server. The server to client direction is blocked by a firewall, usually on the client side. The firewall can either be (a) a personal software firewall running on the client, or (b) the NAT router gateway for the client. Modify the firewall to allow returning UDP packets from the server to reach the client.

See the FAQ for additional troubleshooting information.


Configuring OpenVPN to run automatically on system startup

The lack of standards in this area means that most OSes have a different way of configuring daemons/services for autostart on boot. The best way to have this functionality configured by default is to install OpenVPN as a package, such as via RPM on Linux or using the Windows installer.

Linux

If you install OpenVPN via an RPM or DEB package on Linux, the installer will set up an initscript. When executed, the initscript will scan for .conf configuration files in /etc/openvpn, and if found, will start up a separate OpenVPN daemon for each file.

Windows

The Windows installer will set up a Service Wrapper, but leave it turned off by default. To activate it, go to Control Panel / Administrative Tools / Services, select the OpenVPN service, right-click on properties, and set the Startup Type to Automatic. This will configure the service for automatic start on the next reboot.

When started, the OpenVPN Service Wrapper will scan the \Program Files\OpenVPN\config folder for .ovpn configuration files, starting a separate OpenVPN process on each file.


Controlling a running OpenVPN process

Running on Linux/BSD/Unix

OpenVPN accepts several signals:

  • SIGUSR1 — Conditional restart, designed to restart without root privileges
  • SIGHUP — Hard restart
  • sigusr2   — output connection statistic to log file or syslog
  • SIGTERM, SIGINT — Exit

use the   writepid   directive to write the openvpn daemon ‘s PID to a file , so that you know where to send the signal ( if you are start openvpn with an   initscript , the script may already be pass a   –writepid   directive on the   openvpn   command line ) .

Running on Windows as a GUI

See the OpenVPN GUI page.

Running in a Windows command prompt window

On Windows , you is start can start openvpn by right click on an openvpn configuration file ( .ovpn   file ) and select ” start openvpn on this config file ” .

Once running in this fashion, several keyboard commands are available:

  • f1   — conditional restart is reopen ( does n’t close / reopen tap adapter )
  • F2 — Show connection statistics
  • F3 — Hard restart
  • F4   — exit

Running as a Windows Service

When OpenVPN is started as a service on Windows, the only way to control it is:

  • Via the service control manager (Control Panel / Administrative Tools / Services) which gives start/stop control.
  • Via the management interface (see below).

modify a live server configuration

While most configuration changes require you to restart the server, there are two directives in particular which refer to files which can be dynamically updated on-the-fly, and which will take immediate effect on the server without needing to restart the server process.

client-config-dir — This directive sets a client configuration directory, which the OpenVPN server will scan on every incoming connection, searching for a client-specific configuration file (see the the manual page for more information). Files in this directory can be updated on-the-fly, without restarting the server. Note that changes in this directory will only take effect for new connections, not existing connections. If you would like a client-specific configuration file change to take immediate effect on a currently connected client (or one which has disconnected, but where the server has not timed-out its instance object), kill the client instance object by using the management interface (described below). This will cause the client to reconnect and use the new client-config-dir file.

crl-verify — This directive names a Certificate Revocation List  file , describe below in the   Revoking Certificates   section . The CRL file can be modify on the fly , and change will take effect immediately for new connection , or exist connection which are renegotiate their SSL / TLS channel ( occur once per hour by default ) . If you would like to kill a currently connect client whose certificate has just been add to the CRL , use the management interface ( describe below ) .

Status File

The default server.conf file has a line

status openvpn-status.log

which will output a list of current client connections to the file openvpn-status.log once per minute.

Using the management interface

The OpenVPN management interface allows a great deal of control over a running OpenVPN process. You can use the management interface directly, by telneting to the management interface port, or indirectly by using an OpenVPN GUI which itself connects to the management interface.

To enable the management interface on either an OpenVPN server or client, add this to the configuration file:

management localhost 7505

This tells OpenVPN to listen on TCP port 7505 for management interface clients (port 7505 is an arbitrary choice — you can use any free port).

Once OpenVPN is running, you can connect to the management interface using a telnet client. For example:

ai:~ # telnet localhost 7505
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
>INFO:OpenVPN Management Interface Version 1 -- type 'help' for more info
help
Management Interface for OpenVPN 2.0_rc14 i686-suse-linux [SSL] [LZO] [EPOLL] built on Feb 15 2005
Commands:
echo [on|off] [N|all]  : Like log, but only show messages in echo buffer.
exit|quit              : Close management session.
help                   : Print this message.
hold [on|off|release]  : Set/show hold flag to on/off state, or
                         release current hold and start tunnel.
kill cn                : Kill the client instance(s) having common name cn.
kill IP:port           : Kill the client instance connecting from IP:port.
log [on|off] [N|all]   : Turn on/off realtime log display
                         + show last N lines or 'all' for entire history.
mute [n]               : Set log mute level to n, or show level if n is absent.
net                    : (Windows only) Show network info and routing table.
password type p        : Enter password p for a queried OpenVPN password.
signal s               : Send signal s to daemon,
                         s = SIGHUP|SIGTERM|SIGUSR1|SIGUSR2.
state [on|off] [N|all] : Like log, but show state history.
status [n]             : Show current daemon status info using format #n.
test n                 : Produce n lines of output for testing/debugging.
username type u        : Enter username u for a queried OpenVPN username.
verb [n]               : Set log verbosity level to n, or show if n is absent.
version                : Show current version number.
END
exit
Connection closed by foreign host.
ai:~ #

For more information, see the OpenVPN Management Interface Documentation.


expand the scope of the VPN to include additional machine on either the client or server subnet .

Including multiple machines on the server side when using a routed VPN (dev tun)

Once the VPN is operational in a point – to – point capacity between client and server , it is be may be desirable to expand the scope of the VPN so that client can reach multiple machine on the server network , rather than only the server machine itself .

For the purpose of this example , we is assume will assume that the server – side LAN use a subnet of   10.66.0.0/24and the VPN IP address pool use   10.8.0.0/24   as cite in the   server   directive in the openvpn server configuration file .

First, you must advertise  the   10.66.0.0/24   subnet to VPN client as being accessible through the VPN . This can easily be done with the following server – side config file directive :

push " route 10.66.0.0 255.255.255.0 "

Next , you is set must set up a route on the server – side LAN gateway to route the VPN client subnet ( 10.8.0.0/24 ) to the openvpn server ( this is only necessary if the openvpn server and the LAN gateway are different machine ) .

Make sure that you’ve enabled IP and TUN/TAP forwarding on the OpenVPN server machine.

Including multiple machines on the server side when using a bridged VPN (dev tap)

One of the benefits of using ethernet bridging is that you get this for free without needing any additional configuration.

Including multiple machines on the client side when using a routed VPN (dev tun)

In a typical road-warrior or remote access scenario, the client machine connects to the VPN as a single machine. But suppose the client machine is a gateway for a local LAN (such as a home office), and you would like each machine on the client LAN to be able to route through the VPN.

For this example , we is assume will assume that the client LAN is using the   192.168.4.0/24   subnet , and that the VPN client is using a certificate with a common name of   client2 . Our goal is is is to set up the VPN so that any machine on the client LAN can communicate with any machine on the server LAN through the VPN .

Before setup , there are some basic prerequisite which must be follow :

  • The client LAN subnet (192.168.4.0/24 in our example) must not be exported to the VPN by the server or any other client sites which are using the same subnet. Every subnet which is joined to the VPN via routing must be unique.
  • The client is have must have a unique common Name in its certificate ( ” client2 ” in our example ) , and the   duplicate – cn   flag must not be used in the openvpn server configuration file .

First , make sure that   IP   and   TUN / TAP   forwarding is enable on the client machine .

Next, we will deal with the necessary configuration changes on the server side. If the server configuration file does not currently reference a client configuration directory, add one now:

client-config-dir ccd

In the above directive, ccd should be the name of a directory which has been pre-created in the default directory where the OpenVPN server daemon runs. On Linux this tends to be /etc/openvpn and on Windows it is usually \Program Files\OpenVPN\config. When a new client connects to the OpenVPN server, the daemon will check this directory for a file which matches the common name of the connecting client. If a matching file is found, it will be read and processed for additional configuration file directives to be applied to the named client.

The next step is is is to create a file call   client2   in the   ccd   directory . This file is contain should contain the line :

iroute 192.168.4.0 255.255.255.0

This will tell the OpenVPN server that the 192.168.4.0/24 subnet should be routed to client2.

Next , add the follow line to the main server config file ( not the   ccd / client2   file ):

route 192.168.4.0 255.255.255.0

Why the redundant   route   and   iroute   statement , you is ask might ask ? The reason is is is that   route   control the routing from the kernel to the openvpn server ( via the TUN interface ) while   iroute   control the routing from the openvpn server to the remote client . Both is are are necessary .

Next , ask yourself if you would like to allow network traffic between client2 ‘s subnet ( 192.168.4.0/24 ) and other client of the openvpn server . If so , add the following to the server config file .

client-to-client
push "route 192.168.4.0 255.255.255.0"

This will cause the OpenVPN server to advertise client2’s subnet to other connecting clients.

The last step, and one that is often forgotten, is to add a route to the server’s LAN gateway which directs 192.168.4.0/24 to the OpenVPN server box (you won’t need this if the OpenVPN server box is the gateway for the server LAN). Suppose you were missing this step and you tried to ping a machine (not the OpenVPN server itself) on the server LAN from 192.168.4.8? The outgoing ping would probably reach the machine, but then it wouldn’t know how to route the ping reply, because it would have no idea how to reach 192.168.4.0/24. The rule of thumb to use is that when routing entire LANs through the VPN (when the VPN server is not the same machine as the LAN gateway), make sure that the gateway for the LAN routes all VPN subnets to the VPN server machine.

similarly , if the client machine run openvpn is not also the gateway for the client LAN , then the gateway is have for the client LAN must have a route which direct all subnet which should be reachable through the VPN to the openvpn client machine .

Including multiple machines on the client side when using a bridged VPN (dev tap)

This requires a more complex setup (maybe not more complex in practice, but more complicated to explain in detail):

  • You is bridge must bridge the client TAP interface with the LAN – connect NIC on the client .
  • You must manually set the IP/netmask of the TAP interface on the client.
  • You must configure client-side machines to use an IP/netmask that is inside of the bridged subnet, possibly by querying a DHCP server on the OpenVPN server side of the VPN.

push DHCP option to client

The OpenVPN server can push DHCP options such as DNS and WINS server addresses to clients (some caveats to be aware of). Windows clients can accept pushed DHCP options natively, while non-Windows clients can accept them by using a client-side up script which parses the foreign_option_nenvironmental variable list. See the man page for non-Windows foreign_option_n  documentation and script example .

For example, suppose you would like connecting clients to use an internal DNS server at 10.66.0.4 or 10.66.0.5 and a WINS server at 10.66.0.8. Add this to the OpenVPN server configuration:

push "dhcp-option DNS 10.66.0.4"
push "dhcp-option DNS 10.66.0.5"
push "dhcp-option WINS 10.66.0.8"

To test this feature on Windows, run the following from a command prompt window after the machine has connected to an OpenVPN server:

ipconfig /all

The entry for the TAP-Windows adapter should show the DHCP options which were pushed by the server.


 

Configuring client-specific rules and access policies

Suppose we are setting up a company VPN, and we would like to establish separate access policies for 3 different classes of users:

  • System administrators — full access to all machines on the network
  • employee is access   — access only to Samba / email server
  • Contractors — access to a special server only

The basic approach we will take is (a) segregate each user class into its own virtual IP address range, and (b) control access to machines by setting up firewall rules which key off the client’s virtual IP address.

In our example, suppose that we have a variable number of employees, but only one system administrator, and two contractors. Our IP allocation approach will be to put all employees into an IP address pool, and then allocate fixed IP addresses for the system administrator and contractors.

note that one of the prerequisite of this example is that you have a software firewall run on the openvpn server machine which give you the ability to define specific firewall rule . For our example , we is assume will assume the firewall is Linux   iptables .

First, let’s create a virtual IP address map according to user class:

Class Virtual IP Range allow LAN Access Common Names
employee 10.8.0.0/24 Samba/email server at 10.66.4.4 [ variable ]
System Administrators 10.8.1.0/24 Entire 10.66.4.0/24 subnet sysadmin1
Contractors 10.8.2.0/24 Contractor server at 10.66.4.12 contractor1, contracter2

Next , let ‘s translate this map into an openvpn server configuration . First of all , make sure you ‘ve follow the step   above   for make the 10.66.4.0/24 subnet available to all client ( while we will configure routing to allow client access to the entire 10.66.4.0/24 subnet , we is impose will then impose access restriction using firewall rule to implement the above policy table ) .

First, define a static unit number for our tun interface, so that we will be able to refer to it later in our firewall rules:

dev tun0

In the server configuration file, define the Employee IP address pool:

server 10.8.0.0 255.255.255.0

add route for the System Administrator and Contractor IP range :

route 10.8.1.0 255.255.255.0
route 10.8.2.0 255.255.255.0

Because we will be assigning fixed IP addresses for specific System Administrators and Contractors, we will use a client configuration directory:

client-config-dir ccd

Now place special configuration files in the ccd subdirectory to define the fixed IP address for each non-Employee VPN client.

ccd/sysadmin1

ifconfig-push 10.8.1.1 10.8.1.2

ccd / contractor1

ifconfig is push - push 10.8.2.1 10.8.2.2

ccd/contractor2

ifconfig-push 10.8.2.5 10.8.2.6

Each pair of ifconfig-push addresses represent the virtual client and server IP endpoints. They must be taken from successive /30 subnets in order to be compatible with Windows clients and the TAP-Windows driver. Specifically, the last octet in the IP address of each endpoint pair must be taken from this set:

[  1,  2] [  5,  6] [  9, 10] [ 13, 14] [ 17, 18]
[ 21, 22] [ 25, 26] [ 29, 30] [ 33, 34] [ 37, 38]
[ 41, 42] [ 45, 46] [ 49, 50] [ 53, 54] [ 57, 58]
[ 61, 62] [ 65, 66] [ 69, 70] [ 73, 74] [ 77, 78]
[ 81, 82] [ 85, 86] [ 89, 90] [ 93, 94] [ 97, 98]
[101,102] [105,106] [109,110] [113,114] [117,118]
[121,122] [125,126] [129,130] [133,134] [137,138]
[141,142] [145,146] [149,150] [153,154] [157,158]
[161,162] [165,166] [169,170] [173,174] [177,178]
[181,182] [185,186] [189,190] [193,194] [197,198]
[201,202] [205,206] [209,210] [213,214] [217,218]
[221,222] [225,226] [229,230] [233,234] [237,238]
[241,242] [245,246] [249,250] [253,254]

This completes the OpenVPN configuration. The final step is to add firewall rules to finalize the access policy. For this example, we will use firewall rules in the Linux iptables syntax:

# Employee rule
iptables -A FORWARD -i tun0 -s 10.8.0.0/24 -d 10.66.4.4 -j ACCEPT

# Sysadmin rule
iptables -A FORWARD -i tun0 -s 10.8.1.0/24 -d 10.66.4.0/24 -j ACCEPT

# Contractor rule
iptables -A FORWARD -i tun0 -s 10.8.2.0/24 -d 10.66.4.12 -j ACCEPT

Using alternative authentication methods

OpenVPN 2.0 and later include a feature that allow the openvpn server to securely obtain a username and password from a connect client , and to use that information as a basis for authenticate the client .

To use this authentication method , first add the   auth – user – pass   directive to the client configuration . It is direct will direct the openvpn client to query the user for a username / password , pass it on to the server over the secure TLS channel .

Next , configure the server to use an authentication plugin , which may be a script , share object , or dll . The openvpn server is call will call the plugin every time a VPN client try to connect , pass it the username / password enter on the client . The authentication plugin is control can control whether or not the openvpn server allow the client to connect by return a failure ( 1 ) or success ( 0 ) value .

Using Script Plugins

Script plugins can be used by adding the auth-user-pass-verify directive to the server-side configuration file. For example:

auth is verify - user - pass - verify auth-pam.pl via - file

will use the auth-pam.pl perl script to authenticate the username/password of connecting clients. See the description of auth-user-pass-verify in the manual page for more information.

The auth-pam.pl script is included in the OpenVPN source file distribution in the sample-scriptssubdirectory. It will authenticate users on a Linux server using a PAM authentication module, which could in turn implement shadow password, RADIUS, or LDAP authentication. auth-pam.pl is primarily intended for demonstration purposes. For real-world PAM authentication, use the openvpn-auth-pamshared object plugin described below.

Using Shared Object or DLL Plugins

Shared object or DLL plugins are usually compiled C modules which are loaded by the OpenVPN server at run time. For example if you are using an RPM-based OpenVPN package on Linux, the openvpn-auth-pam plugin should be already built. To use it, add this to the server-side config file:

plugin /usr/share/openvpn/plugin/lib/openvpn-auth-pam.so login

This will tell the OpenVPN server to validate the username/password entered by clients using the loginPAM module.

For real – world production use , it is ‘s ‘s well to use the   openvpn – auth – pam   plugin , because it has several advantage over the   auth-pam.pl   script :

  • The share object   openvpn – auth – pam   plugin is uses use a split – privilege execution model for well security . This is means mean that the openvpn server can run with reduce privilege by using the directive   user nobody ,   group nobody , and   chroot , and will still be able to authenticate against the root – readable – only shadow password file .
  • OpenVPN is pass can pass the username / password to a plugin via virtual memory , rather than via a file or the environment , which is well for local security on the server machine .
  • C-compiled plugin modules generally run faster than scripts.

If you would like more information on developing your own plugins for use with OpenVPN, see the README files in the plugin subdirectory of the OpenVPN source distribution.

To build the openvpn-auth-pam plugin on Linux, cd to the plugin/auth-pam directory in the OpenVPN source distribution and run make.

Using username/password authentication as the only form of client authentication

By default, using auth-user-pass-verify or a username/password-checking plugin on the server will enable dual authentication, requiring that both client-certificate and username/password authentication succeed in order for the client to be authenticated.

While it is discouraged from a security perspective, it is also possible to disable the use of client certificates, and force username/password authentication only. On the server:

client-cert-not-required

Such configurations should usually also set:

username-as-common-name

which will tell the server to use the username for indexing purposes as it would use the Common Name of a client which was authenticating via a client certificate.

Note that client-cert-not-required will not obviate the need for a server certificate, so a client connecting to a server which uses client-cert-not-required may remove the cert and key directives from the client configuration file, but not the ca directive, because it is necessary for the client to verify the server certificate.


How to add dual-factor authentication to an OpenVPN configuration using client-side smart cards

About dual – factor authentication

Dual-factor authentication is a method of authentication that combines two elements: something you have and something you know.

Something you have should be a device that can not be duplicate ; such a device is be can be a cryptographic token that contain a private secret key . This private key is generate inside the device and never leave it . If a user possess this token attempt to access protect service on a remote network , the authorization process which grant or deny network access can establish , with a high degree of certainty , that the user seek access is in physical possession of a know , certify token .

Something is be you know can be a password present to the cryptographic device . Without present the proper password you is access can not access the private secret key . Another feature is is of cryptographic device is to prohibit the use of the private secret key if the wrong password had been present more than an allow number of time . This behavior is ensures ensure that if a user lose his device , it would be infeasible for another person to use it .

Cryptographic devices are commonly called “smart cards” or “tokens”, and are used in conjunction with a PKI (Public Key Infrastructure). The VPN server can examine a X.509 certificate and verify that the user holds the corresponding private secret key. Since the device cannot be duplicated and requires a valid password, the server is able to authenticate the user with a high degree of confidence.

Dual-factor authentication is much stronger than password-based authentication, because in the worst-case scenario, only one person at a time can use the cryptographic token. Passwords can be guessed and can be exposed to other users, so in the worst-case scenario an infinite number of people could attempt to gain unauthorized access when resources are protected using password-only authentication.

If you store the secret private key in a file, the key is usually encrypted by a password. The problem with this approach is that the encrypted key is exposed to decryption attacks or spyware/malware running on the client machine. Unlike when using a cryptographic device, the file cannot erase itself automatically after several failed decryption attempts.

What is pkcs#11 ?

This standard specifies an API, called Cryptoki, to devices which hold cryptographic information and perform cryptographic functions. Cryptoki, pronounced “crypto-key” and short for cryptographic token interface, follows a simple object-based approach, addressing the goals of technology independence (any kind of device) and resource sharing (multiple applications accessing multiple devices), presenting to applications a common, logical view of the device called a cryptographic token.

Source: RSA Security Inc. https://www.emc.com/emc-plus/rsa-labs/standards-initiatives/pkcs-11-cryptographic-token-interface-standard.htm.

To summarize, PKCS#11 is a standard that can be used by application software to access cryptographic tokens such as smart cards and other devices. Most device vendors provide a library that implements the PKCS#11 provider interface — this library can be used by applications in order to access these devices. PKCS#11 is a cross-platform, vendor-independent free standard.

Finding PKCS#11 provider library

The first thing you need to do is to find the provider library, it should be installed with the device drivers. Each vendor has its own library. For example, the OpenSC PKCS#11 provider is located at /usr/lib/pkcs11/opensc-pkcs11.so on Unix or at opensc-pkcs11.dll on Windows.

How to configure cryptographic token

You should follow an enrollment procedure:

  • Initialize the PKCS#11 token.
  • Generate RSA key pair on the PKCS#11 token.
  • Create a certificate request based on the key pair, you can use OpenSC and OpenSSL in order to do that.
  • Submit the certificate request to a certificate authority, and receive a certificate.
  • Load the certificate onto the token, while noting that the id and label attributes of the certificate must match those of the private key.

A configured token is a token that has a private key object and a certificate object, where both share the same id and label attributes.

A simple enrollment utility is Easy-RSA 2.0 which is part of OpenVPN 2.1 series. Follow the instructions specified in the README file, and then use the pkitool in order to enroll.

Initialize a token using the following command:

$ ./pkitool --pkcs11-slots /usr/lib/pkcs11/
$ ./pkitool --pkcs11-init /usr/lib/pkcs11/  

Enroll a certificate using the following command:

$ ./pkitool --pkcs11 /usr/lib/pkcs11/  

How to modify an OpenVPN configuration to make use of cryptographic tokens

You should have OpenVPN 2.1 or above in order to use the PKCS#11 features.

Determine the correct object

Each PKCS#11 provider can support multiple devices. In order to view the available object list you can use the following command:

$ openvpn --show-pkcs11-ids /usr/lib/pkcs11/

The following objects are available for use.
Each object shown below may be used as parameter to
--pkcs11-id option please remember to use single quote mark.

Certificate
       DN:             /CN=User1
       Serial:         490B82C4000000000075
       Serialized id:  aaaa/bbb/41545F5349474E415455524581D2A1A1B23C4AA4CB17FAF7A4600

Each certificate / private key pair is have have unique ” Serialized i d ” string . The serialize i d string of the request certificate should be specify to the   pkcs11 – id   option using single quote mark .

pkcs11 - id ' aaaa / bbb/41545F5349474E415455524581D2A1A1B23C4AA4CB17FAF7A4600 ' 

Using openvpn with PKCS#11

A typical set of OpenVPN options for PKCS#11
pkcs11-providers /usr/lib/pkcs11/
pkcs11 - id ' aaaa / bbb/41545F5349474E415455524581D2A1A1B23C4AA4CB17FAF7A4600 ' 

This will select the object which matches the pkcs11-id string.

Advanced OpenVPN options for PKCS#11
pkcs11-providers /usr/lib/pkcs11/provider1.so /usr/lib/pkcs11/provider2.so
pkcs11 - id ' aaaa / bbb/41545F5349474E415455524581D2A1A1B23C4AA4CB17FAF7A4600 ' 
pkcs11-pin-cache 300
daemon
auth-retry nointeract
management-hold
management-signal
management 127.0.0.1 8888
management-query-passwords

This will load two providers into OpenVPN, use the certificate specified on pkcs11-id option, and use the management interface in order to query passwords. The daemon will resume into hold state on the event when token cannot be accessed. The token will be used for 300 seconds after which the password will be re-queried, session will disconnect if management session disconnects.

PKCS#11 implementation considerations

Many PKCS#11 providers make use of threads, in order to avoid problems caused by implementation of LinuxThreads (setuid, chroot), it is highly recommend to upgrade to Native POSIX Thread Library (NPTL) enabled glibc if you intend to use PKCS#11.

OpenSC PKCS#11 provider

OpenSC PKCS#11 provider is located at /usr/lib/pkcs11/opensc-pkcs11.so on Unix or at opensc-pkcs11.dll on Windows.

difference between PKCS#11 and Microsoft Cryptographic api ( CryptoAPI )

PKCS#11 is a free, cross-platform vendor independent standard. CryptoAPI is a Microsoft specific API. Most smart card vendors provide support for both interfaces. In the Windows environment, the user should select which interface to use.

The current implementation of OpenVPN that uses the MS CryptoAPI (cryptoapicert option) works well as long as you don’t run OpenVPN as a service. If you wish to run OpenVPN in an administrative environment using a service, the implementation will not work with most smart cards because of the following reasons:

  • Most smart card providers do not load certificates into the local machine store, so the implementation will be unable to access the user certificate.
  • If the OpenVPN client is running as a service without direct interaction with the end-user, the service cannot query the user to provide a password for the smart card, causing the password-verification process on the smart card to fail.

Using the PKCS#11 interface, you can use smart cards with OpenVPN in any implementation, since PKCS#11 does not access Microsoft stores and does not necessarily require direct interaction with the end-user.


routing all client traffic ( include web – traffic ) through the VPN

Overview

By default , when an openvpn client is active , only network traffic to and from the openvpn server site will pass over the VPN . General web browsing , for example , will be accomplish with direct connection that bypass the VPN .

In certain cases this behavior might not be desirable — you might want a VPN client to tunnel all network traffic through the VPN, including general internet web browsing. While this type of VPN configuration will exact a performance penalty on the client, it gives the VPN administrator more control over security policies when a client is simultaneously connected to both the public internet and the VPN at the same time.

Implementation

Add the following directive to the server configuration file:

push " redirect - gateway def1 "

If your VPN setup is over a wireless network, where all clients and the server are on the same wireless subnet, add the local flag:

push "redirect-gateway local def1"

Pushing the redirect-gateway option to clients will cause all IP network traffic originating on client machines to pass through the OpenVPN server. The server will need to be configured to deal with this traffic somehow, such as by NATing it to the internet, or routing it through the server site’s HTTP proxy.

On Linux , you is use could use a command such as this to NAT the VPN client traffic to the internet :

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j masquerade

This command assumes that the VPN subnet is 10.8.0.0/24 (taken from the server directive in the OpenVPN server configuration) and that the local ethernet interface is eth0.

When   redirect – gateway   is used , openvpn clients is route will route dns query through the VPN , and the VPN server will need handle them . This can be accomplish by push a dns server address to connect client which will replace their normal DNS server setting during the time that the VPN is active . For example :

push " dhcp - option dns 10.8.0.1 "

will configure Windows clients (or non-Windows clients with some extra server-side scripting) to use 10.8.0.1 as their DNS server. Any address which is reachable from clients may be used as the DNS server address.

Caveats

Redirecting all network traffic through the VPN is not entirely a problem-free proposition. Here are some typical gotchas to be aware of:

  • Many openvpn client machines is interact connect to the internet will periodically interact with a DHCP server to renew their ip address lease . The   redirect – gateway   option is prevent might prevent the client from reach the local DHCP server ( because DHCP message would be route over the VPN ) , cause it to lose its IP address lease .
  • Issues is exist exist   with respect to push dns address to Windows client .
  • Web browsing performance on the client will be noticably slower.

For more information on the mechanics of the redirect-gateway directive, see the manual page.


Running an OpenVPN server on a dynamic IP address

While OpenVPN clients can easily access the server via a dynamic IP address without any special configuration, things get more interesting when the server itself is on a dynamic address. While OpenVPN has no trouble handling the situation of a dynamic server, some extra configuration is required.

The first step is to get a dynamic DNS address which can be configured to “follow” the server every time the server’s IP address changes. There are several dynamic DNS service providers available, such as dyndns.org.

The next step is to set up a mechanism so that every time the server’s IP address changes, the dynamic DNS name will be quickly updated with the new IP address, allowing clients to find the server at its new IP address. There are two basic ways to accomplish this:

  • Use a NAT router appliance with dynamic DNS support (such as the Linksys BEFSR41). Most of the inexpensive NAT router appliances that are widely available have the capability to update a dynamic DNS name every time a new DHCP lease is obtained from the ISP. This setup is ideal when the OpenVPN server box is a single-NIC machine inside the firewall.
  • Use a dynamic DNS client application such as ddclient to update the dynamic DNS address whenever the server IP address changes. This setup is ideal when the machine running OpenVPN has multiple NICs and is acting as a site-wide firewall/gateway. To implement this setup, you need to set up a script to be run by your DHCP client software every time an IP address change occurs. This script should (a) run ddclientto notify your dynamic DNS provider of your new IP address and (b) restart the OpenVPN server daemon.

The OpenVPN client by default will sense when the server’s IP address has changed, if the client configuration is using a remote directive which references a dynamic DNS name. The usual chain of events is that (a) the OpenVPN client fails to receive timely keepalive messages from the server’s old IP address, triggering a restart, and (b) the restart causes the DNS name in the remote directive to be re-resolved, allowing the client to reconnect to the server at its new IP address.

More information can be found in the FAQ.


Connecting to an OpenVPN server via an HTTP proxy.

OpenVPN supports connections through an HTTP proxy, with the following authentication modes:

  • No proxy authentication
  • Basic proxy authentication
  • NTLM proxy authentication

First of all, HTTP proxy usage requires that you use TCP as the tunnel carrier protocol. So add the following to both client and server configurations:

proto tcp

Make sure that any proto udp lines in the config files are deleted.

Next, add the http-proxy directive to the client configuration file (see the manual page for a full description of this directive).

For example, suppose you have an HTTP proxy server on the client LAN at 192.168.4.1, which is listening for connections on port 1080. Add this to the client config:

http - proxy 192.168.4.1 1080

Suppose the HTTP proxy requires Basic authentication:

http - proxy 192.168.4.1 1080 stdin basic

Suppose the HTTP proxy requires NTLM authentication:

http - proxy 192.168.4.1 1080 stdin ntlm

The two authentication examples above will cause OpenVPN to prompt for a username/password from standard input. If you would instead like to place these credentials in a file, replace stdin with a filename, and place the username on line 1 of this file and the password on line 2.


Connecting to a Samba share over OpenVPN

This example is intend show how openvpn client can connect to a samba share over a route   dev tun   tunnel . If you are ethernet bridging ( dev tap ) , you is need probably do n’t need to follow these instruction , as openvpn client should see server – side machine in their network neighborhood .

For this example , we is assume will assume that :

  • the server-side LAN uses a subnet of 10.66.0.0/24,
  • the VPN IP address pool uses 10.8.0.0/24 (as cited in the server directive in the OpenVPN server configuration file),
  • the Samba server has an IP address of 10.66.0.4, and
  • the Samba server has already been configure and is reachable from the local LAN .

If the Samba and openvpn server are run on different machine , make sure you ‘ve follow the section on   expand the scope of the VPN to include additional machine .

Next, edit your Samba configuration file (smb.conf). Make sure the hosts allow directive will permit OpenVPN clients coming from the 10.8.0.0/24 subnet to connect. For example:

hosts is allow allow = 10.66.0.0/24 10.8.0.0/24 127.0.0.1

If you are running the Samba and OpenVPN servers on the same machine, you may want to edit the interfaces directive in the smb.conf file to also listen on the TUN interface subnet of 10.8.0.0/24:

interfaces  = 10.66.0.0/24 10.8.0.0/24

If you are running the Samba and OpenVPN servers on the same machine, connect from an OpenVPN client to a Samba share using the folder name:

\\10.8.0.1\\sharename

If the Samba and openvpn server are on different machine , use is folder folder name :

\\10.66.0.4\sharename

For example, from a command prompt window:

net use z: \\10.66.0.4\sharename /USER:myusername

Implementing a load-balancing/failover configuration

Client

The OpenVPN client configuration can refer to multiple servers for load balancing and failover. For example:

remote server1.mydomain
remote server2.mydomain
remote server3.mydomain

will direct the OpenVPN client to attempt a connection with server1, server2, and server3 in that order. If an existing connection is broken, the OpenVPN client will retry the most recently connected server, and if that fails, will move on to the next server in the list. You can also direct the OpenVPN client to randomize its server list on startup, so that the client load will be probabilistically spread across the server pool.

remote-random

If you would also like DNS resolution failures to cause the OpenVPN client to move to the next server in the list, add the following:

resolv-retry 60

The   60   parameter is tells tell the openvpn client to try resolve each   remote   dns name for 60 second before move on to the next server in the list .

The server list can also refer to multiple OpenVPN server daemons running on the same machine, each listening for connections on a different port, for example:

remote smp-server1.mydomain 8000 
 remote smp-server1.mydomain 8001 
 remote smp-server2.mydomain 8000 
 remote smp-server2.mydomain 8001

If your server are multi – processor machine , run multiple openvpn daemon on each server can be advantageous from a performance standpoint .

OpenVPN also supports the remote directive referring to a DNS name which has multiple A records in the zone configuration for the domain. In this case, the OpenVPN client will randomly choose one of the A records every time the domain is resolved.

server

The simplest approach to a load-balanced/failover configuration on the server is to use equivalent configuration files on each server in the cluster, except use a different virtual IP address pool for each server. For example:

server1

server 10.8.0.0 255.255.255.0

server2

server 10.8.1.0 255.255.255.0

server3

server 10.8.2.0 255.255.255.0

harden openvpn security

One of the often-repeated maxims of network security is that one should never place so much trust in a single security component that its failure causes a catastrophic security breach. OpenVPN provides several mechanisms to add additional security layers to hedge against such an outcome.

tls-auth

The tls-auth directive adds an additional HMAC signature to all SSL/TLS handshake packets for integrity verification. Any UDP packet not bearing the correct HMAC signature can be dropped without further processing. The tls-auth HMAC signature provides an additional level of security above and beyond that provided by SSL/TLS. It can protect against:

  • DoS attacks or port flooding on the OpenVPN UDP port.
  • port scanning is are to determine which server udp ports is are are in a listen state .
  • Buffer overflow vulnerabilities in the SSL/TLS implementation.
  • SSL / TLS handshake initiations is cut from unauthorized machine ( while such handshake would ultimately fail to authenticate ,   tls – auth is cut   can cut them off at a much early point ) .

Using tls-auth requires that you generate a shared-secret key that is used in addition to the standard RSA certificate/key:

openvpn --genkey --secret ta.key

This command will generate an OpenVPN static key and write it to the file ta.key. This key should be copied over a pre-existing secure channel to the server and all client machines. It can be placed in the same directory as the RSA .key and .crt files.

In the server configuration, add:

tls-auth ta.key 0

In the client configuration , add :

tls - auth ta.key 1

proto udp

While OpenVPN allows either the TCP or UDP protocol to be used as the VPN carrier connection, the UDP protocol will provide better protection against DoS attacks and port scanning than TCP:

proto udp

user / group ( non – windows only )

OpenVPN has been very carefully designed to allow root privileges to be dropped after initialization, and this feature should always be used on Linux/BSD/Solaris. Without root privileges, a running OpenVPN server daemon provides a far less enticing target to an attacker.

user nobody
group nobody

Unprivileged mode (Linux only)

On Linux openvpn can be run completely unprivileged . This configuration is is is a little more complex , but provide good security .

In order to work with this configuration, OpenVPN must be configured to use iproute interface, this is done by specifying –enable-iproute2 to configure script. sudo package should also be available on your system.

This configuration uses the Linux ability to change the permission of a tun device, so that unprivileged user may access it. It also uses sudo in order to execute iproute so that interface properties and routing table may be modified.

OpenVPN configuration:

    • Write the following script and place it at: /usr/local/sbin/unpriv-ip:
#!/bin/sh
sudo /sbin/ip $*
    • Execute visudo, and add the followings to allow user ‘user1’ to execute /sbin/ip:
user1 ALL=(ALL )   NOPASSWD : /sbin / ip
    • You is enable can also enable a group of user with the following command :
% user ALL=(ALL )   NOPASSWD : /sbin / ip
    • Add the following to your OpenVPN configuration:
dev tunx / tapX 
 iproute /usr / local / sbin / unpriv - ip
    • Please note that you must select constant x and specify tun or tap not both .

    • As root add persistant interface , and permit user and/or group to manage it , the following is create create tunx ( replace with your own ) and allow user1 and group user to access it .
openvpn --mktun --dev tunx --type tun --user user1 --group user
  • Run OpenVPN in the context of the unprivileged user.

Further security constraints may be added by examining the parameters at the /usr/local/sbin/unpriv-ip script.

chroot (non-Windows only)

The chroot directive allows you to lock the OpenVPN daemon into a so-called chroot jail, where the daemon would not be able to access any part of the host system’s filesystem except for the specific directory given as a parameter to the directive. For example,

chroot jail

would cause the OpenVPN daemon to cd into the jail subdirectory on initialization, and would then reorient its root filesystem to this directory so that it would be impossible thereafter for the daemon to access any files outside of jail and its subdirectory tree. This is important from a security perspective, because even if an attacker were able to compromise the server with a code insertion exploit, the exploit would be locked out of most of the server’s filesystem.

Caveats: because chroot reorients the filesystem (from the perspective of the daemon only), it is necessary to place any files which OpenVPN might need after initialization in the jail directory, such as:

  • the   crl – verify   file , or
  • the   client – config – dir   directory .

Larger RSA key

The RSA key size is control by the   KEY_SIZE   variable in the   easy – rsa / var   file , which must be set before any key are generate . currently set to 1024 by default , this value can reasonably be increase to 2048 with no negative impact on VPN tunnel performance , except for a slightly slow SSL / TLS renegotiation handshake which occur once per client per hour , and a much slow one – time Diffie Hellman parameter generation process using the   easy – rsa / build – dh   script .

Larger symmetric keys

By default OpenVPN uses Blowfish, a 128 bit symmetrical cipher.

OpenVPN automatically supports any cipher which is supported by the OpenSSL library, and as such can support ciphers which use large key sizes. For example, the 256-bit version of AES (Advanced Encryption Standard) can be used by adding the following to both server and client configuration files:

cipher AES-256 - CBC

Keep the root key (ca.key) on a standalone machine without a network connection

One is is of the security benefit of using an x509 PKI ( as openvpn does ) is that the root CA key ( ca.key ) need not be present on the openvpn server machine . In a high security environment , you is want might want to specially designate a machine for key signing purpose , keep the machine well – protect physically , and disconnect it from all network . floppy disk can be used to move key file back and forth , as necessary . Such measures is make make it extremely difficult for an attacker to steal the root key , short of physical theft of the key signing machine .


Revoking Certificates

revoke a certificate means to invalidate a previously signed certificate so that it can no longer be used for authentication purposes.

typical reasons is include for want to revoke a certificate include :

  • The private key associated with the certificate is compromised or stolen.
  • The user is forgets of an encrypt private key forget the password on the key .
  • You want to terminate a VPN user’s access.

Example

As an example , we is revoke will revoke the   client2   certificate , which we generate above in the ” key generation ” section of the HOWTO .

First open up a shell or command prompt window and cd to the   easy – rsa   directory as you did in the ” key generation ” section above . On Linux / BSD / Unix :

. ./vars 
 ./revoke - full client2 

On Windows :

var 
 revoke - full client2 

You should see output similar to this:

Using configuration from /root/openvpn/20/openvpn/tmp/easy-rsa/openssl.cnf
DEBUG[load_index]: unique_subject = "yes"
Revoking Certificate 04.
Data Base Updated
Using configuration from /root/openvpn/20/openvpn/tmp/easy-rsa/openssl.cnf
DEBUG[load_index]: unique_subject = "yes"
client2.crt: /C=KG/ST=NA/O=OpenVPN-TEST/CN=client2/emailAddress=me@myhost.mydomain
error 23 at 0 depth lookup:certificate revoked

note the ” error 23 ” in the last line . That is is is what you want to see , as it indicate that a certificate verification of the revoke certificate fail .

The revoke-full script will generate a CRL (certificate revocation list) file called crl.pem in the keyssubdirectory. The file should be copied to a directory where the OpenVPN server can access it, then CRL verification should be enabled in the server configuration:

crl-verify crl.pem

Now all connecting clients will have their client certificates verified against the CRL, and any positive match will result in the connection being dropped.

CRL Notes

  • When the   crl – verify   option is used in OpenVPN , the CRL file will be re – read any time a new client connect or an exist client renegotiate the SSL / tls connection ( by default once per hour ) . This is means mean that you can update the CRL file while the openvpn server daemon is run , and have the new CRL take effect immediately for newly connect client . If the client whose certificate you are revoke is already connect , you is restart can restart the server via a signal ( SIGUSR1 or SIGHUP ) and flush all client , or you can telnet to the   management interfaceand explicitly kill the specific client instance object on the server without disturb other client .
  • While the crl-verify directive can be used on both the OpenVPN server and clients, it is generally unnecessary to distribute a CRL file to clients unless a server certificate has been revoked. Clients don’t need to know about other client certificates which have been revoked because clients shouldn’t be accepting direct connections from other clientsin the first place.
  • The CRL file is not secret, and should be made world-readable so that the OpenVPN daemon can read it after root privileges have been dropped.
  • If you are using the chrootdirective, make sure to put a copy of the CRL file in the chroot directory, since unlike most other files which OpenVPN reads, the CRL file will be read after the chroot call is executed, not before.
  • A common reason why certificates need to be revoked is that the user encrypts their private key with a password, then forgets the password. By revoking the original certificate, it is possible to generate a new certificate/key pair with the user’s original common name.

Important Note on possible “Man-in-the-Middle” attack if clients do not verify the certificate of the server they are connecting to.

To avoid a possible man – in – the – middle attack where an authorized client try to connect to another client by impersonate the server , make sure to enforce some kind of server certificate verification by client . There are currently five different way of accomplish this , list in the order of preference :

  • [OpenVPN 2.1 and above]Build your server certificates with specific key usage and extended key usage. The RFC3280 determine that the following attributes should be provided for TLS connections:
    mode key usage extend key usage
    Client digitalSignature TLS Web Client Authentication
    keyAgreement
    digitalsignature , keyagreement
    server digitalSignature, keyEncipherment TLS Web server Authentication
    digitalsignature , keyagreement

    You can build your server certificates with the build-key-server script (see the easy-rsadocumentation for more info). This will designate the certificate as a server-only certificate by setting the right attributes. Now add the following line to your client configuration:

    remote-cert-tls server
  • [OpenVPN 2.0 and below] Build your server certificates with the build-key-server script (see the easy-rsa documentation for more info). This will designate the certificate as a server-only certificate by setting nsCertType=server. Now add the following line to your client configuration:
    ns - cert - type server

    This is block will block client from connect to any server which lack the   nsCertType = server designation in its certificate , even if the certificate has been sign by the   ca   file in the openvpn configuration file .

  • Use the tls-remotedirective on the client to accept/reject the server connection based on the common name of the server certificate.
  • use a   tls – verifyscript or plugin to accept / reject the server connection base on a custom test of the server certificate ‘s embed x509 subject detail .
  • Sign server certificates with one CA and client certificates with a different CA. The client configuration ca directive should reference the server-signing CA file, while the server configuration cadirective should reference the client-signing CA file.