Подробный гайд по 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. Лучшие практики и рекомендации
- Минимальный размер ключа RSA — 2048 бит. Для новых систем рекомендуется 4096 бит или переход на ECC (P-384, secp521r1).
- Всегда шифруйте закрытые ключи паролем при хранении на диске. Используйте
-aes256или-aes128при генерации. - Ограничивайте права доступа:
chmod 400для закрытых ключей,chmod 444для открытых. - Для продакшена используйте аппаратную защиту — TPM 2.0 (встроен в большинство современных серверов) или HSM.
- Устанавливайте
CKA_NEVER_EXTRACTABLEпри генерации ключей в PKCS#11-модулях. - Для PFX используйте современные алгоритмы — AES-256-CBC с PBKDF2. Флаг
-legacyприменяйте только при необходимости совместимости. - Регулярно проверяйте целостность ключей:
openssl rsa -check,tpm2_readpublic. - Резервное копирование: для аппаратных неизвлекаемых ключей резервное копирование невозможно по определению. Заранее продумайте стратегию восстановления (например, использование нескольких ключей или escrow-схем).
Информация предоставлена в ознакомительных целях. Применение описанных настроек в системах, должно осуществляться только после согласования с ответственными за информационную безопасность и в соответствии с требованиями ФСТЭК, ФСБ и иных уполномоченных органов.