Прежде всего уясните себе что машина с easy-rsa это машина которая только подписывает ключи. И по логике безопасности должна быть отдельной машиной. Не стоит хранить генератор ключей и в особенности приватный CA на самом VPN сервере.
1) ставим openvpn на VPN сервере
# apt-get install openvpn
2) ставим easy-rsa на станции подписей
# apt-get install easy-rsa
3) создаём каталог куда скопируем easy-rsa и там будем изменять настройки, создавать и подписывать сертификаты
# mkdir -p /root/sign-host/easy-rsa # cd /root/sign-host/easy-rsa # cp /usr/share/easy-rsa/* ./
4) проверяем что скопировалось
# ls -1 build-ca build-dh build-inter build-key build-key-pass build-key-pkcs12 build-key-server build-req build-req-pass clean-all inherit-inter list-crl openssl-0.9.6.cnf openssl-0.9.8.cnf openssl-1.0.0.cnf pkitool revoke-full sign-req vars whichopensslcnf
5) меняем переменные в конце файла vars. Размер ключики. Если параноя входит в ваши должностные обязанности то нужно побольше ставить. :)
# mcedit vars ....... export KEY_SIZE=1024 ....... export KEY_COUNTRY="US" export KEY_PROVINCE="CA" export KEY_CITY="SanFrancisco" export KEY_ORG="Fort-Funston" export KEY_EMAIL="me@myhost.mydomain" export KEY_EMAIL=mail@host.domain export KEY_CN=changeme export KEY_NAME=changeme export KEY_OU=changeme export PKCS11_MODULE_PATH=changeme export PKCS11_PIN=1234
changeme – замените на свои значения. Остальные также можно изменить если хотите. На работоспособность это никак не влияет.
Затем генерируем ключи. Команда vars запускается из шела. перед ней через пробел точка.
После её запуска нужно запускать остальные.
# . vars NOTE: If you run ./clean-all, I will be doing a rm -rf on /root/easy-rsa/keys # ./clean-all # ./build-ca myvpn-ca Generating a 1024 bit RSA private key .....++++++ .................++++++ writing new private key to 'ca.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [US]: State or Province Name (full name) [CA]: Locality Name (eg, city) [SanFrancisco]: Organization Name (eg, company) [Fort-Funston]: Organizational Unit Name (eg, section) [my-organization]: Common Name (eg, your name or your server's hostname) [myvpn-server]: Name [myvpn-key]: Email Address [mail@host.domain]:
Получили ключик центра сертификации. Публичный и приватный.
ca.crt ca.key
Следом создадим ключик Diffie Hellman
# ./build-dh
Он может довольно долго работать и создавать ключ. Для 1024-х бит получим файл ./keys/dh1024.pem
Теперь генерируем и подписываем ключ сервера.
./build-key-server myvpn-server-key Generating a 1024 bit RSA private key ............++++++ .......++++++ writing new private key to 'myvpn-server-key.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [US]: State or Province Name (full name) [CA]: Locality Name (eg, city) [SanFrancisco]: Organization Name (eg, company) [Fort-Funston]: Organizational Unit Name (eg, section) [my-organization]: Common Name (eg, your name or your server's hostname) [myvpn-server-key]: Name [myvpn-key]: Email Address [mail@host.domain]: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Using configuration from /root/easy-rsa/openssl-1.0.0.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'US' stateOrProvinceName :PRINTABLE:'CA' localityName :PRINTABLE:'SanFrancisco' organizationName :PRINTABLE:'Fort-Funston' organizationalUnitName:PRINTABLE:'my-organization' commonName :PRINTABLE:'myvpn-server-key' name :PRINTABLE:'myvpn-key' emailAddress :IA5STRING:'mail@host.domain' Certificate is to be certified until May 17 13:58:59 2024 GMT (3650 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated
Это добавило ещё 3 файла в каталог ./keys/
myvpn-server-key.crt myvpn-server-key.csr myvpn-server-key.key
Ну и теперь генерируем ключи для клиентов. Если клиенты будут иметь разные ключи то сколько клиентов столько раз и запускать. Не забывайте каждый раз менять (номер) ключа. Ну или можете назвать по именам реальных клиентов vasya-key, roma-key и т д.
./build-key myvpn-client1-key Generating a 1024 bit RSA private key ...................++++++ ................++++++ writing new private key to 'myvpn-client1-key.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [US]: State or Province Name (full name) [CA]: Locality Name (eg, city) [SanFrancisco]: Organization Name (eg, company) [Fort-Funston]: Organizational Unit Name (eg, section) [my-organization]: Common Name (eg, your name or your server's hostname) [myvpn-client1-key]: Name [myvpn-key]: Email Address [mail@host.domain]: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Using configuration from /root/easy-rsa/openssl-1.0.0.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'US' stateOrProvinceName :PRINTABLE:'CA' localityName :PRINTABLE:'SanFrancisco' organizationName :PRINTABLE:'Fort-Funston' organizationalUnitName:PRINTABLE:'my-organization' commonName :PRINTABLE:'myvpn-client1-key' name :PRINTABLE:'myvpn-key' emailAddress :IA5STRING:'mail@host.domain' Certificate is to be certified until May 17 14:03:29 2024 GMT (3650 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated
Получили три файла на каждого клиента
myvpn-client1-key.crt myvpn-client1-key.csr myvpn-client1-key.key
Ну и для комплекта сгенерим ещё и TA ключ.
openvpn --genkey --secret "$EASY_RSA/keys/myvpn-server-ta.key"
В результате добавится ключик ./keys/myvpn-server-ta.key
Поздравляю! С ключами закончили.
Теперь берите пять (5) ключей:
dh1024.pem ca.crt myvpn-server-ta.key myvpn-server-key.crt myvpn-server-key.key
и копируете на сервер в каталог /etc/openvpn/
Копируете по закрытому соединению. scp например. или флешкой перенесите.
Затем берёте четыре (4) ключа:
ca.crt myvpn-server-ta.key myvpn-client1-key.crt myvpn-client1-key.key
и копируете их на клиента в каталог /etc/openvpn/ или в соответствующий каталог на windows
Аналогично копируете соблюдая меры безопасности.
Теперь осталось сделать конфиги.
Сервер /etc/openvpn/myvpn-server.conf
port 443 proto udp dev tun1 user nobody group nogroup dh /etc/openvpn/dh1024.pem ca /etc/openvpn/ca.crt cert /etc/openvpn/myvpn-server-key.crt key /etc/openvpn/myvpn-server-key.key tls-auth /etc/openvpn/myvpn-server-ta.key 0 server 10.10.0.0 255.255.255.0 push "redirect-gateway" push "dhcp-option DNS 10.10.0.1" push "explicit-exit-notify 3" client-config-dir ccd keepalive 10 60 #duplicate-cn auth SHA1 cipher AES-256-CBC # AES comp-lzo max-clients 128 persist-key persist-tun ifconfig-pool-persist /var/log/openvpn-ipp-udp443.txt status /var/log/openvpn-status-udp443.log log /var/log/openvpn-udp443.log verb 3
Клиенты /etc/openvpn/myvpn-client.conf
client dev tun1 proto udp remote xxx.xxx.xxx.xxx 443 resolv-retry infinite nobind persist-key persist-tun ns-cert-type server ca /etc/openvpn/ca.crt cert /etc/openvpn/myvpn-client1-key.crt key /etc/openvpn/myvpn-client1-key.key tls-auth /etc/openvpn/myvpn-server-ta.key 1 # разрешаем запускать скрипты script-security 2 # на поднятие и опускание vpn запускаем скрипт обновления файла resolv.conf up /etc/openvpn/update-resolv-conf down /etc/openvpn/update-resolv-conf cipher AES-256-CBC log /var/log/openvpn.log comp-lzo verb 3
Готово.
Заускаем
# service openvpn start
Проверяем что запустился
# netstat -nlp -A inet | grep openvpn udp 0 0 0.0.0.0:443 0.0.0.0:* 2075/openvpn
Теперь важно открыть на Firewall UDP 443 на нужном интерфейсе.
# ufw allow 443/udp
И не забыть проверить и настроить SELinux если он установлен и включён.
Если вдруг openvpn не запустился временно отключить SELinux можно так:
# setenforce 0
Дальше нужно включить автозапуск как на сервере так и на клиентах если это нужно.
Для этого раскомментируем или добавим опцию AUTOSTART
# mcedit /etc/default/openvpn ... AUTOSTART=all ...