Я написал простые программы на C, в которых используются сокеты («клиент» и «сервер»). (Использование UNIX / Linux)
На стороне сервера просто создается сокет:
sockfd = socket(AF_INET, SOCK_STREAM, 0);
А затем привязывает его к sockaddr:
bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
И слушает (принимает и читает):
listen(sockfd,5);
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
read(newsockfd,buffer,255);
Клиент создает сокет, а затем записывает в него.
Теперь я хочу преобразовать это простое соединение в соединение SSL самым простым, идиллическим, опрятным и быстрым способом.
Я пытался добавить OpenSSL в свой проект, но не могу найти простой способ реализовать то, что хочу.
stunnel
,stunnel4
пакет находится в дистрибутиве на основе Debian, и его легко использовать. Есть некоторые ограничения по сравнению с добавлением надлежащей поддержки SSL на ваш сервер, но это может быть хорошим решением. Мне нравится stunnel, потому что он, кажется, соответствует подходу программных средств UNIX.Ответы:
При использовании OpenSSL есть несколько шагов. Вы должны иметь сертификат SSL, который может содержать сертификат с закрытым ключом, обязательно укажите точное местоположение сертификата (в этом примере он находится в корне). Есть много хороших руководств.
Некоторые включают:
Вам нужно будет инициализировать OpenSSL:
Теперь об основной части функциональности. Вы можете добавить цикл while для соединений.
После этого вы сможете читать или писать, используя:
Обновление .
SSL_CTX_new
Следует вызывать метод TLS, который лучше всего соответствует вашим потребностям для поддержки новых версий безопасности, а неSSLv23_server_method()
. См .: Описание OpenSSL SSL_CTX_newисточник
if
неверно. Должно бытьif (ssl_err <= 0) {
только тогда это ошибка.SSL_accept()
возвращается1
в случае успеха,0
в случае «контролируемого отказа» и-1
«фатального отказа». См. Страницу руководства.SSL_CTX_set_tmp_dh[_callback]()
не будут вызваны. Только что обнаружил на собственном опыте, что без него не будут работать NULL-шифры, генерируя предупреждение номер 40.SSLv23_server_method()
что сервер понимает SSLv2 и v3 и теперь устарел. Для поддержки TLS 1.1 и 1.2 замените этот метод наTLS_server_method()
. источникOpenSSL довольно сложен. Легко случайно отказаться от всей вашей безопасности, если не ведете переговоры правильно. (Черт возьми, меня лично укусила ошибка, из-за которой curl неправильно читал предупреждения OpenSSL и не мог разговаривать с некоторыми сайтами.)
Если вы действительно хотите быстро и просто, поставьте « шпильку» перед своей программой до последней минуты. Использование SSL в другом процессе не замедлит вас: http://vincent.bernat.im/en/blog/2011-ssl-benchmark.html
источник
Для таких, как я:
Когда-то был пример в источнике SSL в каталоге
demos/ssl/
с примером кода на C ++. Теперь это доступно только через историю: https://github.com/openssl/openssl/tree/691064c47fd6a7d11189df00a0d1b94d8051cbe0/demos/sslВам, вероятно, придется найти рабочую версию. Первоначально я опубликовал этот ответ 6 ноября 2015 года. И мне пришлось отредактировать исходный код - немного.
Сертификаты: .pem в
demos/certs/apps/
: https://github.com/openssl/openssl/tree/master/demos/certs/appsисточник
Вот мой пример потоков сервера сокетов ssl (множественное соединение) https://github.com/breakermind/CppLinux/blob/master/QtSslServerThreads/breakermindsslserver.cpp
источник