Remote cert tls server что означает
Перейти к содержимому

Remote cert tls server что означает

  • автор:

Настройка OpenVPN сервера и клиента на Mikrotik

Бывают случаи, когда необходимо настроить удалённый доступ на mikrotik, или даже на несколько.
Особенно это актуально, если вы обслуживаете несколько объектов и нет возможности физически постоянно присутствовать возле оборудования.
В этом статье мы разберём, как настроить OpenVPN сервер на mikrotik, а также клиенты на mikrotik и компьютере под управлением Windows.

Для работы нам понадобиться Белый IP адрес (он и будет адресом сервера в наших настройках), для доступа к серверу из интернета и сертификаты безопасности.

Краткий план данной статьи:

  • Создание сертификатов и ключей OpenVPN
  • Создание сервера OpenVPN на Mikrotik
  • Создание клиента OpenVPN на ПК
  • Создание клиента OpenVPN на Mikrotik

Создание сертификатов и ключей OpenVPN

1) Скачаем программу OpenVPN с официального сайта

Скачаем программу OpenVPN с официального сайта

2) Устанавливаем программу, выбрав все галочки.

EasyRSA Certificate Management Scripts (специально созданная программа по созданию ключей и сертификатов,которая использует openssl для выполнения действий с ключами и сертификатами) нам обязательно понадобится для генерации ключей и сертификатов.

Настройка OpenVPN сервера и клиента на Mikrotik

3) Указываем путь. В дальнейшем он нам понадобиться. В нашем случае используем стандартный C:\Program Files\OpenVPN

4) После установки заходим в C:\Program files\OpenVPN\easy-rsa

Открываем vars.bat (если его нет, то vars.bat.sample) блокнотом или NotePad++ и редактируем его.

set KEY_COUNTRY=RU
set KEY_PROVINCE=MoscowRegion
set KEY_CITY=MOSCOW
set KEY_ORG=OpenVPN
set KEY_EMAIL=mail@mail.com
set KEY_CN=server
set KEY_NAME=server
set KEY_OU=OU
set PKCS11_MODULE_PATH=changeme
set PKCS11_PIN=1234

В строках set KEY_CN и set KEY_NAME указываем server
Последние 2 строки — параметры по умолчанию. Остальное можете редактировать под себя.

Сохраняем файл как vars.bat на рабочий стол, а затем копируем в папку C:\Program files\OpenVPN\easy-rsa
Чаще всего сохранить напрямую в исходную папку не получится — не хватает прав.

5) Отредактируем файл openssl-1.0.0.cnf
Так же открываем с помощью блокнота или notepad++

Нас интересует строка
default_days = 3650 # how long to certify for
Она отвечает за время жизни сертификата. Если значение отличается — то указываем 3650 (10 лет).
Сохраняем.

6) Запускаем командную строку от имени администратора:
Пуск — Все программы — Стандартные
Правой кнопкой мыши на «Командная строка» и в меню — Запустить от имени администратора
Командную строку не закрываем до конца процесса генерации сертификатов.

Настройка OpenVPN сервера и клиента на Mikrotik

7) По очерёдно выполняем следующие три команды
cd: C:\Program files\OpenVPN\easy-rsa
vars
clean-all

В итоге мы должны увидеть сообщение «Скопировано файлов: 1» дважды.

Настройка OpenVPN сервера и клиента на Mikrotik

В папке C:\Program files\OpenVPN\easy-rsa появится папка keys с двумя файлами index.txt и serial

Настройка OpenVPN сервера и клиента на Mikrotik

8) Генерируем ключ Диффи Хельмана — команда build-dh
Генерация займёт некоторое время. Дождитесь окончания.

9) Генерируем ключ центра сертификации (CA) — build-ca

Нажимаем Enter пока не закончатся вопросы.
Вы увидите в командной строке путь C:\Program files\OpenVPN\easy-rsa

