Не существует абсолютно безопасного способа генерирования закрытых ключей для распространения; самый безопасный способ - каждый клиент генерирует свои пары ключей и передает только открытый ключ.
Однако, если вы находитесь в ситуации, когда это просто не сработает, и вы намерены централизованно генерировать пары ключей, у вас есть несколько вариантов.
Существуют аппаратные модули безопасности (HSM), которые делают это для вас. Если вы можете себе это позволить, это лучший способ.
В противном случае:
- Убедитесь, что ваше веб-приложение или оболочка генератора ключей работают под своим собственным пользователем (я буду называть этого пользователя kguser для остальной части этого ответа).
- Создать каталог, недоступный для Интернета, принадлежащий kguser, с разрешениями 0700 (устанавливается с помощью chmod)
- Убедитесь, что ваша оболочка генератора ключей установлена в 'umask 0177'; это должно гарантировать, что любые файлы, которые он создает, являются 0600 (только kguser сможет читать и писать)
- генерирует ваши ключи с указанием трудно угадываемых (например, случайных UUID) имен файлов
- chmod 0600 файлы ключей, как только вы их сгенерируете, на случай, если ваши настройки umask не сохранятся или будут изменены
- передать закрытый ключ через соединение SSL / TLS
- надежно стереть файл закрытого ключа (например, «shred» в Linux)
- использовать задание cron для регулярного поиска и безопасного удаления любых файлов закрытого ключа старше нескольких минут (для очистки любых файлов, оставшихся в результате ошибки приложения, сбоя и т. Д.)
Если вы действительно параноик, вы также можете убедиться, что ключи зашифрованы на диске, если ваше веб-приложение использует свой собственный симметричный ключ для шифрования при записи и дешифрования при отправке пользователю. Однако, это открывает больше возможностей для управления ключами, поэтому я не рекомендую это.
Установка ключевой фразы на ключ также очень поможет, если вы никогда не сохраните эту пароль на диск. Если кому-то удается восстановить ключ, защищенный парольной фразой, он все равно должен угадать ключевую фразу, чтобы ключ был полезным. Однако это также означает, что ваши пользователи должны будут предоставить парольную фразу при использовании ключа - это может или не может быть приемлемым.