Wincrypt і libReSSL З SSL на TLS - GoTo RetroCode
Насправді досить просто написати клієнта HTTP/1. Якщо ви можете обійтися без таких функцій, як проксі-сервери або підтримка життя, ви просто відкриваєте порт, надсилаєте рядок GET і порожній рядок, чекаєте відповіді, читаєте заголовок до порожнього рядка, а позаду - дані завантаження, чудово, зроблено.

Просто дурно, що сьогодні майже все передається у зашифрованому вигляді через HTTPS, тобто через тунель SSL/TLS.
і це не так просто реалізувати самостійно. Для цього вам потрібна допомога.
На щастя, зараз є кілька бібліотек, які можуть позбавити вас шифрування. Але в комерційних проектах подобається зустрічати вимогу не використовувати copyleft з відкритим вихідним кодом.
Тоді під Windows ви можете базікати з Windows Crypto API.
І якщо ОС POSIX дозволена, я завжди використовую libReSSL, акуратну вилку попереднього проекту OpenSSL.
Просто нагадування:
Все почалося з заголовка “Secure Socket Layer”, скорочено SSL, з яких існували версії 1 і 2, які швидко скинули, оскільки в ньому виникали невпевненості. SSL 3 проіснував довго, а незабаром з’явився SSL 3.1, який був перейменований в TLS (Transport Layer Security) 1.0.
Потім технологія була розширена і розширена під назвою TLS, і в 2018 році найсучасніший рівень техніки був досягнутий за допомогою TLS 1.3.
Проблеми безпеки з SSL 3, які також були визнані в останні роки, призвели до того, що SSL 3 деактивується сьогодні на всіх серверах, і сьогодні практично не використовується нічого нижче рівня TLS 1.2.
WinCrypt
Прикро в Crypto-API - це його загальний підхід, який насправді був би чудовим, якби його краще документувати. Тому мені знадобилося назавжди, щоб нарешті з’ясувати, як реалізувати SSL/TLS-зв’язки через нього.
Ось мій спосіб для простих клієнтів SSL в двох словах:
OpenSSL та libReSSL
API OpenSSL, який також доступний у libReSSL, дозволяє безпосередньо використовувати сокети, але мені не подобається цей варіант, тому що у вас немає рівня зв'язку під контролем, і він не може бути інтегрований в існуючі обробники зв'язку.
Тому я приймаю маршрут буфера даних потоку пам'яті. Шар SSL/TLS зчитує та записує ваші дані в ці буфери, і ми можемо потім передати їх на бажаний рівень зв'язку (наприклад, TCP/IP).
Цей метод особливо корисний при реалізації асинхронного зв'язку.
І це працює так:
Висновок
Фу, моя нещодавня екскурсія по API SSL майже стала маленьким підручником. Звичайно, ще багато чого не вистачає на тему «Цільове використання сертифікатів». Але якщо вас цікавить лише шифрування, а не автентифікація з'єднання, ви можете написати з ним невеликий клієнт.