Настройка OpenVPN сервера и клиента на Mikrotik

Нет смысла менять заданные значения. Вы ранее прописали эти параметры в файле vars.bat

10) Генерируем сертификат сервера — команда build-key-server server
Нажимаем Enter (оставляем параметры по умолчанию, прописанные в vars.bat) пока не дойдём до вопросов.
Sign the certificate? (Создание сертификата на 3650 дней)
1 out of 1 certificate requests certified, commit? (Запись сертификата в базу)
На вопросы отвечаем нажатием Y

Настройка OpenVPN сервера и клиента на Mikrotik

11) Генерируем сертификат клиента build-key client
Нажимаем Enter (оставляем параметры по умолчанию, прописанные в vars.bat) пока не дойдём до вопросов Common Name и Name.
На эти вопросы отвечаем client — это название создаваемого сертификата.

На вопросы Sign the certificate? и 1 out of 1 certificate requests certified, commit? отвечаем нажатием Y

12) Генерация сертификатов окончена.
В папке C:\Program files\OpenVPN\easy-rsa\keys можно увидеть следующие файлы

Настройка OpenVPN сервера и клиента на Mikrotik

Сертификаты для сервера и клиентов готовы.

Настройке OpenVPN сервера на Mikrotik

Подключимся к Mikrotik с помощью программы Winbox.
Загрузим 3 файла: ca.crt, server.crt, server.key
Для этого в меню нажмём Files и перетащим их из папки C:\Program files\OpenVPN\easy-rsa\keys

Настройка OpenVPN сервера и клиента на Mikrotik

13) Далее необходимо их импортировать.
Откроем System – Certificates — Import и поочерёдно выберем сертификаты в этом порядке:
ca.crt
server.crt
server.key

Настройка OpenVPN сервера и клиента на Mikrotik

После импорта появится две записи

Настройка OpenVPN сервера и клиента на Mikrotik

14) Создадим пул адресов для VPN клиентов

IP — Pool — add (+)
Введём название openvpn-pool
Диапазон 172.30.0.2-172.30.0.253

Настройка OpenVPN сервера и клиента на Mikrotik

15) Создадим PPP профиль.

PPP — Profiles — add (+)
Введём название openvpn
Локальный адрес 172.30.0.1
Созданный Пул openvpn-pool
Остальные настройки оставляем по умолчанию
Нажимаем ОК

Настройка OpenVPN сервера и клиента на Mikrotik

16) Создадим непосредственно сам OpenVPN сервер
PPP — Interface — OVPN Server
Включаем Enable
Указываем порт 1194
Выбираем наш профиль openvpn
Поставим галочку Require Client Certificate
Выберем наш сертификат server.crt

Настройка OpenVPN сервера и клиента на Mikrotik

17) Создадим пользователя для подключения.
PPP — Secrets — add (+)
Введём имя пользователя и пароль ovpn_user1
Выбираем Сервис ovpn и профиль openvpn

Настройка OpenVPN сервера и клиента на Mikrotik

Создадим 2 пользователя:

ovpn_user1 для клиента на компьютере

ovpn_mikrotik1 для клиента на Mikrotik

Рекомендуется для каждого VPN клиента создавать отдельное уникальное имя пользователя.
В дальнейшем это упростит работу и позволит отслеживать всех подключенных VPN клиентов.

18) Настроим фаервол
IP — Firewall — add(+)
Во вкладке General указываем:
Chain — input
Protocol — tcp
Порт 1194
Интерфейс — ether1 (Если интернет идёт через него)
Вкладка Action:
Action — accept
Затем ОК

Настройка OpenVPN сервера и клиента на Mikrotik

Сервер настроен, теперь приступим к настройке VPN клиентов.

Настройка VPN клиента на компьютере под управлением Windows

19) Копируем в папку C:\Program files\OpenVPN\config\

