Как SSL-клиент может проверить сертификат сервера?
-
03-07-2019 - |
Вопрос
Я создаю приложение и планирую использовать OpenSSL для обеспечения безопасности передачи данных.
Я планирую, чтобы клиент только проверял сертификат сервера.Я в замешательстве относительно того, как я должен защитить сертификат сервера.Я хотел бы зашифровать сертификат сервера, содержащий закрытый ключ, но я не хочу использовать какие-либо жестко закодированные ключи для этого шифрования.
Каковы некоторые из распространенных практик, которым следуют приложения, использующие SSL?
Решение
Просто чтобы убедиться, что мы правильно понимаем нашу терминологию, "SSL-сертификат" в просторечии на самом деле состоит из двух компонентов:
- Публичный сертификат
- Закрытый ключ
Компонент общедоступного сертификата подписывается выбранным вами центром сертификации (certificate authority), после чего его можно свободно распространять.Его не нужно защищать или шифровать, и действительно, он будет отправлен клиентам, которые подключаются к вашему серверу в рамках согласования SSL.
Компонент закрытого ключа должен быть защищен.В большинстве случаев это просто сохраняется в виде зашифрованного файла на сервере.Высококлассные решения используют специальное "защищенное от несанкционированного доступа" криптооборудование (HSM - аппаратные модули безопасности) для хранения закрытого ключа.Они варьируются от решений на основе смарт-карт до многоключевых сетевых устройств с управлением m / n и т.д.Существуют риски (не говоря уже о затратах), связанные с HSM, в которые я не буду здесь вдаваться.
Многие приложения просто сохраняют закрытый ключ на диске.Существует несколько вариантов защиты файла ключа:
- Полагайтесь на безопасность системы и прав доступа к файлам (т.е. не шифруйте закрытый ключ).Например, большинство ssh-демонов делают это.
- Используйте любой механизм, предоставляемый вашим сервером, для шифрования файла - защищенное паролем шифрование является стандартной функцией на большинстве веб-серверов.(Если вы создаете свой собственный, используя OpenSSL API, выберите один из очевидных форматов собственных ключей).
Как всегда, существует компромисс в плане безопасности.В частности, если вы используете защищенное паролем шифрование файла закрытого ключа и у вас происходит неожиданный перезапуск приложения (например, отключение питания), то кто-то должен быть доступен, чтобы предоставить пароль приложению при его перезапуске.Хранение пароля в файле, который считывается сценариями инициализации системы (как рекомендуется по крайней мере двумя поставщиками веб-серверов), мало что добавляет с точки зрения реальной безопасности.Трудно рекомендовать оставлять файл закрытого ключа незашифрованным, но если вы являетесь единственным администратором / техническим специалистом в небольшом магазине, вам определенно следует подумать о том, что может произойти, если сервер перезагрузится, когда вы будете недоступны, и каковы могут быть издержки для вашего бизнеса.
Другие советы
не совсем понимаю, о чем вы пытаетесь спросить.сертификат сервера отправляется вам, клиенту;вы подтверждаете сертификат, проверяя его подпись (используйте SHA-1, а не MD5, MD5 был взломан.) Ключ, полученный от центра сертификации, является общедоступным;центр сертификации и владелец сертификата сервера хранят свои закрытые ключи при себе.Вы можете подтвердить сертификат, потому что открытого ключа достаточно, чтобы расшифровать сообщение, которое было зашифрованный с помощью закрытого ключа.Таким образом, вам вообще не нужно беспокоиться о том, чтобы сохранить сертификат в зашифрованном виде.
Взгляните на Статья в Википедии о SSL /TLS.
Я в замешательстве относительно того, как я должен защитить сертификат сервера.
Вам не нужно защищать сертификат сервера.Это общедоступный документ
Я хотел бы зашифровать сертификат сервера, содержащий закрытый ключ
Сертификат сервера не содержит закрытого ключа.
но я не хочу использовать какие-либо жестко закодированные ключи для этого шифрования.
Вам не нужно выполнять никакого шифрования.Единственный ресурс сервера, который вам необходимо защитить, - это его закрытый ключ, который полностью отличается от его сертификата.В случае OpenSSL это даже может быть другой файл.