Подробный гайд по RSA, PFX/PKCS#12 и неизвлекаемым ключам в Linux

Подробный гайд по RSA, PFX/PKCS#12 и неизвлекаемым ключам в Linux: генерация, OpenSSL, PKCS#11, TPM 2.0, HSM, безопасное хранение.

2026.10.16                  


Подробный гайд по RSA, PFX/PKCS#12 и неизвлекаемым ключам в LinuxПодробный гайд по RSA, PFX/PKCS#12 и неизвлекаемым ключам в Linux

1. Основы RSA и генерация ключей

RSA — асимметричный алгоритм шифрования, основанный на вычислительной сложности факторизации больших простых чисел. Ключевая пара состоит из закрытого ключа (private key), который хранится в секрете, и открытого ключа (public key), который можно свободно распространять.


1.1. Генерация ключевой пары

Стандартный способ генерации RSA-ключа в Linux — утилита openssl.

# Генерация 2048-битного закрытого ключа (классический синтаксис)
openssl genrsa -out private_key.pem 2048

# Генерация 4096-битного закрытого ключа с шифрованием AES-256
openssl genrsa -out private_key_encrypted.pem -aes256 4096

# Извлечение открытого ключа из закрытого
openssl rsa -in private_key.pem -pubout -out public_key.pem



Современная альтернатива — команда genpkey, которая поддерживает больше параметров:

openssl genpkey -algorithm RSA -out rsa_private_key.pem \
  -pkeyopt rsa_keygen_bits:2048

1.2. Просмотр содержимого ключей

# Просмотр параметров закрытого ключа
openssl rsa -in private_key.pem -text -noout

# Проверка целостности ключа
openssl rsa -in private_key.pem -check

В выводе отображаются: модуль (modulus), открытая экспонента (public exponent), закрытая экспонента (private exponent), два простых числа p и q, а также служебные параметры для ускорения вычислений.


1.3. Права доступа к ключам

Критически важно ограничить доступ к закрытому ключу:

chmod 400 private_key.pem    # только владелец может читать
chmod 444 public_key.pem     # открытый ключ — только чтение для всех

Закрытый ключ должен быть доступен только серверным процессам, которые его используют. Открытый ключ можно распространять свободно.


1.4. Зашифрованный vs. незашифрованный ключ

  • Незашифрованный ключ начинается с -----BEGIN PRIVATE KEY-----
  • Зашифрованный ключ содержит заголовок с указанием алгоритма шифрования (например, AES-256-CBC)

Зашифрованный ключ защищён паролем: даже если файл будет похищен, без пароля его невозможно использовать.


2. Формат PFX/PKCS#12

PFX (Personal Information Exchange) — это формат, основанный на стандарте PKCS#12. Он представляет собой контейнер, который может содержать закрытый ключ, сертификат и цепочку промежуточных сертификатов в одном файле, защищённом паролем.

2.1. Создание PFX-файла

openssl pkcs12 -export \
  -in certificate.pem \       # сертификат
  -inkey private_key.pem \    # закрытый ключ
  -certfile ca_chain.pem \    # цепочка промежуточных сертификатов (опционально)
  -out bundle.pfx \           # выходной файл
  -name "My Certificate"      # понятное имя

По умолчанию OpenSSL использует AES-256-CBC с PBKDF2 для шифрования PFX.


2.2. Просмотр содержимого PFX

openssl pkcs12 -in bundle.pfx -info -nokeys -noout

2.3. Извлечение компонентов из PFX

# Извлечь только сертификат
openssl pkcs12 -in bundle.pfx -clcerts -nokeys -out cert.pem

# Извлечь закрытый ключ (потребуется пароль)
openssl pkcs12 -in bundle.pfx -nocerts -nodes -out private_key.pem

2.4. Совместимость с legacy-системами

Некоторые старые системы (например, Windows Server 2003, старые версии Java) могут не поддерживать современные алгоритмы шифрования.

Для совместимости используйте флаг -legacy:

openssl pkcs12 -export -legacy -in cert.pem -inkey key.pem -out legacy.pfx

Флаг -legacy включает поддержку устаревших алгоритмов, таких как RC2-40-CBC.


3. Неизвлекаемость ключей в Linux

Неизвлекаемый ключ — это ключ, который генерируется и хранится внутри аппаратного модуля безопасности (TPM, HSM, смарт-карта) и никогда не покидает его. Даже при наличии root-доступа к системе злоумышленник не может экспортировать ключ в открытом виде.


3.1. PKCS#11 — стандартный интерфейс

PKCS#11 — это стандартный API для взаимодействия с аппаратными модулями безопасности. OpenSSL поддерживает PKCS#11 через провайдер.

Установка провайдера:

# Debian/Ubuntu
apt install libpkcs11-provider

# Fedora/RHEL
dnf install openssl-pkcs11

Генерация неизвлекаемого ключа:



openssl genpkey \
  -provider pkcs11 \
  -algorithm ed25519 \
  -pkeyopt "pkcs11-uri:pkcs11:token=MY-TOKEN;object=my-key" \
  -pkeyopt "non-exportable:true"

Флаг non-exportable:true гарантирует, что закрытый ключ будет помечен как неизвлекаемый на уровне аппаратного модуля.


Извлечение только открытого ключа:

openssl pkey \
  -provider pkcs11 \
  -in "pkcs11:token=MY-TOKEN;object=my-key" \
  -pubout -out public.pem

Закрытый ключ при этом никогда не покидает аппаратный модуль.


3.2. TPM 2.0 — встроенная защита

TPM (Trusted Platform Module) 2.0 — это аппаратный чип, встроенный в большинство современных серверов и ноутбуков. Он позволяет создавать ключи, привязанные к конкретному устройству.

