2015-08-10 5 views
0

В настоящее время я пишу настольное приложение, которое нужно будет связывать с PHP-скриптами на моем удаленном сервере через https (с самозаверяющим сертификатом). Код связи между сервером и клиентом все еще находится на стадии планирования, однако, поскольку я еще не понял, как проверить (на клиенте), что я действительно общаюсь с MY-сервером. Я предполагаю, что есть способ проверить подлинность серверов с помощью сертификата. Я намерен использовать WinHTTP для связи https, предоставляя ему все необходимые функции.Как проверить самозаверяющий сертификат?

ответ

1

Чтобы значительно упростить ситуацию: клиенты проверяют сертификат сервера, используя жесткий список доверенных сертификационных центров. Список сертификатов - это внутренний список сертификатов, которые выпекаются в клиенте, а клиент проверяет, что сертификат, представленный сервером, подписан одним из органов сертификации, которым доверяет клиент.

Таким образом, независимо от того, что вы в конечном итоге делаете, вашему клиенту придется хранить какой-то список сертификатов, которым он доверяет. Это фундаментальный аспект модели доверия TLS. Вы можете просто добавить свой самозаверяющий сертификат к клиенту, и клиент проверяет, что ваш сервер предоставил тот же сертификат.

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

+0

Я собираюсь для простоты здесь, поэтому я думаю, что первым решением будет то, с чем я иду. Я столкнулся с ответом, который, похоже, использует это решение с WinHTTP. http://stackoverflow.com/questions/25125165/certificate-pinning-with-winhttp-api Хотя я мог бы немного поработать над тем, как реализовать проверку. Могу ли я приостановить свою функцию, которая будет связываться с сервером до тех пор, пока обратный вызов не будет удовлетворен? –

+0

Мне кажется, что гораздо проще просто заменить свой список полномочий сертификатов стека TLS на свой собственный, и просто позвольте своему стеку настроить соединение TLS так, как он обычно делает, вместо того, чтобы крутиться в кругах, настраивая свои собственные обратные вызовы проверки сертификатов, а затем беспокоиться о правильной проверке сертификата сервера, проверке срока действия/срока действия и т. д. ... –