из C:\Program files\OpenVPN\easy-rsa\keys следующие файлы
ca.crt, client.crt, client.key.

из C:\Program files\OpenVPN\simple-config\
client.ovpn

Создадим текстовый файл pass, где укажем логин и пароль от созданного VPN клиента на сервере.
В нашем случае это ovpn_user1

Настройка OpenVPN сервера и клиента на Mikrotik

20) Откроем файл client.ovpn с помощью блокнота или notepad++
Изменяем следующие строки:
#Протокол
proto tcp
#Адрес и порт сервера
remote ваш.ip.адрес.сервера 1194

#Проверяем правильность названия ключей
ca ca.crt
cert client.crt
key client.key

И в самом конце добавим строчку
auth-user-pass «C:\\Program files\\OpenVPN\\config\\pass.txt»
В общем итоге у нас получатся следующие настройки в этом файле:
client
dev tun
proto tcp
remote адрес_сервера 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert user.crt
key user.key
remote-cert-tls server
cipher AES-128-CBC
verb 3
auth-user-pass «c:\\Program Files\\OpenVPN\\config\\pass.txt»

Остальные настройки закоментированы решеткой «#» или точкой с запятой «;»

21) Сохраняем файл. Если сохранить в папку не получается — сохраняем на рабочий стол, а затем копируем с заменой.

Запускаем OpenVPN и подключаемся.

Настройка OpenVPN сервера и клиента на Mikrotik

После подключения можем увидеть, что нам назначен IP из диапазона, который ранее указали на сервере.

Настройка OpenVPN сервера и клиента на Mikrotik

Настройка VPN клиента на Mikrotik

Имея настроенный OpenVPN сервер, можно настроить доступ на Mikrotik даже там, где нет белого IP адреса.

22) Подключимся к Mikrotik с помощью программы Winbox.
Загрузим 2 файла: client.crt, client.key

Для этого в меню нажмём Files и перетащим их из папки C:\Program files\OpenVPN\easy-rsa\keys

Настройка OpenVPN сервера и клиента на Mikrotik

23) Далее необходимо их импортировать.
Откроем System – Certificates — Import и поочерёдно выберем сертификаты в этом порядке:
client.crt
client.key

Настройка OpenVPN сервера и клиента на Mikrotik

24) Настроим параметры сервера:
PPP — add(+) — OVPN client

Настройка OpenVPN сервера и клиента на Mikrotik

Во вкладке General указываем имя
Name — openVPN1 (любое, на ваше усмотрение)
Вкладка Dial Out:
Connect To — Адрес сервера(Внешний IP адрес главного hjenthf Mikrotik)
Port 1194
Указываем пользователя и пароль, который мы создали на VPN сервере
В нашем случае это пользователь ovpn_mikrotik1
Сертификат Client.crt

Нажимаем ОК

Настройка OpenVPN сервера и клиента на Mikrotik

25) В терминале набираем /interface ovpn-client monitor openVPN1
Должно появиться сообщение со статусом connected

Настройка OpenVPN сервера и клиента на Mikrotik

Теперь к этому mikrotik можно подключиться через VPN по адресу, который он поулчил от VPN сервера

Настройка OpenVPN сервера и клиента на Mikrotik

Посмотреть адрес можно:
В Mikrotik-клиенте в IP-Adresses строка с нашим интерфейсом openVPN1

Настройка OpenVPN сервера и клиента на Mikrotik

В Mikrotik-сервере PPP-Active Connections

Введение

OpenVPN — кроссплатформенное, гибкое и удобное решение для организации VPN.

Для допуска в виртуальную сеть, построенную на базе OpenVPN, клиент должен авторизоваться. В OpenVPN это можно сделать 3 способами:

  • по логину и паролю
  • по ключу и сертификату в файлах ( См. Управление сертификатами и ключами для клиентов OpenVPN)
  • по ключу и сертификату на «борту» криптографического USB-токена или смарт-карты