Установка tpm2-tools:

# Debian/Ubuntu
apt install tpm2-tools tpm2-pkcs11

# Fedora/RHEL
dnf install tpm2-tools tpm2-pkcs11

Создание неизвлекаемого ключа в TPM:

# Создание первичного ключа (primary key) в TPM
tpm2_createprimary -C e -g sha256 -G ecc -c primary.ctx

# Создание дочернего ключа с атрибутами неизвлекаемости
tpm2_create -C primary.ctx -G ecc256 -u key.pub -r key.priv \
  --attributes "fixedtpm|fixedparent|sensitivedataorigin|userwithauth|sign|noda"

# Загрузка ключа в TPM
tpm2_load -C primary.ctx -u key.pub -r key.priv -c key.ctx

Атрибуты fixedtpm|fixedparent гарантируют, что ключ навсегда привязан к этому TPM и не может быть экспортирован.


Интеграция с OpenSSL через tpm2-pkcs11:

# Добавление ключа в TPM через tpm2-pkcs11
tpm2_ptool addkey --algorithm=ecc256 --label=my-master

# Использование ключа через OpenSSL
openssl pkey -provider tpm2 -in "handle:my-master" -pubout

3.3. Атрибуты неизвлекаемости в PKCS#11

В PKCS#11 существует два ключевых атрибута, обеспечивающих неизвлекаемость:

Атрибут Описание
CKA_EXTRACTABLE Если false — ключ не может быть извлечён из модуля
CKA_NEVER_EXTRACTABLE Если true — ключ никогда не был и не будет извлекаемым

Флаг CKA_NEVER_EXTRACTABLE устанавливается в true при генерации ключа и не может быть изменён впоследствии.


3.4. Аппаратные HSM и смарт-карты

Для критически важных систем используются специализированные HSM (Hardware Security Module) — например, Рутокен, JaCarta, Thales Luna. Они подключаются через PKCS#11 и поддерживают генерацию неизвлекаемых ключей с аппаратной защитой от физического извлечения.


4. Практический сценарий: от генерации до неизвлекаемого ключа

Сценарий A: Программный ключ (для разработки)

# 1. Генерация RSA-ключа
openssl genrsa -aes256 -out dev_key.pem 4096

# 2. Создание самоподписанного сертификата
openssl req -new -x509 -key dev_key.pem -out dev_cert.pem -days 365

# 3. Создание PFX-контейнера
openssl pkcs12 -export -in dev_cert.pem -inkey dev_key.pem -out dev_bundle.pfx

# 4. Установка прав
chmod 400 dev_key.pem dev_bundle.pfx

Сценарий B: Аппаратный неизвлекаемый ключ (для продакшена)

# 1. Инициализация TPM (если не инициализирован)
tpm2_startup -c

# 2. Создание primary key
tpm2_createprimary -C e -g sha256 -G ecc -c primary.ctx

# 3. Создание неизвлекаемого ключа
tpm2_create -C primary.ctx -G ecc256 -u prod.pub -r prod.priv \
  --attributes "fixedtpm|fixedparent|sensitivedataorigin|userwithauth|sign|noda"

# 4. Загрузка ключа
tpm2_load -C primary.ctx -u prod.pub -r prod.priv -c prod.ctx

# 5. Регистрация в tpm2-pkcs11
tpm2_ptool addkey --algorithm=ecc256 --label=prod-master

# 6. Использование через OpenSSL
openssl pkey -provider tpm2 -in "handle:prod-master" -pubout -out prod_public.pem

5. Сравнение подходов к хранению ключей



Метод Неизвлекаемость Стойкость к компрометации ОС Производительность Сложность
PEM-файл (незашифрованный) нет нет Высокая Низкая
PEM-файл (зашифрованный) нет (пароль можно подобрать) Частичная Высокая Низкая
PFX/PKCS#12 нет (контейнер можно экспортировать) Частичная Высокая Средняя
PKCS#11 soft-token хорошо (CKA_NEVER_EXTRACTABLE) Частичная Средняя Средняя
TPM 2.0 хорошо (аппаратная привязка) хорошо Средняя Высокая
HSM / смарт-карта хорошо (аппаратная) хорошо Зависит от устройства Высокая

6. Лучшие практики и рекомендации

  1. Минимальный размер ключа RSA — 2048 бит. Для новых систем рекомендуется 4096 бит или переход на ECC (P-384, secp521r1).
  2. Всегда шифруйте закрытые ключи паролем при хранении на диске. Используйте -aes256 или -aes128 при генерации.
  3. Ограничивайте права доступа: chmod 400 для закрытых ключей, chmod 444 для открытых.
  4. Для продакшена используйте аппаратную защиту — TPM 2.0 (встроен в большинство современных серверов) или HSM.
  5. Устанавливайте CKA_NEVER_EXTRACTABLE при генерации ключей в PKCS#11-модулях.
  6. Для PFX используйте современные алгоритмы — AES-256-CBC с PBKDF2. Флаг -legacy применяйте только при необходимости совместимости.
  7. Регулярно проверяйте целостность ключей: openssl rsa -check, tpm2_readpublic.
  8. Резервное копирование: для аппаратных неизвлекаемых ключей резервное копирование невозможно по определению. Заранее продумайте стратегию восстановления (например, использование нескольких ключей или escrow-схем).

Информация предоставлена в ознакомительных целях. Применение описанных настроек в системах, должно осуществляться только после согласования с ответственными за информационную безопасность и в соответствии с требованиями ФСТЭК, ФСБ и иных уполномоченных органов.


Статью подготовил: Аверко Денис Сергеевич @Nymexis г. Омск (специалист по ЗИ)

Комментарии

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