Моя клиент-серверная программа использует OpenSSL для управления обменом данными и работает, но я должен быть уверен, что сервер, к которому подключается мой клиент, является правильным, а не поддельным.
Проблема в том, что моя программа генерирует самоподписанный сертификат, и клиент не может проверить этим. Если я встраиваю сертификат, любой может извлечь его, сделать поддельный клиент-сервер и попытаться украсть информацию. То же самое для ключей OpenPGP.
Итак, могу ли я реализовать какой-либо метод проверки сервера, даже если двоичный файл сервера доступен для всех, поскольку это тоже клиент?
В этой ситуации безопасная аутентификация зависит не от фактического сертификата, а от пары ключей.
Асимметричная криптография опирается на закрытый и открытый ключи. Закрытый ключ должен оставаться конфиденциальным (поэтому храните его на сервере, который должен быть аутентифицирован, тот, который вы описали как правильный сервер). Открытый ключ может быть произвольно распространен, единственное, что кто-то может сделать, — это зашифровать информацию для владельца закрытого ключа или проверить подпись, выданную им.
(Очень) основная идея, лежащая в основе фактического процесса аутентификации, заключается либо в том, что аутентифицирующий клиент отправляет зашифрованное случайное число, которое только правильный сервер может расшифровать и вернуть, либо в том, что сервер подписывает что-то определенное клиентом. Реальный процесс, реализованный для аутентификации, немного более сложен для предотвращения атак типа «человек посередине», но далеко выходит за рамки этого ответа.
Итак, могу ли я реализовать какой-либо метод проверки сервера, даже если двоичный файл сервера доступен для всех, поскольку это тоже клиент?
Положитесь на что-то уже существующее и не используйте криптографический код самостоятельно. Может быть, рассмотрим использование TLS для зашифрованной связи в любом случае, если вы уже распределяете ключи, аутентификация будет выполняться на этапе установления связи.