Я пытаюсь добавить завершающие элементы в клиент-серверное приложение, которое я пишу, но что-то, кажется, пошло не так на последнем этапе установления связи SSL.
Клиентская часть программы подключается и устанавливает безопасное соединение с сервером без проблем, но если я хочу запускать операции со стороны сервера программы, она не может установить какое-либо соединение.
Когда я пытаюсь подключиться к моему серверу через Firefox (в качестве клиента), браузер предупреждает меня, что сертификат не подходит для подключения.
На стороне сервера мои журналы отражают наличие unknown ca
или certificate unkown
всякий раз, когда я пытаюсь принять байты от своего клиента.
Думаю, мой вопрос сводится к этому:
Вам нужно создавать разные сертификаты для приложения на стороне клиента и приложения на стороне сервера? В чем разница между ними?
Так же, как сертификаты сервера однозначно идентифицируют сервер (или домен), сертификаты клиентов однозначно идентифицируют клиента. И точно так же, как сертификаты сервера должны быть подписаны кем-то, кому доверяет клиент, клиентские сертификаты должны быть подписаны кем-то, кому сервер доверяет.
Обычно, когда вы настраиваете сервер для приема клиентских сертификатов, вы указываете сертификат подписи, который должен использоваться для подписи сертификата клиента. Это позволяет серверу знать, что клиент «авторизован», что бы это ни значило в вашем контексте, поскольку, вероятно, вы будете подписывать сертификаты только для «авторизованных» пользователей.
Разрешение клиентских сертификатов без какой-либо проверки, как правило, возможно с большинством серверов, но в некотором роде нарушает всю цель.
Это зависит от типа сертификата сервера. Иногда самоподписанные сертификаты могут быть проблематичными. Если он подписан центром сертификации, как правило, сертификат клиента также должен быть подписан тем же центром сертификации и может потребовать включения всей цепочки сертификатов.
Вы можете использовать openssl для сбора некоторой информации о приемлемых центрах сертификации для клиентских сертификатов с помощью командной строки:
openssl s_client -connect host.domain.tld:443
или любой другой порт, который прослушивает SSL. Это должно предоставить информацию о цепочке сертификатов вплоть до корневого ЦС, а также предоставить приемлемые ЦС для клиентских сертификатов.
jtpresta в одном из своих комментариев косвенно высказывает интересную, но очень верную мысль: аутентификация клиента SSL - это беспорядок. Это хорошо, потому что это абсолютно безопасно, но это ужасно, потому что его сложно как настроить, так и поддерживать.
Если у вас нет действительно веской причины, используйте вместо этого аутентификацию с общим ключом (например, "пароль"). Вы сэкономите время и деньги. SSL-аутентификация хороша в тех случаях, когда безопасность значительно превышает затраты.