Параметры стенда
ip сервера=10.0.2.15
OS сервера = Ubuntu
...
Info |
---|
За основу настройки сервера и клиента была взята эта статья. Для настройки клиента с аутентфикацией по ГОСТу можно можно воспользоваться данной статьей |
Настройка сервера
Произведем Выполним первичную настройку на сервересервера:
Code Block |
---|
language | bash |
---|
title | Первичная настройка сервера |
---|
|
# Настраиваем firewall для приема соединений на 443 порту
sudo ufw allow 443/tcp
sudo ufw allow 22/tcp
sudo ufw enable
# СтавимУстанавливаем необходимые пакеты
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install stunnel4 openssl opensc libengine-pkcs11-openssl1.1
# В нашем случае дополнительно нужно будет поставить сервис ssh
sudo apt-get install ssh
# И запустить его (предварительно перед этим можете настроить его нужнымлюбым для Вас способом)
sudo systemctl start ssh
# Установим библиотеку pkcs11
wget https://download.rutoken.ru/Rutoken/PKCS11Lib/Current/Linux/x64/librtpkcs11ecp_2.0.5.1-1_amd64.deb
sudo dpkg -i librtpkcs11ecp_2.0.5.1-1_amd64.deb
# Создадим папку для хранения сертификатов
sudo mkdir /var/lib/stunnel4/certs |
Создадим файл с файл /etc/stunnel/stunnel.conf с конфигурацией stunnel
Code Block |
---|
language | bash |
---|
title | /etc/stunnel/stunnel.conf |
---|
|
; **************************************************************************
; * Global options *
; **************************************************************************
; Установим уровень отладочных сообщений
debug = 7
; Лог-файл
output = /var/lib/stunnel4/stunnel.log
; Не использовать syslog
syslog = no
; **************************************************************************
; * Service defaults may also be specified in individual service sections *
; **************************************************************************
; Сертификат/ключ сервера
cert = /etc/stunnel/servercert.pem
key = /etc/stunnel/serverkey.pem
; Проверка сертификата. 0 - не проверять, 1 - проверять при наличии, 2 - проверять всегда, ...
verify = 2
; Каталог для разрешенных сертификатов.
; Находится в окружении. Для каждого сертификата должна быть хэшхеш-ссылка
CApath = /var/lib/stunnel4/certs
; Не использватьиспользовать SSLv2
options = NO_SSLv2
; **************************************************************************
; * Service definitions (remove all services for inetd mode) *
; **************************************************************************
[ssh]
; Принимать соединения на интерфейс:порт или просто порт. Например accept = 192.168.0.1:443
accept = 443
; Отдавать приложению на интерфейс:порт или просто порт. Например connect = 127.0.0.1:22
connect = 22 |
...
Создадим необходимый набор ключевых пар и сертификатов для УЦ, сервера и клиента.
Info |
---|
title | Упрощенное создание ключа и сертификата на токене |
---|
|
Для упрощенного упрощения процесса создания ключей и заявок на сертификат на токене, а также их импорт на токен него можно воспользоваться утилитой по работе с токеном. |
Code Block |
---|
language | bash |
---|
title | Создание ключей и сертификатов |
---|
|
# Генерация сертификата и ключа УЦ
sudo openssl req -nodes -new -days 365 -newkey rsa:2048 -x509 -keyout cakey.pem -out cacert.pem
# Генерация ключевой пары сервера
sudo openssl genrsa -out serverkey.pem 2048
# Генерация заявки на сертификат сервера
sudo openssl req -new -out server.req -key serverkey.pem
# Создание сертификата сервера
sudo openssl x509 -req -in server.req -CAkey cakey.pem -CA cacert.pem -out servercert.pem -CAcreateserial
# Генерация ключевой пары клиента
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so --keypairgen --key-type rsa:2048 -l --id 454647
# Генерация заявки на сертификат клиента
openssl
OpenSSL> engine dynamic -pre SO_PATH:/usr/lib/x86_64-linux-gnu/engines-1.1/pkcs11.so -pre ID:pkcs11 -pre LIST_ADD:1 -pre LOAD -pre MODULE_PATH:librtpkcs11ecp.so
...
OpenSSL> req -engine pkcs11 -new -key "pkcs11:id=%45%46%47" -keyform engine -out client.req -subj "/C=RU/ST=Moscow/L=Moscow/O=Aktiv/OU=dev/CN=testuser/emailAddress=testuser@mail.com"
# Создание сертификата клиента
sudo openssl x509 -req -in client.req -CAkey cakey.pem -CA cacert.pem -out clientcert.pem -CAcreateserial
# Импорт сертификата на токен
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -l -y cert -w ./clientcert.pem --id 454647
sudo mv serverkey.pem /etc/stunnel/
sudo mv servercert.pem /etc/stunnel/
sudo mv clientcert.pem /var/lib/stunnel4/certs
sudo mv cacert.pem /var/lib/stunnel4/certs
cd /var/lib/stunnel4/certs
# функция получения хеша по содержимому файла
function get_hash()
{
local file=$1
openssl x509 -noout -hash -in "$file"
}
# создадим ссылки на сертификаты в нужном формате
sudo ln -s cacert.pem "`get_hash cacert.pem`.0"
sudo ln -s clientcert.pem "`get_hash clientcert.pem`.0"
# запустим сервер stunnel
sudo systemctl restart stunnel4 |
Настройка Stunnel на клиенте
Произведем первичную настройку на стороне клиента клиента.
Code Block |
---|
language | bash |
---|
title | Первичная настройка клиента |
---|
|
# СтавимУстановим необходимые пакеты
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install stunnel4 openssl opensc libengine-pkcs11-openssl1.1
# Установим библиотеку pkcs11
wget https://download.rutoken.ru/Rutoken/PKCS11Lib/Current/Linux/x64/librtpkcs11ecp_2.0.5.1-1_amd64.deb
sudo dpkg -i librtpkcs11ecp_2.0.5.1-1_amd64.deb
cp cacert.pem /etc/stunnel/cacert.pem |
Узнаем где находится дирректория директория с файлом конфигурации openssl.
Code Block |
---|
language | bash |
---|
title | Получения дирректории директории с файлом конфигурации openssl |
---|
|
openssl version -d |
В данный конфигурационный файл /path/to/openssl.cnf добавим следующие строчки:
Code Block |
---|
language | bash |
---|
title | Настройка openssl |
---|
|
# В начале напишем:
openssl_conf = openssl_def
...
# В конце файла:
# OpenSSL default section
[openssl_def]
engines = engine_section
[engine_section]
pkcs11 = pkcs11_section
[pkcs11_section]
engine_id = pkcs11
dynamic_path = /usr/lib/x86_64-linux-gnu/engines-1.1/pkcs11.so # путь до данной библиотеки может отличаться в разных ОС
MODULE_PATH = /usr/lib/librtpkcs11ecp.so # путь до данной библиотеки может отличаться в разных ОС
default_algorithms = CIPHERS, DIGEST, PKEY, RAND |
...
Сконфигурируем клиент stunnel через файл /etc/stunnel/stunnel.conf:
Code Block |
---|
language | bash |
---|
title | /etc/stunnel/stunnel.conf |
---|
|
; уровень логирования и путь до лог-файла
debug = 7
output = /var/lib/stunnel4/stunnel.log
; устанавливаем протокол защиты TLSv1.2
sslVersion=TLSv1.2
; подгружаем движок.
engine=pkcs11
; настраиваем туннель на клиенте
[ssh]
; указываем engine, необходимый для подгрузки ключей
engineId=pkcs11
; устанавливаем верификацию 2 (принудительную проверку сертификата)
verify = 2
; путь до корневого сертификата
CAFile = /etc/stunnel/cacert.pem
; путь до сертификата клиента
cert=pkcs11:id=%45%46%47
; путь до ключа на токене.
key=pkcs11:id=%45%46%47
options = NO_SSLv2
client = yes
accept = 127.0.0.1:22
connect = 10.0.2.15:443 |
...
Попробуем создать соединение и подключиться по ssh:
Code Block |
---|
language | bash |
---|
title | Подключение по ssh через туннель |
---|
|
sudo stunnel
ssh user@127.0.0.1 |
...
Если соединение не будет установлено, то можно посмотреть логи /var/lib/stunnel4/stunnel.log.