Целый день угрохал на понимание того, для чего нужны всякие сертификаты и ключи, мучился несколько часов, экспериментируя с OpenVPN... Делюсь с народом собственным маном (ибо на help.ubuntu.ru не понятно)
1. Что такое OpenVPN и для чего оно надо?OpenVPN - это отличная программа для создания виртуальных частных сетей (
Virtual Private Network) с широкими возможностями по защите передаваемого трафика криптографическими методами. Пригодиться VPN может любому, кто хочет объединить несколько сетей или компьютеров в одну сеть, например, локальные сети филиалов компании в одну общую или несколько домашних компьютеров, находящихся в разных городах или за NAT-сервером провайдера. Подробнее можно почитать на официальном сайте
http://openvpn.net или
Википедии.
Установка:
# apt-get update
# apt-get install openvpn
2. Возможности OpenVPN по шифрованиюOpenVPN можно использовать в нескольких режимах, в том числе и без шифрования трафика, но в таком случае мы просто не сможем соединить более двух компьютеров (да и зачем "светить" свой трафик всем желающим?). Поэтому, перейдем сразу к теории... Работает это хитрое дело на так называемых сертификатах и ключах:
2.1. Асимметричное шифрование - это такой вид шифрования, когда используется связанная пара ключей (открытый и закрытый), с помощью которых можно шифровать что-либо таким образом, что , например, сообщение, зашифрованное открытым ключом, можно расшифровать только закрытым (для некоторых алгоритмов шифрования, возможно и обратное). Поэтому, если мы желаем получать конфиденциальные сообщения, нам нужно дать свой открытый ключ тому, кто будет шифровать для нас сообщения, а закрытый ключ будет лежать у нас в надежном сейфе и никто, кроме нас не сможет расшифровать сообщение.
2.2. Электронная цифровая подпись. В виду того, что некоторые алгоритмы асимметричного шифрования позволяют шифровать сообщения закрытым ключом, а расшифровывать открытым и наоборот, мы можем зашифровать некое сообщение закрытым ключом и любой желающий сможет убедиться, что это сообщение отправлено именно нами, когда расшифрует его открытым ключом (который доступен каждому). То есть, мы можем как бы поставить подпись.
2.3. Цифровой сертификат - документ, удостоверяющий принадлежность ключей конкретному лицу. В сертификате указывается кто именно владеет ключами, содержится открытый ключ, отпечаток закрытого ключа (не сам ключ), срок действия сертификата, электронная подпись лица, выдавшего сертификат и информация о том, кто его выдал. Если коротко и "на пальцах", то это электронный документ, который нам выдал уважаемый всеми Борис Серафимович, которому все доверяют и на котором есть его подпись. Сертификат не является тайной и его можно спокойно опубликовать., он будет подтверждать, что сообщения, подписанные нашим закрытым ключом подписаны именно нами и ни кем другим и Борис Серафимович тому гарант.Существуют центры сертификации, которые за приличные барыши могут подписать нам ключи, но платить не очень хочется... В таком случае мы сами себе можем выдать такой сертификат и заверить им свои ключи. Такой сертификат называется самоподписанным и служит для заверения других ключей, принадлежащих кому-нибудь другому.Приступим. Создадим самоподписанный сертификат и закрытый ключ, которыми мы будем заверять ключи и сертификаты клиентов, желающих подключиться к нашему серверу. Я не стал использовать скрипты, поставляемые в комплекте с OpenVPN, потому что хотел сам разобраться что к чему и как работает. Делается это с помощью консольной утилиты OpenSSL:
openssl req -new -x509 -keyout my-ca.pem -out my-ca.crt
Подробнее: req - запрос на создание сертификата, -x509 - создать самоподписанный сертификат стандарта X.509 (в Википедию, если интересно), -keyout - записать закрытый ключ в файл, -out - записать сертификат в файл. В процессе создания, первым делом, нам предложат ввести пароль для закрытого ключа (крайне важно). Придумываем пароль, вводим, подтверждаем. Далее, будет задано несколько вопросов о том, кто мы такие. Вводим международное обозначение страны, например RU, UA, CN, далее указываем регион, город/село/деревню, название нашей организации, свои ФИО, адрес электронной почты. Все. Наш корневой самоподписанный сертификат готов к употреблению.Далее, нам потребуется создать пару "ключ-сертификат" для каждого клиента, желающего подключиться к нашему серверу. Для этого малость подправим конфиг OpenSSL. Открываем файл /usr/lib/ssl/openssl.cnf и меняем значение параметра policy на:
policy = policy_anything
Это для того, чтобы можно было подписывать любые сертификаты. После чего создаем следующие папки и файлы (все в той же директории):
mkdir -p ./demoCA/newcerts
touch ./demoCA/index.txt
echo '1' > ./demoCA/serial
(без этого OpenSSL будет сильно ругаться).Теперь генерируем запрос на сертификат для каждого пользователя:
openssl req -new -nodes -keyout user_1.pem -out user_1.crs
-nodes - означает, что шифровать закрытый ключ не нужно (иначе при каждом запуске туннеля надо будет вводить пароль на ключ). Так же вводим описание для владельца ключа, как и ранее.
И подписываем запрос на сертификат своим самоподписанным:
openssl ca -cert my-ca.crt -keyfile my-ca.pem -days 365 -in user_1.crs -out user_1.crt
Отвечаем два раза положительным "игреком" (y), в итоге, получаем связку "ключ-сертификат" для пользователя user_1.Если пользователей много, то можно автоматизировать процесс, задействовав скрипты из комплекта OpenVPN. Ман смотреть
тут.
Последние действие - создание параметров Диффи-Хеллмана (исключительно для сервера):
openssl gendh -out server.dh
В общем-то, с криптографией больше возиться не придется. Файлы запросов на сертификаты можно удалить:
rm user_*.crs
3. Настройка сервера.Перемещаем файлы ключей и сертификатов в любую удобную директорию. Я поместил прямо в папке настроек OpenVPN.
mv ./server.crt /etc/openvpn
mv ./server.pem /etc/openvpn
mv ./my-ca.crt /etc/openvpn
mv ./server.dh /etc/openvpn
Далее устанавливаем владельца перемещенных фалов root и на файл server.pem назначаем права 400, безопасности ради.Создаем файл конфигурации /etc/openvpn/server.conf следующего содержания (минимальный конфиг):
user nobody # не даем привелегий
group nogroup # процессу OpenVPN
mode server # включаем сервер
tls-server # в режиме TLS
ca /etc/openvpn/my-ca.crt # Наш сертификат, которому "доверяют"
cert /etc/openvpn/server.crt # Сертификат самого сервера
key /etc/openvpn/server.pem # Закрытый ключ сервера
dh /etc/openvpn/server.dh # Параметры Диффи-Хеллмана
dev tap # Виртуальная сетевая карта
persist-tun # Сохранять устройство при перезагрузке соединения
persist-key # Не перечитывать файлы ключей при перезагрузке соединения
ifconfig 192.168.0.1 255.255.255.0 # Адрес нашего виртуального устройства и маска подсети
topology subnet # Явно указываем, что это подсеть
proto tcp-server # Включаем режим "прослушки" по tcp-протоколу (по умолчанию udp)
port 10000 # Указываем портна котором будет "слушать" сервер
max-clients 10 # Максимальное число клиентов
comp-lzo yes # Включить сжатие трафика
Можно проверить сервер на работоспособность, выполнив команду:
openvpn --config /etc/openvpn/server.conf
Дополнительные параметры настройки сервера (и клиента) смотрим
здесь.
4. Настройка клиента.Чтобы клиент мог подключиться, ему нужно иметь у себя пару "ключ-сертификат", которую мы ранее сгенерировали и наш самоподписанный сертификат (передаем их клиенту в запароленном архиве). Файлы:
my-ca.crt
client_N.pem
client_N.crt
На стороне клиента создаем конфиг /etc/openvpn/client.conf (минимальный):
user nobody
group nogroup
ca /etc/openvpn/my-ca.crt
cert /etc/openvpn/client_1.crt
key /etc/openvpn/client_1.pem
dev tap
persist-tun
persist-key
ifconfig 192.168.0.2 255.255.255.0 # Адрес устройства клиента маска подсети (должна совпадать с маской сервера)
topology subnet
nobind # использовать динамический порт для подключения
proto tcp-client
tls-client
port 10000
comp-lzo yes
Подключаемся к серверу:
openvpn --remote АЙПИСЕРВЕРА --config /etc/openvpn/client.conf
, где АЙПИСЕРВЕРА - внешний белый IP сервера.В общем-то, все. Сервер работает и принимает несколько соединений.З.Ы. Если есть чем дополнить или где поправить - милости просим.