В статье будет описана авторизация в OpenVPN с помощью криптографического USB-токена Рутокен ЭЦП. Рутокен ЭЦП надежно защищен PIN-кодом от несанкционированного доступа и блокируется при исчерпании попыток ввода PIN-кода, поэтому злоумышленник не попадет в VPN даже в случае кражи токена. Кроме того, в Рутокен ЭЦП аппаратно реализованы алгоритмы ГОСТ и RSA, поэтому аутентификация производится «на борту» токена. Благодаря этому закрытый ключ никогда не покидает токен и его невозможно украсть из оперативной памяти компьютера с помощью троянов.

В статье будет показано, как развернуть тестовый VPN, а также корпоративный УЦ на базе приложения XCA. С помощью УЦ будет создан ключ и сертификат сервера OpenVPN и произведена инициализация токена клиента. Затем настроим клиент OpenVPN таким образом, чтобы пользователь мог авторизоваться в OpenVPN с помощью Рутокен ЭЦП.

Стенд с сервером OpenVPN и XCA поднят на Astra Linux РУСБ.10015-01очередное обновление 1.6 оперативное обновление 2

Установка и настройка удостоверяющего центра на сервере

Установка

Для начала установим системные компоненты и утилиты, необходимые для работы Рутокен ЭЦП и XCA:

sudo apt install libccid libpcsclite1 pcscd xca

Для установки библиотеки librtpkcs11ecp.so следует перейти по указанной ссылке и скачать необходимую версию:

sudo dpkg -i librtpkcs11ecp_1.8.2.0-1_amd64.deb

Меню «Пуск» → Утилиты → Цифровые сертификаты XCA

Настройка

Создание новой базы данных

Файл→ Новая база данных (Ctrl+N) и сохраняем ее в удобном для Вас месте

Создание ключа УЦ

Создадим ключ УЦ: Раздел «Закрытые ключи»→ «Новый ключ», назовем его CAkey, Keytype выбираем RSA, Keysize 2048 bit.

Создание сертификата УЦ

Создадим сертификат УЦ: раздел «Сертификаты» → «Новый сертификат» согласно нижеуказанным скриншотам:

Источник

Создание сертификата сервера OpenVPN

Создадим ключ сервера OpenVPN: раздел «Закрытые ключи» → «Новый ключ», назовем его Openvpnkey, Keytype — RSA, Keysize — 2048 bit.

Создадим сертификат сервера: раздел «Сертификаты»→ «Новый сертификат» согласно представленным скриншотам.

Создание сертификата клиента на Рутокен ЭЦП

Подключение библиотеки pkcs#11

Для работы с Рутокен ЭЦП, утилите XCA нужно указать библиотеку PKCS#11 АктивСофта.

Для этого указываем путь к ней: Файл → Опции → PKCS#11 provider → «Добавить» и указываем путь до библиотеки pkcs11(/opt/aktivco/rutokenecp/x86_64/librtpkcs11ecp.so)

Генерация ключей на Рутокен ЭЦП

Далее подключаем Рутокен ЭЦП и создаем ключ «на борту» Рутокен ЭЦП: раздел «Закрытые ключи» → «Новый ключ» → назовем его Clientkey, Keytype — RSA(!) на рутокене, Keysize — 2048 bit.

По запросу вводим PIN-код.

Создание сертификата клиента

Когда XCA предложит сохранить сертфикат на токен, нажимаем «Да» и вводим PIN-код.

Далее э кспортируем сертификат УЦ в файл CA.crt, сертификат сервера в файл Openvpn.crt и ключ сервера в файл openvpn.pem (Закрытые ключи→ Экспорт , Сертификаты → Экспорт ) и сохраним их к примеру в своей домашней директории.

OpenVPN

Установка на сервер

Пакет openvpn входит в дистрибутивы ОС Astra Linux, и устанавливается по умолчанию.

