Перейти к содержанию

Создание удостоверяющего центра ГОСТ-512 и выпуск сертификатов

Для X.509 нужен один доверенный удостоверяющий центр (УЦ) и отдельные ключи каждого VPN-узла. Эта инструкция воспроизводит лабораторный ГОСТ УЦ на НАЙС.ОС через системный OpenSSL Engine. В производственной среде CA и его закрытый ключ должны размещаться отдельно от VPN-шлюза (защищённый CA/HSM), а выпуск выполняется по политике организации.

1. Создать лабораторный УЦ на специально выделенном узле

На нашем учебном стенде роль УЦ временно выполняет узел А. Никогда не переносите ca.key на узел Б.

bash <<'SH'
set -euo pipefail
umask 077
D=/root/niceos-ike-ca
test ! -e "$D" || { echo 'STOP: УЦ уже существует'; exit 1; }
install -d -m 700 "$D"
cd "$D"
export OPENSSL_CONF=/etc/pki/niceos-gost/engine.cnf
openssl engine -t gost
openssl genpkey -algorithm gost2012_512 -pkeyopt paramset:C -out ca.key
openssl req -new -x509 -key ca.key \
  -subj '/CN=NiceOS-Example-IKE-CA' -days 365 \
  -addext 'basicConstraints=critical,CA:TRUE' \
  -addext 'keyUsage=critical,keyCertSign,cRLSign' \
  -out ca.pem
openssl x509 -in ca.pem -outform DER -out ca.der
: > index
printf '1000\n' > crlnumber
cat > ca.cnf <<EOF
[ca]
default_ca = signing
[signing]
database = $D/index
certificate = $D/ca.pem
private_key = $D/ca.key
crlnumber = $D/crlnumber
default_md = default
default_crl_days = 7
crl_extensions = crlext
[crlext]
authorityKeyIdentifier = keyid:always
EOF
chmod 600 ca.key
openssl x509 -in ca.pem -noout -subject -issuer -dates
SH

Используем gost2012_512 с paramset:C, который был проверен на установленном OpenSSL 3.5.9. Если ваша корпоративная PKI использует другой допустимый ГОСТ-набор, проверяйте его поддержку и регламенты отдельно.

2. Каждая VM создаёт собственный ключ и CSR

На узле А:

umask 077
install -d -m 700 /root/niceos-ike-node
export OPENSSL_CONF=/etc/pki/niceos-gost/engine.cnf
openssl genpkey -algorithm gost2012_512 -pkeyopt paramset:C \
  -out /root/niceos-ike-node/node.key
openssl req -new -key /root/niceos-ike-node/node.key \
  -subj '/CN=niceos-left' -out /root/niceos-ike-node/node.csr

На узле Б — те же команды, но -subj '/CN=niceos-right'. CSR узла Б передаётся администратору УЦ без закрытого ключа:

scp /root/niceos-ike-node/node.csr root@192.168.10.15:/root/niceos-ike-ca/right.csr

Узел А передаёт свой CSR в каталог CA локально:

install -m 644 /root/niceos-ike-node/node.csr /root/niceos-ike-ca/left.csr

Проверяйте подлинность SSH-ключа принимающей стороны, а передачу CSR/сертификатов регистрируйте по политике организации.

3. УЦ подписывает сертификаты с DNS SAN

На машине УЦ:

bash <<'SH'
set -euo pipefail
umask 077
D=/root/niceos-ike-ca
cd "$D"
export OPENSSL_CONF=/etc/pki/niceos-gost/engine.cnf
for ROLE in left right; do
    test -s "$ROLE.csr"
    cat > "$ROLE.ext" <<EOF
basicConstraints=critical,CA:FALSE
keyUsage=critical,digitalSignature
subjectAltName=DNS:niceos-$ROLE
EOF
    openssl x509 -req -in "$ROLE.csr" \
      -CA ca.pem -CAkey ca.key -CAcreateserial \
      -days 90 -extfile "$ROLE.ext" -out "$ROLE.pem"
    openssl ca -config ca.cnf -valid "$ROLE.pem" -batch
    openssl x509 -in "$ROLE.pem" -outform DER -out "$ROLE.der"
    openssl verify -CAfile ca.pem "$ROLE.pem"
    openssl x509 -in "$ROLE.pem" -noout -subject -serial -ext subjectAltName
done
openssl ca -config ca.cnf -gencrl -batch -out current.pem
openssl crl -in current.pem -outform DER -out current.der
openssl crl -inform DER -in current.der -CAfile ca.pem -verify -noout -crlnumber
SH

Запись в CA database через openssl ca -valid необходима в этой проверенной лабораторной схеме: сертификаты подписывает openssl x509 -req, но для последующего openssl ca -revoke они должны учитываться в базе. В промышленной CA системе лучше применять штатный выпуск с полной базой сертификатов сразу.

4. Каждая VM конвертирует собственный ключ в PKCS#8 DER

На обеих VM (где находится их собственный node.key):

export OPENSSL_CONF=/etc/pki/niceos-gost/engine.cnf
openssl pkcs8 -topk8 -nocrypt \
  -in /root/niceos-ike-node/node.key -outform DER \
  -out /root/niceos-ike-node/node-key.der
chmod 600 /root/niceos-ike-node/node-key.der

В лаборатории использован незашифрованный PKCS#8 для загрузки демоном без ручного пароля — это означает, что защита ключа обеспечивается правами файлов, доступом к машине и резервными копиями. Для аппаратных ключей и защищённых хранилищ необходима отдельная проверка.

5. Раздача публичных материалов

На узле А:

scp /root/niceos-ike-ca/{ca.der,ca.pem,right.der,current.der} \
  root@192.168.10.26:/root/niceos-ike-node/
cp -a /root/niceos-ike-ca/{ca.der,ca.pem,left.der,current.der} /root/niceos-ike-node/

Не передавайте ca.key, закрытые ключи одного узла другому узлу или личные ключи по электронной почте. Далее: установка в swanctl, проверка CRL.