| *** Consider using Wireguard instead! Thanks to Alex Jensen for creating this script: https://www.cron.dk/easy-certificate-generation-for-openvpn/ To use: 1: Save this script to "/conf/openvpn/zmake.sh". 2: Change "EdgeOpenVPN" to be the IP address or hostname that clients should use to connect to the VPN. This will be put into every client OVPN file. You can also do this later to each OVPN file. 3: Execute it by opening Putty and entering: bash /config/openvpn/zmake.sh Give it 45 minutes or so (to generate Diffie Hellman). 4: Edit "Server.ovpn", the "push route" lines need to have the IP ranges you want to access from VPN if full gateway redirection is not enabled. If upstream network of Edgerouter is 192.168.1.1 (WAN of Edgerouter has a 192.168.1.xx IP) then adding a line with "192.168.1.0" will make it available from vpn, even if remote gateway redirect is disabled. 5: Open Putty, enter "configure" to go into configure mode, and paste in the contents of "zEdgeSetup.txt". 6: Copy ovpn files to computers, use OpenVPN to connect. Copy to Clipboard 
#!/bin/bash
cd /config/openvpn
#-----------------------------------------------------------------------------------------------
# Setup
CAname=CA-World
CAsubject="/C=US/ST=SomeCity/L=SomeCity/O=CAworld"
CAexpire=10000
CAkeyLength=2048
ServerName=EdgeOpenVPN
ServerSubject="/C=US/ST=SomeState/L=SomeCity/O=MyCompany/CN=${ServerName}"
ServerExpire=10000
ServerKeyLength=2048
ClientExpire=10000
ClientKeyLength=2048
DHkeyLength=2048
#-----------------------------------------------------------------------------------------------
# Functions
function makeCA () {
	CAname=$1
	CAexpire=$2
	CAsubject=$3
	CAkeyLength=$4
	printf "Generating Certificate Authority ${CAname}...\n\n"
	openssl genrsa -out ${CAname}.key ${CAkeyLength} 
	openssl req -x509 -new -nodes -key ${CAname}.key -sha256 -days ${CAexpire} -out ${CAname}.pem -subj $CAsubject 
}
function makeCert () {
	CAname=$1
	CertName=$2
	CertExpire=$3
	CertSubject=$4
	CertKeyLength=$5
	printf "\nGeneration certificate for ${CertName}...\n\n"
	ConfigFile=`mktemp`
	printf 'basicConstraints = CA:FALSE\nsubjectKeyIdentifier=hash\nauthorityKeyIdentifier=keyid' > ${ConfigFile}
	openssl genrsa -out ${CertName}.key ${CertKeyLength}
	openssl req  -new -key ${CertName}.key -out ${CertName}.csr -subj ${CertSubject} 
	openssl x509 -req -extfile ${ConfigFile} -in ${CertName}.csr -CA ${CAname}.pem -CAkey ${CAname}.key \
		     -CAcreateserial -out ${CertName}.crt -days ${CertExpire} -sha256
	rm ${CertName}.csr
	rm ${ConfigFile}
}
function makeOvpnFile () {
	CAname=$1
	ClientName=$2
	HostName=$3
	echo client > ${ClientName}.ovpn
	echo dev tun >> ${ClientName}.ovpn
	echo proto udp >> ${ClientName}.ovpn
        echo route 192.168.1.0 255.255.255.0
	echo remote ${HostName} 1194 >> ${ClientName}.ovpn
	echo cipher AES-256-CBC >> ${ClientName}.ovpn
	echo auth SHA256 >> ${ClientName}.ovpn
	echo resolv-retry infinite >> ${ClientName}.ovpn
	echo #redirect-gateway def1 >> ${ClientName}.ovpn
	echo persist-key >> ${ClientName}.ovpn
	echo persist-tun >> ${ClientName}.ovpn
	echo user nobody >> ${ClientName}.ovpn
	echo group nogroup >> ${ClientName}.ovpn
	echo verb 3 >> ${ClientName}.ovpn
	echo '' >> ${ClientName}.ovpn
	echo '<ca>' >>> ${ClientName}.ovpn
	cat ${CAname}.pem >> ${ClientName}.ovpn
	echo '</ca>' >> ${ClientName}.ovpn
	echo '<cert>' >> ${ClientName}.ovpn
	cat ${ClientName}.crt >> ${ClientName}.ovpn
	echo '</cert>' >> ${ClientName}.ovpn
	echo '<key>' >> ${ClientName}.ovpn
	cat ${ClientName}.key >> ${ClientName}.ovpn
	echo '</key>' >> ${ClientName}.ovpn
}
function showConfGuide () {
	CAname=$1
	ServerName=$2
	CurrentPath=`pwd`
	
	echo server 10.20.30.0 255.255.255.0> Server.ovpn
	echo # Copy push route below to have LAN subnets above router>> Server.ovpn
	echo #push "route 10.20.30 255.255.255.0">> Server.ovpn
	echo topology subnet>> Server.ovpn
	echo mode server>> Server.ovpn
	echo tls-server>> Server.ovpn
	echo port 1194 >> Server.ovpn
	echo proto udp>> Server.ovpn
	echo dev tun>> Server.ovpn
	echo cipher AES-256-CBC>> Server.ovpn
	echo auth SHA256>> Server.ovpn
	echo ca   ${CurrentPath}/${CAname}.pem>> Server.ovpn
	echo cert ${CurrentPath}/${ServerName}.crt>> Server.ovpn
	echo key  ${CurrentPath}/${ServerName}.key>> Server.ovpn
	echo dh   ${CurrentPath}/dh.pem>> Server.ovpn
	echo #client-config-dir /config/ccd>> Server.ovpn
	echo keepalive 10 30 >> Server.ovpn
	echo persist-key>> Server.ovpn
	echo persist-tun>> Server.ovpn
	echo user nobody>> Server.ovpn
	echo group nogroup>> Server.ovpn
	echo verb 3 >> Server.ovpn
	echo set interfaces openvpn vtun0 config-file /config/openvpn/Server.ovpn> zEdgeSetup.txt
	echo >> zEdgeSetup.txt
	echo >> zEdgeSetup.txt
	echo edit firewall name WAN_LOCAL>> zEdgeSetup.txt
	echo set rule 67 action accept>> zEdgeSetup.txt
	echo set rule 67 description "OpenVPN">> zEdgeSetup.txt
	echo set rule 67 destination port 1194 >> zEdgeSetup.txt
	echo set rule 67 protocol tcp_udp>> zEdgeSetup.txt
	echo set rule 67 log disable>> zEdgeSetup.txt
}
function makeDH () {
	DHkeyLength=$1
	printf "\nMaking diffie-hellman keypair for perfect forward secrecy...\n\n"
	openssl dhparam -out dh.pem -2 ${DHkeyLength}
}
function makeClientCert () {
	CAname=$1
	Clientname=$2
	ClientExpire=$3
	ClientKeyLength=$4
	ServerName=$5
	printf "\n\nMaking Client certificate for ${Clientname}\n"
	makeCert ${CAname} ${Clientname} ${ClientExpire} "/C=US/ST=SomeState/L=SomeCity/O=${Clientname}/CN=${Clientname}" ${ClientKeyLength}
	makeOvpnFile ${CAname} ${Clientname} ${ServerName} 
}
#-----------------------------------------------------------------------------------------------
# Make everything
makeCA ${CAname} ${CAexpire} ${CAsubject} ${CAkeyLength}
makeCert ${CAname} ${ServerName} ${ServerExpire} ${ServerSubject} ${ServerKeyLength}
for i in {1..10}
do
  makeClientCert ${CAname} "User${i}" ${ClientExpire} ${ClientKeyLength} ${ServerName}
done
makeDH ${DHkeyLength}
showConfGuide ${CAname} ${ServerName}
printf "\nScript is done!\n"
printf "\nYou need to open '/config/openvpn/zEdgeSetup.txt' and run those commands\n\n"
ls '/config/openvpn/'
To make more client certificates, comment out all of the makeXX lines except the ones containing usernames like "User01". Rename them as appropriate. makeCert ${CAname} ${ClientName} ${ClientExpire} ${ClientSubject} ${ClientKeyLength} Run and repeat to make multiple clients. |