Посібник з налаштування SSL, TLS та Proxy в curl

Налаштування HTTPS-сертифікатів, версій TLS, проксі та користувацької роздільної здатності DNS у curl є необхідним для безпечної API-комунікації, CI/CD pipeline'ів та налагодження мережевих проблем. Цей посібник охоплює кожен прапорець SSL, TLS, proxy та мережі — від вимкнення перевірки сертифікатів за допомогою -k для локальної розробки до налаштування взаємного TLS за допомогою --cert та маршрутизації трафіку через SOCKS5 проксі. Кожна опція містить зрозуміле пояснення, рекомендації щодо безпеки та готовий до копіювання приклад.

Короткий довідник прапорців SSL та Proxy

-kSSL/TLS

Дозволити незахищені з'єднання — пропустити всю перевірку SSL

--cacertSSL/TLS

Перевірити сертифікат сервера за конкретним CA-пакетом

--certSSL/TLS

Надати клієнтський сертифікат для взаємної TLS-автентифікації

--keySSL/TLS

Надати файл приватного ключа для клієнтського сертифіката

--tlsv1.2SSL/TLS

Використовувати TLS версії 1.2 або вище для з'єднання

--tlsv1.3SSL/TLS

Використовувати TLS версії 1.3 або вище для з'єднання

--ssl-reqdSSL/TLS

Вимагати SSL/TLS для з'єднання (невдача, якщо недоступний)

--ciphersSSL/TLS

Вказати, які SSL-шифри використовувати для з'єднання

--cert-typeSSL/TLS

Вказати тип клієнтського сертифіката (PEM, DER, ENG, P12)

--pinnedpubkeySSL/TLS

Закріпити та перевірити відкритий ключ сервера (стиль HPKP)

-xProxy

Спрямувати весь трафік через вказаний проксі-сервер

Спрямувати з'єднання через SOCKS5 проксі

Надати ім'я_користувача:пароль для проксі-сервера

Список хостів, які не повинні проходити через проксі

--socks5-hostnameProxy

SOCKS5 проксі з DNS-розрішенням через проксі

--proxy-cacertProxy

CA-сертифікат для перевірки самого HTTPS проксі

--resolveМережа

Зіставити конкретну пару host:port з користувацькою IP-адресою

--connect-toМережа

Підключитися до іншого host:port, ніж вказано в URL

--local-portМережа

Встановити номер або діапазон локального порту для з'єднання

--interfaceМережа

Прив'язати з'єднання до конкретного мережевого інтерфейсу

--dns-serversМережа

Використовувати власні 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/data

curl --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/secure

curl --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/secure

curl --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-reqd

Вимагати SSL/TLS для з'єднання (невдача, якщо недоступний)

--ciphers

Вказати, які SSL-шифри використовувати для з'єднання

--cert-type

Вказати тип клієнтського сертифіката (PEM, DER, ENG, P12)

--pinnedpubkey

Закріпити та перевірити відкритий ключ сервера (стиль 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/data

curl --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/data

curl --proxy-user: Автентифікація на проксі

Що робить
Прапорець --proxy-user (або -U) надсилає облікові дані автентифікації на проксі-сервер. Формат: user:password. Це окремо від автентифікації на сервері (-u).
Коли використовувати
Потрібен, коли проксі-сервер вимагає автентифікацію — типово для корпоративних та enterprise мережевих середовищ. Облікові дані надсилаються на проксі, а не на цільовий сервер.
$ curl -x http://proxy.corp.com:3128 -U user:pass https://external-api.com/data

curl --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-hostname

SOCKS5 проксі з DNS-розрішенням через проксі

--proxy-cacert

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/health

curl --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

Додаткові мережеві опції

--local-port

Встановити номер або діапазон локального порту для з'єднання

--interface

Прив'язати з'єднання до конкретного мережевого інтерфейсу

--dns-servers

Використовувати власні 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/data

Docker-контейнер з внутрішнім CA

Коли сервіси в Docker використовують сертифікати від внутрішнього CA, змонтуйте CA-сертифікат у контейнер та вкажіть його через --cacert. Це безпечніше за -k, оскільки все ще валідує ланцюжок сертифікатів.

$ curl --cacert /etc/ssl/certs/internal-ca.crt https://service.docker.internal:8443/health

SOCKS5 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'ах.