У меня есть приложение C. Я хочу различать своих отправителей на основе версии openssl, которую они используют, от моего получателя. У меня есть один с openssl 1.0.2, а другой с openssl 3.0.5. Могу ли я узнать версию openssl, которую использует мой сверстник???
Переменная client_version в структуре SSL дает одинаковое значение для них обоих.
Добавление этого сюда из моего комментария.
Итак, на самом деле у моего старого кода есть некоторые проблемы (которые я не писал). Он делает SSL_free и SSL_CTX_free перед выполнением SSL_shutdown. Теперь это отлично работает в старой версии OpenSSL 1.0.2. Но после того, как я перенес свое приложение на 3.0.5, мне пришлось выполнить SSL_shutdown, чтобы связь работала правильно. Теперь, поскольку я делаю SSL_shutdown, я не могу связаться с отправителем, используя 1.0.2 ssl. Итак, я хочу узнать версию ssl отправителя, а затем выполнить SSL_shutdown, чтобы мой получатель правильно работал с отправителями, использующими любую версию SSL. «Я не могу изменить свой старый код».
Я владею и отправителем, и получателем. Я знаю, что они используют OpenSSL. Я хочу реализовать обратную совместимость для новой версии моего приложения, которое будет использовать OpenSSL 3.0. Итак, я хочу знать версию OpenSSL, которую использует другая сторона (отправитель), и обрабатывать мой код на основе этого.
Затем одна сторона должна явно сообщить другой, какую версию она использует.
Почему вас интересует библиотечная версия? Вы говорите о конкретном протоколе, возможно, о нескольких версиях протокола. Все, что вам нужно знать, это то, реализует ли другая сторона протокол и, если применимо, его версию.
Итак, я хочу знать версию OpenSSL, которую использует другая сторона (отправитель), и обрабатывать мой код на основе этого. Как это будет работать? Вам нужно будет опубликовать информацию о версии после того, как вы выполните полное SSL-соединение, и к этому моменту различия версий не будут иметь никакого значения, потому что у вас будет безопасное соединение.
Итак, на самом деле у моего старого кода есть некоторые проблемы (которые я не писал). Он делает SSL_free и SSL_CTX_free перед выполнением SSL_shutdown. Теперь это отлично работает в старой версии OpenSSL 1.0.2. Но после того, как я перенес свое приложение на 3.0.5, мне пришлось выполнить SSL_shutdown, чтобы связь работала правильно. Теперь, поскольку я делаю SSL_shutdown, я не могу связаться с отправителем, используя 1.0.2 ssl. Итак, я хочу узнать версию ssl отправителя, а затем выполнить SSL_shutdown, чтобы мой получатель правильно работал с отправителями, использующими любую версию SSL. «Я не могу изменить свой старый код».
«Поскольку я использую SSL_shutdown, я не могу связаться с отправителем, используя 1.0.2 ssl». Это вообще не звучит разумно. Почему это так? Возможно, вам следует задать вопрос об этой проблеме.
Кстати, OpenSSL 1.0.2 больше не поддерживается с 1 января 2020 года и больше не получает обновлений.
Я владею и отправителем, и получателем. Я знаю, что они используют OpenSSL. Я хочу реализовать обратную совместимость для новой версии моего приложения, которое будет использовать OpenSSL 3.0.
Обнаружение версий одноранговой библиотеки TLS — это не то, как должна быть реализована обратная совместимость для уровня TLS. Вместо этого ваш сервер должен ожидать определенных поддерживаемых версий протокола TLS и шифров.
OpenSSL 1.0.2 поддерживает до TLS 1.2, который также поддерживается OpenSSL 3.0 (который также поддерживает TLS 1.3). Также существует много совпадений в поддерживаемых шифрах между OpenSSL 1.0.2 и OpenSSL 3.0 — см. здесь для 1.0.2 и здесь для 3.0. Обратите внимание, что фактические поддерживаемые версии шифров и протоколов также зависят от приложения и, возможно, от его конфигурации, но если вы контролируете и то, и другое, совпадение должно быть возможным.
(Из комментария) Итак, на самом деле в моем старом коде есть некоторые проблемы (которые я не писал). ... Итак, я хочу узнать версию ssl отправителя, а затем выполнить SSL_shutdown, чтобы мой получатель правильно работал с отправителями, использующими любую версию SSL.
Исходя из этого, ваше фактическое требование состоит не в том, чтобы получить точную версию библиотеки TLS, а только в том, чтобы различать клиента, использующего OpenSSL 1.0.2, и клиента, использующего OpenSSL 3.0, и только после выполнения рукопожатия TLS. Это требование намного проще, чем фактическое определение версии TLS: с правильно настроенным клиентом OpenSSL 3.0 вы сможете получить TLS 1.3, а с OpenSSL 1.0.2 вы сможете получить только TLS 1.2. Получить версию TLS установленного сеанса TLS можно, вызвав SSL_get_version.
Как вы думаете, почему они вообще используют OpenSSL? SSL — это общедоступный стандарт со многими существующими реализациями, OpenSSL — лишь одна из них.
client_version
— это версия протокола SSL, а не какой-либо библиотеки. И в любом случае это бессмысленно, см. github.com/openssl/openssl/issues/7079.