Защищенное подключение к корпоративной сети, либо домашней через публичню сеть (интернет) это всегда VРN.
В связи с вышедшим указом о запрете публикаций о популяризации средств обхода блокировок, данная статья не будет содержать информации о настройке каких-либо VРN-сервисов, предназначенных для обхода блокировок. Данная статья содержит только информацию о том, как построить собственный VРN для целей доступа к корпоративной либо домашней сети, а также соединений офисов точка-точка.
Среди средств построения выделить можно 2 типа:
Коммерческие, такие как Cisco, Juniper, Check Point, Palo Alto, C-Teрра, ViPNet, АПКШ Континент и пр. рассматривать будем только косвенно, поскольку при внедрении и сопровождении этих продуктов есть техническая поддержка и полная документации по настройке и внедрению.
Туннели строятся на разных уровнях модели OSI. L2VРN и L3VРN.
Также VРN бывают 2х типов: Site-2-Site и Client-2-Site (Remote Access)
Как правило, туннели строятся по 2м принципам - на базе парольной фразы (Pre-Shared Key), либо сертификатам (SSL/TLS). Есть также и отдельный вид туннеля - SSL Tunnel (о них поговорим отдельно и позднее)
Рис. 1. Пример схемы корпоративной сети. Тип «Звезда»
Важно: Приватные ключи, PKI и т.п. файлы - мы будем хранить на выделенном сервере PKI в инфраструктуре Головного офиса. В качестве примера будет использоваться единый центр сертификации без подчиненного центра. В реальной корпоративной среде следует иметь минимум CA и SubCA.
Важно: В наших примерах мы берем RHEL-like систему CentOS 7 (End of Life: June 30, 2024) с уже установленным менеджером пакетов dnf (вместо yum). Для систем deb-like применимо +/- тоже самое.
Будем использовать OpenSource скрипт easy-rsa, а также собственную наработку для ключей WG.
Для целей CDP потребуется nginx.
sudo dnf install easy-rsa nginx -y
Внимание: штатная поставка скрипта не предполагает CDP (crl выпускается, но CDP в выпускаемых сертификатах не прописывается). Для этого позже внесем корректировки в скрипт.
Далее создаем пользователя, создаем ему пароль и преднастраиваем среду окружения
sudo useradd -m pkiuser
sudo passwd pkiuser
sudo su pkiuser
cd ~
mkdir ca
cp /usr/share/easy-rsa/3/* ./ca
echo "export PATH=$PATH:/home/pkiuser/ca" >> ~/.bashrc
exit
su pkiuser
cd ~
Переменные для ключа содержатся в файле [PKI]/vars. Его примерное содержание:
set_var EASYRSA_CERT_EXPIRE 25 # Количество дней до окончания срока сертификата, при отсутствии параметра 365
set_var EASYRSA_REQ_COUNTRY "RU" # Страна
set_var EASYRSA_REQ_PROVINCE "MOW" # Субъект
set_var EASYRSA_REQ_CITY "Moscow" # Город
set_var EASYRSA_REQ_ORG "Our Company" # Организация
set_var EASYRSA_REQ_EMAIL "director@company.ru" # E-main ответственного
set_var EASYRSA_REQ_OU "Enterprise" # Organization Unit
set_var EASYRSA_CDP "http://pki-server.company.ru/crl.pem" # Адрес точки распространения CRL (параметр добавлен с модификацией выпуска сертификатов)
set_var EASYRSA_EXTRA_EXTS "" # Здесь указываются DNS, IP как вторичная идентификация выпускаемого сертификата
Также поддерживается указание версии openssl и пр.
Инициализируем CA
easyrsa init-pki
easyrsa build-ca
Важно: Необходимо сгенерировать сложный пароль и сохранить в надежном месте для приватного ключа нашего CA.
Строим Diffie-Hellman ключ
easyrsa gen-dh
Для дальнейшего использования скрипта нам потребуется его модификация.
Находим в easyrsa следующую функцию:
sign_req()
Внутри этой функции находим:
# Generate the extensions file for this cert:
ext_tmp="$(easyrsa_mktemp)" || die "Failed to create temporary file"
{
# Append first any COMMON file (if present) then the cert-type extensions
cat "$EASYRSA_EXT_DIR/COMMON"
cat "$EASYRSA_EXT_DIR/$crt_type"
# copy req extensions
[ "$EASYRSA_CP_EXT" ] && print "copy_extensions = copy"
и корректируем как-то так:
# Generate the extensions file for this cert:
ext_tmp="$(easyrsa_mktemp)" || die "Failed to create temporary file"
{
# Append first any COMMON file (if present) then the cert-type extensions
cat "$EASYRSA_EXT_DIR/COMMON"
cat "$EASYRSA_EXT_DIR/$crt_type"
echo "crlDistributionPoints=URI:$EASYRSA_CDP"
# copy req extensions
[ "$EASYRSA_CP_EXT" ] && print "copy_extensions = copy"
Сразу сгенерируем CRL
easyrsa gen-crl
Мы готовы к выпуску сертификатов и crl. А что же с CDP? Верно, необходимо провести еще доп.настройки:
vi /etc/nginx/conf.g/pki.conf
:
server {
listen 80 defaut_site;
root /var/www/html;
access_log /var/log/nginx/cdp_access.log;
error_log /var/log/nginx/cdp_error.log;
index index.html;
}
touch /var/www/html/index.html
ln -s /home/pkiuser/ca/pki/crl.pem /var/www/html/crl.pem
chown apache:nginx /var/www/html/crl.pem
nginx -t
systemctl enable --now nginx
В настройках FW важно наличие доступа по порту 80 для CRL и SSH для доступа к CA (В реальной корпоративной среде рекомендую растащить CA и его CDP на разные сервера (или хотя бы интерфейсы с разными IP-адресами).
А что же с WG? Верно. Скрипт WG тут
К нему требования:
dnf install qrencode -y
Генерация ключей и конфигураций для WG тоже готова. Можно приступать к разворачиванию.
Важно: Необходимо на серверах VРN включить маршрутизацию IPv4
Данный вид поддерживает подключение типа Client-2-Site, что вполне годится для построения VРN типа «Звезда» и Remote Access. Преимуществом является возможность конфигурировать клиентов через QR-код зараннее подготовленного файла конфигурации.
Рис. 2. Наглядная схема для реализации (логическое представление)
Параметры маршрутизации (Топология «Звезда»):
Маршрут | Сервер ГО | Сервер О1 | Сервер О2 |
---|---|---|---|
default | 10.50.0.1 dev eth0 | 10.100.0.1 dev eth0 | 10.150.0.1 dev eth0 |
10.50.0.0/16 | connected | 10.0.0.1 dev wg | 10.0.0.1 dev wg |
10.100.0.0/16 | 10.0.0.2 dev wg | connected | 10.0.0.1 dev wg |
10.150.0.0/16 | 10.0.0.3 dev wg | 10.0.0.1 dev wg | connected |
10.200.0.0/16 | 10.0.0.1 dev wg | 10.0.0.1 dev wg | 10.0.0.1 dev wg |
МЭ ГО:
default route: [маршрутизатор интернет]
Статические маршруты внутренней ЛВС
10.100.0.0/16: 10.50.0.2 - Офис 1
10.150.0.0/16: 10.50.0.2 - Офис 2
10.200.0.0/16: 10.50.0.2 - Удаленные пользователи
NAT:
Origin Source | Origin Destination | Origin Port | Translated Source | Translated Destination | Translated Port |
---|---|---|---|---|---|
Any | [Public IP] | 51280/udp | Original | 10.50.0.2 | Original |
10.50.0.0/16 | not 10.0.0.0/8 | Any | [Public IP] | Original | Original |
МЭ О1:
default route: [маршрутизатор интернет]
Статические маршруты внутренней ЛВС
10.50.0.0/16: 10.100.0.2 - Головной офис
10.150.0.0/16: 10.100.0.2 - Офис 2
10.200.0.0/16: 10.100.0.2 - Удаленные пользователи
NAT:
Origin Source | Origin Destination | Origin Port | Translated Source | Translated Destination | Translated Port |
---|---|---|---|---|---|
10.100.0.0/16 | not 10.0.0.0/8 | Any | [Public IP] | Original | Original |
МЭ О2:
default route: [маршрутизатор интернет]
Статические маршруты внутренней ЛВС
10.50.0.0/16: 10.150.0.2 - Головной офис
10.100.0.0/16: 10.150.0.2 - Офис 1
10.200.0.0/16: 10.150.0.2 - Удаленные пользователи
NAT:
Origin Source | Origin Destination | Origin Port | Translated Source | Translated Destination | Translated Port |
---|---|---|---|---|---|
10.150.0.0/16 | not 10.0.0.0/8 | Any | [Public IP] | Original | Original |
Официальный сайт WG
Особенности установки RedOS - Установка из дистрибутива Oracle Linux
Подробнее можно посмотреть здесь
Сервер Головного офиса будет принимать подключения. Тут важно отсутствие NAT, либо настроенный Destination-NAT для доступности сервера со стороны публичной сети.
На сервере PKI:
easywguard gensrvkeys wg
easywguard gensrvcfg wg 10.50.0.2 51280
easywguard genclkeys office1
easywguard genclkeys office2
easywguard genclcfg office1 [Office1 Public IP] wg [GO Public IP] 51280 10.50.0.0/16,10.150.0.0/16,10.200.0.0/16
easywguard genclcfg office2 [Office2 Public IP] wg [GO Public IP] 51280 10.50.0.0/16,10.100.0.0/16,10.200.0.0/16
Также для каждого удаленного пользователя создаем ключи и конфиги
Соответственно Серверную конфигурацию размещаем на сервере ГО:
/etc/wireguard/wg.conf
Клиентские конфигурации размещаем на соответствующих сервера офисов:
officeX.conf >> /etc/wireguard/wg.conf
Запускаем службы (сначала сервер ГО, потом другие в произвольном порядке)
systemctl enable --now wg-quick@wg.service
Проверяем туннели:
wg show
Образец конфигурации можно посмотреть здесь
Данный вид поддерживает подключение типа Client-2-Site, что вполне годится для построения VРN типа «Звезда» и Remote Access. Преимуществом здесь является то, что таблицу маршрутизации для каждого клиента сервер формирует сам (как общие, так и индивидуальные), а также различные опции DHCP/DNS.
OpenVРN имеет 2 реализации - RSA и ГОСТ. Поскольку для ГОСТ требуется сертификаты ГОСТ, то этот вариант мы в нашей реализации опустим (можно CA или SubCA выпустить для ГОСТа отдельно).
Рис. 3. Наглядная схема для реализации (логическое представление)
Параметры маршрутизации (Топология «Звезда»):
Маршрут | Сервер ГО | Сервер О1 | Сервер О2 |
---|---|---|---|
default | 10.50.0.1 dev eth0 | 10.100.0.1 dev eth0 | 10.150.0.1 dev eth0 |
10.50.0.0/16 | connected | 10.0.0.5 dev tun0 | 10.0.0.9 dev tun0 |
10.100.0.0/16 | 10.0.0.2 dev tun0 | connected | 10.0.0.9 dev tun0 |
10.150.0.0/16 | 10.0.0.2 dev tun0 | 10.0.0.5 dev tun0 | connected |
10.200.0.0/16 | 10.200.0.2 dev tun1 | 10.0.0.5 dev tun0 | 10.0.0.9 dev tun0 |
МЭ ГО:
default route: маршрутизатор интернет
Статические маршруты внутренней ЛВС
10.100.0.0/16: 10.50.0.2 - Офис 1
10.150.0.0/16: 10.50.0.2 - Офис 2
10.200.0.0/16: 10.50.0.2 - Удаленные пользователи
NAT:
Origin Source | Origin Destination | Origin Port | Translated Source | Translated Destination | Translated Port |
---|---|---|---|---|---|
Any | [Public IP] | 1194-1195/udp | Original | 10.50.0.2 | Original |
10.50.0.0/16 | not 10.0.0.0/8 | Any | [Public IP] | Original | Original |
МЭ О1:
default route: маршрутизатор интернет
Статические маршруты внутренней ЛВС
10.50.0.0/16: 10.100.0.2 - Головной офис
10.150.0.0/16: 10.100.0.2 - Офис 2
10.200.0.0/16: 10.100.0.2 - Удаленные пользователи
NAT:
Origin Source | Origin Destination | Origin Port | Translated Source | Translated Destination | Translated Port |
---|---|---|---|---|---|
10.100.0.0/16 | not 10.0.0.0/8 | Any | [Public IP] | Original | Original |
МЭ О2:
default route: маршрутизатор интернет
Статические маршруты внутренней ЛВС
10.50.0.0/16: 10.150.0.2 - Головной офис
10.100.0.0/16: 10.150.0.2 - Офис 1
10.200.0.0/16: 10.150.0.2 - Удаленные пользователи
NAT:
Origin Source | Origin Destination | Origin Port | Translated Source | Translated Destination | Translated Port |
---|---|---|---|---|---|
10.150.0.0/16 | not 10.0.0.0/8 | Any | [Public IP] | Original | Original |
Для удаленных пользователей в этом случае лучше подготовить отдельную инстанцию ОреnVРN
dnf install openvpn -y
На сервере PKI:
easyrsa gen-req servergo nopass
easyrsa gen-req servero1 nopass
easyrsa gen-req servero2 nopass
easyrsa sign-req server servergo
easyrsa sign-req client servero1
easyrsa sign-req client servero2
easyrsa gen-req racserver nopass
easyrsa sign-req server racserver
Также для каждого удаленного пользователя создаем сертификаты
easyrsa gen-crl
Сервис для офисов
/etc/ореnvрn/server/srv.conf
:
proto udp
port 1194
dev tun0
ca /etc/ореnvрn/server/srv/ca.crt
cert /etc/ореnvрn/server/srv/server.crt
key /etc/ореnvрn/server/srv/server.key
crl-verify /etc/ореnvрn/server/srv/crl.pem
dh /etc/ореnvрn/server/srv/dh.pem
tls-server
tls-timeout 120
tls-auth /etc/ореnvрn/server/srv/ta-srv.key 0
server 10.0.0.4 255.255.255.240
route 10.0.0.4 255.255.255.240
;routes
;see DEFAULT in CCD
push "dhcp-option DNS [DNS Server]"
push "dhcp-option DOMAIN company.ru"
ifconfig-pool-persist /etc/ореnvрn/server/srv/cips
client-config-dir /etc/ореnvрn/server/srv/ccd
management localhost 7501 /etc/ореnvрn/server/srv/pwd
keepalive 10 120
comp-lzo
persist-key
persist-tun
status /var/log/ореnvрn/srv-status.log
log /var/log/ореnvрn/srv.log
Создать соответствующие каталоги и расположить соответствующие файлы
mkdir /etc/ореnvрn/server/srv/ccd
echo "генерированный пароль для management-интерфейса" >/etc/ореnvрn/server/srv/pwd
echo "servero1,10.0.0.8," >/etc/ореnvрn/server/srv/cips
echo "servero2,10.0.0.12," >>/etc/ореnvрn/server/srv/cips
chmod 600 /etc/ореnvрn/server/srv/pwd
openvpn --genkey --secret /etc/ореnvрn/server/srv/ta.key
Конфиг для сервера О1:
/etc/ореnvрn/server/srv/ccd/servero1
:
push "route 10.50.0.0 255.255.0.0"
push "route 10.150.0.0 255.255.0.0"
push "route 10.200.0.0 255.255.0.0"
Конфиг для сервера О2:
/etc/ореnvрn/server/srv/ccd/servero2
:
push "route 10.50.0.0 255.255.0.0"
push "route 10.100.0.0 255.255.0.0"
push "route 10.200.0.0 255.255.0.0"
Сервис для удаленных пользователей
/etc/ореnvрn/server/casrv.conf
:
port 1195
proto udp
dev tun1
ca /etc/ореnvрn/server/casrv/ca.crt
cert /etc/ореnvрn/server/casrv/server.crt
key /etc/ореnvрn/server/casrv/server.key
crl-verify /etc/ореnvрn/server/casrv/crl.pem
dh /etc/ореnvрn/server/casrv/dh.pem
tls-server
tls-timeout 120
tls-auth /etc/ореnvрn/server/casrv/ta-srv.key 0
server 10.200.0.0 255.255.0.0
route 10.200.0.0 255.255.0.0
;routes
push "route 10.50.0.0 255.255.0.0"
push "route 10.100.0.0 255.255.0.0"
push "route 10.150.0.0 255.255.0.0"
;DHCP-Option
push "dhcp-option DNS [DNS Server]"
push "dhcp-option DOMAIN company.ru"
ifconfig-pool-persist /etc/ореnvрn/server/casrv/cips
client-config-dir /etc/ореnvрn/server/casrv/ccd
management localhost 7502 /etc/ореnvрn/server/casrv/pwd
keepalive 10 120
comp-lzo
persist-key
persist-tun
status /var/log/ореnvрn/casrv-status.log
log /var/log/ореnvрn/casrv.log
Создать соответствующие каталоги и расположить соответствующие файлы
mkdir /etc/ореnvрn/server/casrv/ccd
echo "генерированный пароль для management-интерфейса" >/etc/ореnvрn/server/casrv/pwd
chmod 600 /etc/ореnvрn/server/casrv/pwd
openvpn --genkey --secret /etc/ореnvрn/server/casrv/ta.key
SELinux:
semanage port -a -t ореnvрn_port_t -p tcp 7501
semanage port -a -t ореnvрn_port_t -p tcp 7502
semanage port -a -t ореnvрn_port_t -p udp 1195
semanage fcontext -a -t openvpn_etc_rw_t /etc/ореnvрn/server/srv/cips
semanage fcontext -a -t openvpn_etc_rw_t /etc/ореnvрn/server/casrv/cips
restorecon -Rv /etc/ореnvрn/server
Создаем папку лога
mkdir /var/log/ореnvрn
Запуск служб:
systemctl enable --now ореnvрn-server@srv.service
systemctl enable --now ореnvрn-server@casrv.service
/etc/ореnvрn/client/office.conf
:
dev tun
proto udp
remote [Public IP GO] 1194
client
resolv-retry infinite
persist-key
persist-tun
comp-lzo
verb 3
auth-nocache
remote-cert-tls server
<ca>
Сертификат нашего CA в формате PEM
</ca>
<cert>
Сертификат нашего сервера office в формате PEM
</cert>
key-direction 1
<tls-auth>
Ключ TLS нашего сервера ГО srv
</tls-auth>
/etc/ореnvрn/client/client.conf
:
dev tun
proto udp
remote [Public IP GO] 1195
client
resolv-retry infinite
persist-key
persist-tun
comp-lzo
verb 3
auth-nocache
remote-cert-tls server
<ca>
Сертификат нашего CA в формате PEM
</ca>
<cert>
Сертификат нашего удаленного клиента в формате PEM
</cert>
key-direction 1
<tls-auth>
Ключ TLS нашего сервера ГО casrv
</tls-auth>
Данный вид поддерживает подключение типа Client-2-Site и Site-2-Site. Данный продукт в точности соответствует RFC и для построения туннеля делает честный IPSec VРN (то есть используется 500/udp и 4500/udp).
Соответственно здесь можно строить туннели с коммерческими продуктами (Cisco, Check Point и т.д., кроме отечественных), а также встроенными клиентами Windows, Android, iOS, Linux WorkStation Editions. При наличии NAT будут проблемы (о них чуть позже).
Рис. 4. Наглядная схема для реализации (логическое представление). Здесь будем строить сетку (Mesh)
В файл /etc/iproute2/rt_tables
добавляем все необходимы таблицы, которым в дальнейшем присвоим приоритеты и укажем маршруты
200 wireguard
205 ореnvрn
210 swan
Добавляем корректные маршруты:
ip route add 10.50.0.0/16 via wg table wireguard
ip route add 10.50.0.0/16 via wg table ореnvрn
ip route add 10.50.0.0/16 via wg table swan
ip route add 10.100.0.0/16 via wg table wireguard
ip route add 10.100.0.0/16 via wg table ореnvрn
ip route add 10.100.0.0/16 via wg table swan
ip route add 10.150.0.0/16 via wg table wireguard
ip route add 10.150.0.0/16 via wg table ореnvрn
ip route add 10.150.0.0/16 via wg table swan
ip route add 10.200.0.0/16 via wg table wireguard
ip route add 10.200.0.0/16 via wg table ореnvрn
ip route add 10.200.0.0/16 via wg table swan
Важно: Маршруты и их таблицы указаны все, какие в нашей схеме имеются. Необходимо их корректно распределить между серверами офисов
Указываем приоритеты для таблиц:
ip rule add from 10.0.0.1/32 tab wireguard priority 400
ip rule add from 10.0.0.5/32 tab ореnvрn priority 500
ip rule add from 10.0.0.x/32 tab swan priority 600
Важно: Приоритеты указаны для головного офиса, необходимо аналогичные маршруты указать у других офисов, указав корректные IP-адреса интерфейсов
Важно: Обратите внимание на возможность ассиметрично ходящего трафика между офисами
openssl req -new -nodes \
-subj "/C=RU/ST=Moscow/L=Moscow/O=Company/OU=Web Resources/CN=web.company.ru/emailAddress=admin@company.ru" \
-addext "subjectAltName = DNS:web.company.ru, DNS:www.company.ru, DNS:company.ru, DNS:*.company.ru, DNS:85.132.43.12, IP: 85.132.43.12" \
-addext "keyUsage = digitalSignature, keyEncipherment" \
-addext "extendedKeyUsage = serverAuth" \
-newkey rsa:2048 -keyout key.pem -out web.csr
или для easy-rsa (OpenSSL версии не менее 1.1.1)
./vars
:
set_var EASYRSA_KEY_SIZE 4096
set_var EASYRSA_DIGEST "RSA-SHA384" # Version 1.1.1
set_var EASYRSA_DIGEST "SHA384" # Version 3.0.2
set_var EASYRSA_EXTRA_EXTS "subjectAltName=DNS:OfficeGO.mycomp.ltd,IP:109.172.83.184"
set_var EASYRSA_OPENSSL "<where your binary location>"
./x509-types/swanServer
:
# X509 extensions for a ipsec
authorityKeyIdentifier = keyid
extendedKeyUsage = serverAuth, 1.3.6.1.5.5.8.2.2
Для Strongswan требуется версия OpenSSL не менее 3.0
Посмотреть какие алгоритмы поддеживаются и какая версия openssl
openssl list -digest-algorithms
openssl version
which openssl
Сборка и установка разных версий OpenSSL описана здесь
Display name | OID | Supported key types | Supported seat types |
---|---|---|---|
CRL signing | 2.5.29.156 | RSA ECDSA | Organization (for External Private CA template) |
Data encipherment | 2.5.29.153 | RSA | User / Device / Server |
Decipher only | 2.5.29.158 | ECDSA | User / Device / Server |
Digital signature | 2.5.29.150 | RSA ECDSA | User / Device / Server / Organization |
Encipher only | 2.5.29.157 | ECDSA | User / Device / Server |
Key agreement | 2.5.29.154 | ECDSA | User / Device / Server |
Key certificate signing | 2.5.29.155 | RSA ECDSA | Organization (for External Private CA template) |
Key encipherment | 2.5.29.152 | RSA | User / Device / Server |
Non repudiation | 2.5.29.151 | RSA ECDSA | User / Device |
Name | OID | Supported Seat Types |
---|---|---|
Client authentication | 1.3.6.1.5.5.7.3.2 | User / Device / Server |
Email protection | 1.3.6.1.5.5.7.3.4 | User |
Encrypting file system | 1.3.6.1.4.1.311.10.3.4 | User |
File recovery | 1.3.6.1.4.1.311.10.3.4.1 | User |
IP security user | 1.3.6.1.5.5.7.3.7 | User |
IPSec IKE | 1.3.6.1.5.5.7.3.17 | Server / Device |
IPSec IKE-Intermediate | 1.3.6.1.5.5.8.2.2 | Server / Device |
Server authentication | 1.3.6.1.5.5.7.3.1 | Server |
Signing KDC responses | 1.3.6.1.5.2.3.5 | Server / Device |
Smart card logon | 1.3.6.1.4.1.311.20.2.2 | User / Device / Server |
# gen CA key
ipsec pki --gen --size 4096 --type rsa --outform pem > /etc/ipsec.d/private/ca.key.pem
# self-sign CA cert
ipsec pki --self --in /etc/ipsec.d/private/ca.key.pem --type rsa --dn "CN=SwanCA" --ca --lifetime 3650 --outform pem > /etc/ipsec.d/cacerts/ca.cert.pem
# gen swan-server-01 key
ipsec pki --gen --size 4096 --type rsa --outform pem > /etc/ipsec.d/private/server.key.pem
# sign swan-server-01 cert by CA
ipsec pki --pub --in /etc/ipsec.d/private/server.key.pem --type rsa | ipsec pki --issue --lifetime 3650 --cacert /etc/ipsec.d/cacerts/ca.cert.pem --cakey /etc/ipsec.d/private/ca.key.pem --dn "CN=OfficeGO.mycomp.ltd" --san="DNS:OfficeGO.mycomp.ltd, IP:109.172.83.184" --flag serverAuth --flag ikeIntermediate --outform pem > /etc/ipsec.d/certs/server.cert.pem
# gen swan-server-02 key
ipsec pki --gen --size 4096 --type rsa --outform pem > /etc/ipsec.d/private/server.key.pem
# sign swan-server-02 cert by CA
ipsec pki --pub --in /etc/ipsec.d/private/server.key.pem --type rsa | ipsec pki --issue --lifetime 3650 --cacert /etc/ipsec.d/cacerts/ca.cert.pem --cakey /etc/ipsec.d/private/ca.key.pem --dn "CN=Office01.mycomp.ltd" --san="DNS:Office01.mycomp.ltd, IP:109.172.83.185" --flag serverAuth --flag ikeIntermediate --outform pem > /etc/ipsec.d/certs/server.cert.pem
# gen swan-server-03 key
ipsec pki --gen --size 4096 --type rsa --outform pem > /etc/ipsec.d/private/server.key.pem
# sign swan-server-03 cert by CA
ipsec pki --pub --in /etc/ipsec.d/private/server.key.pem --type rsa | ipsec pki --issue --lifetime 3650 --cacert /etc/ipsec.d/cacerts/ca.cert.pem --cakey /etc/ipsec.d/private/ca.key.pem --dn "CN=Office02.mycomp.ltd" --san="DNS:Office02.mycomp.ltd, IP:109.172.83.186" --flag serverAuth --flag ikeIntermediate --outform pem > /etc/ipsec.d/certs/server.cert.pem
# put ca.cert to srv02 srv03