Для быстрой настройки можно рекомендовать дополнительно установить пакеты

  • для машины, предназначенной на роль сервера:
    • графический инструмент fly-admin-openvpn-server
    • или инструмент командной строки astra-openvpn-server

    При установке пакетов fly-admin-openvpn-server и astra-openvpn-server автоматически будет установлен пакет libgost-astra, поддерживающий защитное преобразование информации в соответствии с алгоритмами ГОСТ.

    sudo apt-get install fly-admin-openvpn-server

    Настройка

    Создание DH (Diffie Hellman) ключа

    Вы можете создать файл параметров Diffie Hellman (Диффи-Хелмана) с помощью openssl:

    openssl dhparam -out dh2048.pem 2048

    Вы можете заменить 2048 на другие цифры, например на 4096.

    Если число выше, безопасность параметров будет выше, но вашему серверу или компьютеру потребуется больше времени для генерации двух простых чисел этой длины.

    Более низкие номера имеют более низкую безопасность, но требуют значительно меньшего времени для создания

    Создание конфигурационного файла

    Создаем конфигурационный файл сервера OpenVPN:

    nano openvpn.conf

    Cо следующими параметрами:

    port 1194 proto tcp dev tap ca /home/u/openvpn/CA.crt cert /home/u/openvpn/Openvpn.crt key /home/u/openvpn/Openvpnkey.pem dh /home/u/openvpn/dh2048.pem server 10.0.0.0 255.255.255.0 ifconfig-pool-persist ipp.txt keepalive 10 120 cipher BF-CBC comp-lzo persist-key persist-tun status openvpn-status.log verb 3

    Параметры конфигурационного файла

    Параметр Значения Описание
    client Строка говорит о том, что конфигурационный файл описывает клиентское подключение (программа сама устанавливает соединение, а не ждет, как сервер).
    dev tap или tun Выбор виртуального сетевого драйвера. TUN — сетевой уровень модели OSI, оперирует IP-пакетами. TAP — эмулирует Ethernet устройство и работает на канальном уровне модели OSI, оперируя кадрами Ethernet. Настраивая OpenVPN клиента, в большинстве случаев, необходимо выбирать tun. TAP необходимо использовать для работы определенных сервисов, например DHCP.
    dev-node любая строка Параметр используется в системах Windows в случаях, если имеется несколько сетевых интерфейсов. Значение этого параметра должно содержать название сетевого подключения, через который должен работать OpenVPN.
    proto udp или tcp Указывает, какой протокол использовать для передачи данных. В большинстве случаев, лучше использовать UDP, так как данный протокол создает меньше нагрузки на сеть.
    remote VPN-сервер и порт Задает сервер, к которому должен подключаться клиент, а также сетевой порт, на котором OpenVPN принимает запросы. Можно указать несколько строк.
    remote-random Если указано несколько строк remote, данный параметр говорит, что необходимо подключаться к удаленным серверам в случайном порядке.
    resolv-retry количество секунд или infinite Используется в тех случаях, когда в качестве сервера указано доменное имя. Параметр задает время в секундах для повторного переподключения, если не удалось узнать имя сервера. infinite — держать связь с сервером постоянно.
    nobind Клиент использует динамический порт для подключения.
    user учетная запись Задает определенного пользователя для работы клиента (только для UNIX-систем).
    group группа Задает определенную группу для работы клиента (только для UNIX-систем).
    persist-key Не перечитывает ключи при перезагрузке сервиса OpenVPN.
    persist-tun Не перечитывает параметры туннеля при перезагрузке сервиса OpenVPN.
    http-proxy сервер прокси и порт Использовать прокси-сервер для подключения.
    http-proxy-retry Переподключаться к прокси-серверу, если связь была разорвана.
    http-proxy-timeout количество секунд Время, через которое выполнять попытки переподключения к прокси-серверу.
    mute-replay-warnings Параметр стоит задавать при использовании беспроводного соединения. Он отключит дублирование предупреждений пакетов.
    ca пут к сертификату Корневой сертификат удостоверяющего центра. Генерируем на сервере.
    cert пут к сертификату Открытый ключ клиента. Генерируем на сервере.
    key пут к сертификату Закрытый ключ клиента. Генерируем на сервере.
    dh пут к сертификату Ключ с алгоритмом Diffie-Hellman (Диффи-Хеллмана).
    remote-cert-tls сервер Исключает возможность mitm атаки, включая верификацию сертификата сервера.
    tls-client Указание на то, что это клиент TLS.
    tls-auth ta.key 1 Дополнительный уровень аутентификации посредством ключа TLS.
    float Удаленный хост может менять IP-адрес в процессе соединения, при этом последнее не будет разорвано.
    keepalive секунд1 секунд2 Пинговать каждые секунд1 сервер и если в течение секунд2 не будут получены ответные пакеты, перезапустить подключение.
    cipher алгоритм Указывает алгоритм защитного преобразования данных. Примеры: AES-256-CBC, AES-128-CBC, BF-CBC, DES-EDE3-CBC.
    comp-lzo Использовать сжатие.
    verb число от 0 до 9 Уровень детализации лога. 0 отключает отладочную информацию.
    mute число Указывает сколько лог-сообщений может отображаться для каждой категории события.
    auth-user-pass ничего или путь к файлу Говорит клиенту, что необходима аутентификация. Если не указан путь к файлу, клиент выкинет окно для авторизации, иначе прочитает данные из файла.
    ipchange команда или путь к скрипту Выполняет команду при смене IP.
    connect-retry секунд Переподключиться к серверу через указанное количество секунд, если соединение было разорвано.
    connect-retry-max число Сколько раз повторять соединение, если оно было разорвано.
    shaper байт Задает максимальную скорость передачи данных для исходящего трафика.
    tun-mtu число Задает MTU.
    status путь к файлу Путь к фалу хранения статуса.
    log путь к файлу Путь к лог-файлу.

    Наиболее полный и актуальный список параметров для OpenVPN можно получить командой openvpn —help

    Запуск OpenVPN

    Запускаем сервер OpenVPN

    $ sudo openvpn —config /home/u/openvpn/openvpn.conf

    В «боевой» конфигурации сервер следует запускать как демон и ключи/сертификаты не должны лежать в /home

    Настройка клиентской машины

    Установка компонентов для работы с Рутокен ЭЦП

    На клиентской машине устанавливаем пакеты, необходимые для работы Рутокен ЭЦП:

    sudo apt install pcscd libpcsclite1 libccid
    sudo dpkg -i librtpkcs11ecp_1.8.2.0-1_amd64.deb

    Установка OpenVPN на клиенте

    sudo apt install openvpn

    Копируем с сервера сертификат Удостоверяющего Центра (УЦ) к примеру в раздел /home/client/openvpn/CA.crt

    Создаем конфигурационный файл клиента

    nano openvpnclient.conf
    Cо следующими параметрами:

    client dev tap proto tcp remote 192.168.xxx.xxx 1194 resolv-retry infinite nobind persist-key persist-tun ca /home/client/openvpn/CA.crt pkcs11-providers /usr/lib/librtpkcs11ecp.so pkcs11-id 'Aktiv\x20Co\x2E/Rutoken\x20ECP/2f996caf/Rutoken\x20ECP\x20\x3Cno\x20label\x3E/3C9F594E0994420E' pkcs11-pin-cache 300 comp-lzo verb 3

    В параметре remote указываем ip-адрес VPN-сервера

    В параметре pkcs11-providers указываем путь к библиотеке PKCS#11 Рутокен.

    В параметре pkcs11-id указываем ID контейнера, в котором на Рутокен ЭЦП хранятся ключ и сертификат. Узнать этот ID можно с помощью команды:

    sudo openvpn —show-pkcs11-ids /usr/lib/librtpkcs11ecp.so

    Подключение к VPN-серверу

    Подключаемся к VPN-серверу:

    sudo openvpn —config /home/client/openvpnclient.conf

    По запросу следует ввести PIN-код к Рутокену ЭЦП.

    Как создать и настроить свой VPN-сервер

    Сейчас на рынке существует множество готовых VPN-сервисов, но не все они достаточно надежны и стабильны. К тому же большинство из них имеют низкую скорость передачи данных, из-за чего страницы загружаются очень долго. Решить эти проблемы легко — для этого достаточно создать собственный VPN-сервер. О том, как поднять свой VPN на сервере, расскажем ниже.

    Зачем нужен VPN

    VPN (виртуальная частная сеть) — это технология, которая обеспечивает безопасное и защищенное подключение к интернету. Она создает виртуальный туннель между вашим устройством и глобальной сетью, шифрует все данные и направляет их через удаленный сервер. VPN используется для шифрования трафика, изменения IP-адреса и местоположения пользователя. С помощью VPN вы можете безопасно работать в незащищенной сети (такой, как Wi-Fi в кафе или отеле) и не бояться, что ваши данные перехватят злоумышленники. Также VPN помогает обойти блокировки различных ресурсов.

    Что такое OpenVPN

    OpenVPN — популярная реализация технологии VPN с открытым исходным кодом. С его помощью вы можете создать собственный VPN-сервер с высоким уровнем безопасности гибкими настройками. OpenVPN поддерживает Windows, MacOS, Linux, Android, iOS и ChromeOS, поэтому вы сможете использовать его на разных устройствах.

    Как арендовать и настроить свой ВПН-сервер

    Чтобы обзавестись собственным VPN, вам необходимо арендовать облачный сервер VPS и развернуть на нем OpenVPN. Конфигурация сервера может быть любой, поэтому подойдет даже минимальный тариф. При заказе сервера нужно выбрать операционную систему Ubuntu 20.04:

    Создаем собственный VPN-сервер: установка OpenVPN

    Мы производили установку на сервер с ОС Ubuntu 20.04 — для других версий процесс установки и настройки может отличаться. Чтобы начать установку, подключитесь к серверу по SSH.

    Установка пакетов

    1. Обновите списки пакетов с помощью команды:

    OpenVPN and remote-cert-tls server

    This required a bit of digging into OpenVPN’s and OpenSSL’s code to figure out.

    The problem

    Thu Sep 11 00:12:05 2014 Validating certificate key usage Thu Sep 11 00:12:05 2014 ++ Certificate has key usage 00f8, expects 00a0 Thu Sep 11 00:12:05 2014 ++ Certificate has key usage 00f8, expects 0088

    The condition

    Using openvpn with the following option:

    remote-cert-tls server

    The solution

    (for me) to add this to openvpn’s config file:

    remote-cert-ku f8

    The explanation

    Background

    remote-cert-tls attempts to solve one problem: Lets say you run a CA and you distribute the certificates to 2 people including me and you. Then you setup a VPN server for us to use and you generate another certificate for the VPN server.

    As always, the problem that certificates attempt to solve is “how do you know you’re connecting to the remote end you assume you are. In normal SSL pages you trust a CA to verify that the CN of the certificate matches the owner of the domain. If you want to achieve the same thing with openvpn then you need to verify the CN of the remote end against either the hostname or a predefined string. If not then you need to use the “remote-cert-tls server” option.

    If you don’t use any of the above methods then I can fire up an openvpn server using the certificate you provided me with and since both my certificate and the actual VPN server’s certificate are signed by the same CA you would be verifying both and be equally willing to connect to both, thus allowing me to spy on you.

    To solve this kind of problems X509 has some properties for certificates that designate them for certain purposes. E.g. one of them is to run a VPN endpoint (TLS Web Client Authentication)

    To be precise there are 2+1 such designations in X509:

    X509v3 Key Usage: Digital Signature, Non Repudiation, Key Encipherment, Data Encipherment, Key Agreement X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication, IPSec End System, IPSec Tunnel, Time Stamping Netscape Cert Type: SSL Client, SSL Server, S/MIME, Object Signing

    “Netscape Cert Type” is kind of old. “Key Usage” is the main one and “Extended Key Usage” is the final addition. Ignoring NS Cert Type, “Key Usage” is a bitmap and thus has limited space for expansion. “Extended Key Usage” on the other hand is a list of object identifiers which allows for unlimited expansion.

    The certificate

    The certificate I was using for the server-side of the OpenVPN had the above attributes. Ignoring NS Cert Type once more, the other two correspond to the following data:

    494:d=5 hl=2 l= 3 prim: OBJECT :X509v3 Key Usage 499:d=5 hl=2 l= 4 prim: OCTET STRING [HEX DUMP]:030203F8 433:d=5 hl=2 l= 3 prim: OBJECT :X509v3 Extended Key Usage 438:d=5 hl=2 l= 52 prim: OCTET STRING [HEX DUMP]:303206082B0601050507030106082B0601050507030206082B0601050507030506082B0601050507030606082B06010505070308

    Starting with “Key Usage”, the actual value is “F8”. The meaning of each bit can be found in OpenSSL’s code:

    #define KU_DIGITAL_SIGNATURE 0x0080 #define KU_NON_REPUDIATION 0x0040 #define KU_KEY_ENCIPHERMENT 0x0020 #define KU_DATA_ENCIPHERMENT 0x0010 #define KU_KEY_AGREEMENT 0x0008 #define KU_KEY_CERT_SIGN 0x0004 #define KU_CRL_SIGN 0x0002 #define KU_ENCIPHER_ONLY 0x0001 #define KU_DECIPHER_ONLY 0x8000

    On the other hand, the “Extended Key Usage” part contains the following Object IDs:

    06082B 06010505070301 -> serverAuth (TLS Web Server Authentication) 06082B 06010505070302 -> clientAuth (TLS Web Client Authentication) 06082B 06010505070305 -> ipsecEndSystem (IPSec End System) 06082B 06010505070306 -> ipsecTunnel (IPSec Tunnel) 06082B 06010505070308 -> timeStamping (Time Stamping)

    The “bug”

    The first thing to notice is that the failure is for “Key Usage” and not for “Extended Key Usage” (took me some time to figure out).

    After that, a bit of digging into the code confirms that OpenVPN attempts to verify a bitmap with equality. I.e. it gets the certificates’ value and compares it against a predefined list of allowed values, which according to OpenVPN’s documentation defaults to “a0 88” (which means one of them). However the actual certificates bitmap value is 0xf8 as mentioned above. And thus the comparison fails with the error:

    Thu Sep 11 00:12:05 2014 Validating certificate key usage Thu Sep 11 00:12:05 2014 ++ Certificate has key usage 00f8, expects 00a0 Thu Sep 11 00:12:05 2014 ++ Certificate has key usage 00f8, expects 0088

    The reason I’m calling this a bug is because it’s not sensible to use equality to compare against a bitmap. Instead one can use AND, in which case there would be:

    ( & ) == or: ( 0xf8 & 0xa0) == 0xa0 -> True

    In order for the validation to succeed with the defaults the certificate should have one of the following designations:

    0xa0: Digital Signature, Key Encipherment 0x88: Digital Signature, Key Agreement

    The solution

    So there, since the comparison is done with equality you can do one of the following:

    • Use the above Key Usage on the certificate (inconvenient)
    • Don’t use “remote-cert-tls server” (bad)
    • Use “remote-cert-ku XX” where XX is the value of your certificate which can be seen in OpenVPN’s messages (the last octet). In my case it’s f8.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *