Посібник з налаштування SSL, TLS та Proxy в curl
Налаштування HTTPS-сертифікатів, версій TLS, проксі та користувацької роздільної здатності DNS у curl є необхідним для безпечної API-комунікації, CI/CD pipeline'ів та налагодження мережевих проблем. Цей посібник охоплює кожен прапорець SSL, TLS, proxy та мережі — від вимкнення перевірки сертифікатів за допомогою -k для локальної розробки до налаштування взаємного TLS за допомогою --cert та маршрутизації трафіку через SOCKS5 проксі. Кожна опція містить зрозуміле пояснення, рекомендації щодо безпеки та готовий до копіювання приклад.
Короткий довідник прапорців SSL та Proxy
Дозволити незахищені з'єднання — пропустити всю перевірку SSL
Перевірити сертифікат сервера за конкретним CA-пакетом
Надати клієнтський сертифікат для взаємної TLS-автентифікації
Надати файл приватного ключа для клієнтського сертифіката
Використовувати TLS версії 1.2 або вище для з'єднання
Використовувати TLS версії 1.3 або вище для з'єднання
Вимагати SSL/TLS для з'єднання (невдача, якщо недоступний)
Вказати, які SSL-шифри використовувати для з'єднання
Вказати тип клієнтського сертифіката (PEM, DER, ENG, P12)
Закріпити та перевірити відкритий ключ сервера (стиль HPKP)
Спрямувати весь трафік через вказаний проксі-сервер
Спрямувати з'єднання через SOCKS5 проксі
Надати ім'я_користувача:пароль для проксі-сервера
Список хостів, які не повинні проходити через проксі
SOCKS5 проксі з DNS-розрішенням через проксі
CA-сертифікат для перевірки самого HTTPS проксі
Зіставити конкретну пару host:port з користувацькою IP-адресою
Підключитися до іншого host:port, ніж вказано в URL
Встановити номер або діапазон локального порту для з'єднання
Прив'язати з'єднання до конкретного мережевого інтерфейсу
Використовувати власні DNS-сервери замість системних за замовчуванням (c-ares)
curl -k: Ігнорувати помилки SSL-сертифікатів
- Що робить
- Прапорець
-k(або--insecure) вимикає всю перевірку SSL/TLS сертифікатів. curl не перевірятиме, чи підписаний сертифікат сервера довіреним CA, чи збігається ім'я хоста, чи не закінчився термін дії сертифіката. - Коли використовувати
- Використовуйте тільки для локальної розробки з самопідписаними сертифікатами або тестових середовищ. Для staging/production використовуйте натомість
--cacertз реальним сертифікатом CA — це і безпечніше, і більш явно.
$ curl -k https://localhost:8443/api/healthНіколи не використовуйте -k у production-скриптах або CI/CD pipeline'ах. Це вимикає всю валідацію сертифікатів, роблячи ваше з'єднання вразливим до атак типу «людина посередині». Використовуйте --cacert для довіри конкретному CA.
curl --cacert: Використати власний CA-сертифікат
- Що робить
- Прапорець
--cacertвказує curl перевіряти SSL-сертифікат сервера за конкретним файлом пакета CA (Центру сертифікації) у форматі PEM замість системного сховища довіри за замовчуванням. - Коли використовувати
- Використовуйте, коли ваш сервер використовує сертифікат, підписаний приватним або внутрішнім CA, якого немає в системному сховищі довіри. Це типово для корпоративних середовищ, кластерів Kubernetes та Docker з внутрішньою PKI.
$ curl --cacert /path/to/corporate-ca.pem https://internal-api.example.com/datacurl --cert: Клієнтський сертифікат (взаємний TLS)
- Що робить
- Прапорець
--certнадає клієнтський сертифікат для взаємного TLS (mTLS). У mTLS і сервер, і клієнт надають сертифікати для перевірки ідентичності один одного. Файл сертифіката повинен бути у форматі PEM або PKCS#12. - Коли використовувати
- Потрібен, коли сервер вимагає автентифікацію клієнтським сертифікатом — типово для банківських API, державних сервісів, IoT-пристроїв та архітектур з нульовою довірою. Завжди поєднуйте з
--key, якщо ключ не вбудований у файл сертифіката.
$ curl --cert client.pem --key client-key.pem https://mtls-api.example.com/securecurl --key: Приватний ключ клієнтського сертифіката
- Що робить
- Прапорець
--keyвказує файл приватного ключа, що відповідає клієнтському сертифікату, наданому через--cert. Ключ повинен відповідати сертифікату. Якщо ключ захищений паролем, curl запитає пароль (або використовуйте--pass). - Коли використовувати
- Завжди використовуйте разом з
--cert. Якщо приватний ключ вже вбудований у файл сертифіката (типово для PKCS#12 / .p12 файлів),--keyможна пропустити.
$ curl --cert client.pem --key client-key.pem --cacert server-ca.pem https://api.example.com/securecurl --tlsv1.2: Примусово TLS 1.2 мінімум
- Що робить
- Прапорець
--tlsv1.2змушує curl використовувати TLS 1.2 як мінімально допустиму версію для SSL/TLS рукостискання. Старіші протоколи (TLS 1.0, 1.1, SSLv3) відхиляються. - Коли використовувати
- Використовуйте для забезпечення мінімального стандарту безпеки. TLS 1.2 необхідний для відповідності PCI-DSS і підтримується всіма сучасними серверами. Більшість сучасних збірок curl вже за замовчуванням використовують TLS 1.2+, але цей прапорець робить це явним.
$ curl --tlsv1.2 -v https://secure.example.com/api 2>&1 | grep 'SSL connection'curl --tlsv1.3: Примусово TLS 1.3 мінімум
- Що робить
- Прапорець
--tlsv1.3змушує curl використовувати TLS 1.3 — найшвидшу та найбезпечнішу версію TLS. TLS 1.3 усуває додатковий обмін даними під час рукостискання (підтримка 0-RTT) та видаляє всі застарілі набори шифрів. - Коли використовувати
- Використовуйте, коли знаєте, що сервер підтримує TLS 1.3 і вам потрібна найкраща продуктивність та безпека. Примітка: TLS 1.3 вимагає OpenSSL 1.1.1+ або сумісну TLS-бібліотеку. Ще не всі сервери його підтримують.
$ curl --tlsv1.3 https://modern-api.example.com/dataДодаткові опції SSL/TLS
Вимагати SSL/TLS для з'єднання (невдача, якщо недоступний)
Вказати, які SSL-шифри використовувати для з'єднання
Вказати тип клієнтського сертифіката (PEM, DER, ENG, P12)
Закріпити та перевірити відкритий ключ сервера (стиль HPKP)
curl -x: Використати HTTP/HTTPS Proxy
- Що робить
- Прапорець
-x(або--proxy) спрямовує весь трафік curl через вказаний проксі-сервер. Формат:[protocol://]host[:port]. Підтримувані протоколи проксі: HTTP, HTTPS, SOCKS4, SOCKS5. - Коли використовувати
- Використовуйте для корпоративних проксі-серверів, налагодження за допомогою інструментів як Fiddler, Charles або mitmproxy, тестування географічних обмежень або коли прямий доступ до інтернету недоступний. Також можна встановити змінні середовища
http_proxy/https_proxy.
$ curl -x http://proxy.example.com:8080 https://api.example.com/datacurl --socks5: Використати SOCKS5 Proxy
- Що робить
- Прапорець
--socks5вказує curl використовувати SOCKS5 проксі для TCP-з'єднання. На відміну від HTTP проксі, SOCKS5 працює на рівні TCP і може обробляти будь-який протокол — не лише HTTP. DNS-розрішення за замовчуванням виконується локально; використовуйте--socks5-hostnameдля розрішення DNS через проксі. - Коли використовувати
- Використовуйте для SSH-тунелів (
ssh -D), доступу до мережі Tor або коли проксі повинен обробляти не-HTTP протоколи. SOCKS5 підтримує UDP і може опціонально обробляти DNS — що робить його гнучкішим за HTTP проксі.
$ curl --socks5 localhost:1080 https://api.example.com/datacurl --proxy-user: Автентифікація на проксі
- Що робить
- Прапорець
--proxy-user(або-U) надсилає облікові дані автентифікації на проксі-сервер. Формат:user:password. Це окремо від автентифікації на сервері (-u). - Коли використовувати
- Потрібен, коли проксі-сервер вимагає автентифікацію — типово для корпоративних та enterprise мережевих середовищ. Облікові дані надсилаються на проксі, а не на цільовий сервер.
$ curl -x http://proxy.corp.com:3128 -U user:pass https://external-api.com/datacurl --noproxy: Обійти проксі для конкретних хостів
- Що робить
- Прапорець
--noproxyвказує розділений комами список хостів, доменів або IP-адрес, які повинні обходити проксі та з'єднуватися напряму. Підтримує підстановочні знаки:*.example.comвідповідає всім піддоменам. - Коли використовувати
- Використовуйте для виключення localhost, внутрішніх сервісів або конкретних доменів з проксі. Це важливо, коли проксі встановлено глобально через змінні середовища, але деякі хости (як локальні сервіси) потребують прямого доступу. Використовуйте
*, щоб обійти проксі для всіх хостів.
$ curl -x http://proxy:8080 --noproxy "localhost,127.0.0.1,*.internal.com" https://localhost:3000/apiДодаткові опції Proxy
SOCKS5 проксі з DNS-розрішенням через проксі
CA-сертифікат для перевірки самого HTTPS проксі
curl --resolve: Користувацьке DNS-розрішення
- Що робить
- Прапорець
--resolveнадає користувацьку IP-адресу для конкретної париhost:port, повністю обходячи DNS-пошук. Формат:host:port:address. Можна вказати декілька записів--resolve. - Коли використовувати
- Необхідний для тестування до розповсюдження DNS, перевірки конкретного бекенду за балансувальником навантаження або локальної розробки, де потрібне реальне ім'я хоста для валідації SSL-сертифіката. На відміну від редагування
/etc/hosts, це діє на рівні запиту та порту.
$ curl --resolve api.example.com:443:127.0.0.1 https://api.example.com/healthcurl --connect-to: Перенаправити з'єднання на інший хост
- Що робить
- Прапорець
--connect-toперенаправляє TCP-з'єднання на іншу паруhost:port, зберігаючи оригінальний URL для HTTP-запиту (включаючи заголовокHostта SNI). Формат:HOST1:PORT1:HOST2:PORT2. - Коли використовувати
- Використовуйте для тестування конкретного бекенд-сервера за балансувальником навантаження без зміни DNS або
/etc/hosts. На відміну від--resolve, це зіставляє host:port з host:port (не з IP), що корисно, коли ціль також має ім'я хоста.
$ curl --connect-to api.example.com:443:backend1.internal:8443 https://api.example.com/healthДодаткові мережеві опції
Встановити номер або діапазон локального порту для з'єднання
Прив'язати з'єднання до конкретного мережевого інтерфейсу
Використовувати власні DNS-сервери замість системних за замовчуванням (c-ares)
Реальні сценарії SSL та Proxy
Ці приклади поєднують декілька прапорців для вирішення типових завдань безпеки та мережі в середовищах розробки, CI/CD та production.
Тестування HTTPS на localhost
При локальній розробці з самопідписаним сертифікатом поєднуйте --resolve з --cacert (або -k для швидкого тестування). Це дозволяє використовувати реальне ім'я хоста для правильного SSL/SNI без зміни файлу hosts.
$ curl --resolve myapp.local:443:127.0.0.1 --cacert local-ca.pem https://myapp.local/api/statusВзаємний TLS (автентифікація клієнтським сертифікатом)
Деякі API вимагають, щоб і сервер, і клієнт надали сертифікати. Надайте --cert, --key та --cacert для встановлення повністю перевіреного двостороннього TLS-з'єднання.
$ curl --cert client.pem --key client-key.pem --cacert server-ca.pem https://mtls-api.example.com/dataКорпоративний проксі з автентифікацією
У корпоративних мережах з обов'язковими проксі-серверами поєднуйте -x з -U для облікових даних проксі. Додайте --noproxy, щоб виключити внутрішні сервіси з проксі.
$ curl -x http://proxy.corp.com:3128 -U user:pass --noproxy "*.internal.corp" https://external-api.com/dataDocker-контейнер з внутрішнім CA
Коли сервіси в Docker використовують сертифікати від внутрішнього CA, змонтуйте CA-сертифікат у контейнер та вкажіть його через --cacert. Це безпечніше за -k, оскільки все ще валідує ланцюжок сертифікатів.
$ curl --cacert /etc/ssl/certs/internal-ca.crt https://service.docker.internal:8443/healthSOCKS5 Proxy через SSH-тунель
Створіть SOCKS5 проксі за допомогою ssh -D та спрямуйте трафік curl через нього за допомогою --socks5. Це корисно для доступу до внутрішніх сервісів через bastion-хост.
$ curl --socks5 localhost:1080 https://internal-api.example.com/statusЧасті запитання про SSL та Proxy в curl
Як пропустити перевірку SSL-сертифіката в curl?
Використовуйте curl -k URL або curl --insecure URL. Це вимикає всі перевірки сертифікатів — термін дії, невідповідність імені хоста, недовірений CA. Використовуйте тільки для локальної розробки. Для production використовуйте --cacert з реальним CA-сертифікатом.
Як змусити curl довіряти самопідписаному сертифікату?
Використовуйте curl --cacert /path/to/ca.pem URL, щоб вказати CA-сертифікат, який підписав ваш самопідписаний сертифікат. Це безпечніше за -k, оскільки все ще валідує ланцюжок сертифікатів — довіряючи лише вашому конкретному CA.
Як перевірити, яку версію TLS використовує curl?
Запустіть curl -v URL та знайдіть рядок * SSL connection using TLSv1.x / CipherSuite у докладному виводі. Щоб примусити конкретну версію, використовуйте --tlsv1.2 або --tlsv1.3.
Що таке взаємний TLS (mTLS) і як його використовувати з curl?
Взаємний TLS вимагає, щоб обидва — сервер і клієнт — надали сертифікати. Використовуйте: curl --cert client.pem --key client-key.pem --cacert server-ca.pem URL. Пара --cert/--key автентифікує клієнта; --cacert перевіряє сервер.
Як використовувати curl через HTTP проксі?
Використовуйте curl -x http://proxy:port URL. Для HTTPS проксі: curl -x https://proxy:port URL. Альтернативно встановіть змінні середовища http_proxy та https_proxy — curl підхоплює їх автоматично.
Як використовувати curl з SOCKS5 проксі?
Використовуйте curl --socks5 host:port URL для локального DNS-розрішення або curl --socks5-hostname host:port URL для розрішення DNS через проксі (важливо для приватності/Tor). Приклад з SSH-тунелем: ssh -D 1080 user@bastion, потім curl --socks5 localhost:1080 URL.
Як автентифікуватися на проксі-сервері в curl?
Використовуйте curl -x http://proxy:port -U user:password URL. Прапорець -U (або --proxy-user) надсилає облікові дані на проксі. Це окремо від -u, який автентифікує на цільовому сервері.
Як виключити певні хости з проксі в curl?
Використовуйте --noproxy "localhost,127.0.0.1,*.internal.com" або встановіть змінну середовища NO_PROXY. Підтримує підстановочні знаки (*.example.com). Використовуйте --noproxy "*", щоб повністю обійти проксі для одного запиту.
Як тестувати HTTPS на localhost з curl?
Для швидкого тестування: curl -k https://localhost:8443/. Для правильної валідації: curl --resolve myapp.local:443:127.0.0.1 --cacert local-ca.pem https://myapp.local/. Підхід з --resolve дозволяє правильно зіставити ім'я хоста сертифіката.
Як перевизначити DNS-розрішення для конкретного хоста в curl?
Використовуйте curl --resolve host:port:IP URL. Приклад: curl --resolve api.example.com:443:192.168.1.100 https://api.example.com/. Це обходить DNS лише для цієї пари host:port — не потрібно редагувати /etc/hosts.
Як виправити 'SSL certificate problem: certificate has expired' в curl?
Сертифікат сервера закінчився. Рішення: (1) Оновіть сертифікат на сервері, (2) Оновіть пакет CA: curl --cacert /path/to/updated-ca.pem URL, (3) Тільки для тестування: curl -k URL. Перевірте термін: curl -v URL 2>&1 | grep expire.
Чи безпечно використовувати curl --insecure (-k) у production?
Ні. Прапорець -k вимикає всю валідацію сертифікатів — термін дії, ім'я хоста та ланцюжок довіри. Це робить ваше з'єднання вразливим до атак типу «людина посередині». Завжди використовуйте --cacert з конкретним CA-сертифікатом у production та CI/CD pipeline'ах.