Перейти до вмісту
Глоссарий 2 хв читання 36 переглядів

SSL-піннінг

Дізнайтеся про SSL-піннінг, критичний механізм безпеки, що запобігає атакам типу "людина посе

Безопасность
SSL-піннінг

Закріплення SSL (SSL Pinning) — це механізм безпеки, за якого клієнтська програма жорстко кодує або "закріплює" очікуваний криптографічний сертифікат або відкритий ключ сервера, що призводить до збою з'єднань, коли проксі-сервер намагається перехопити трафік за допомогою іншого, навіть якщо дійсного, сертифіката. Цей процес підвищує безпеку, запобігаючи атакам "людина посередині" (MITM), які покладаються на представлення довіреного, але неочікуваного сертифіката.

Як працює закріплення SSL

Закріплення SSL працює на стороні клієнта, розширюючи стандартний процес валідації рукостискання TLS. Зазвичай, під час рукостискання TLS клієнт перевіряє сертифікат сервера за своїм сховищем довіри (колекцією довірених кореневих Центрів сертифікації). Якщо ЦС зі сховища довіри підписав сертифікат сервера, з'єднання продовжується.

При закріпленні SSL клієнтська програма зберігає конкретний ідентифікатор — повний сертифікат або його відкритий ключ — для очікуваного сервера. Коли ініціюється з'єднання:
1. Сервер надає свій сертифікат.
2. Клієнт виконує стандартну перевірку ланцюжка довіри, використовуючи своє сховище довіри ЦС.
3. Додатково, клієнт порівнює наданий сертифікат або відкритий ключ сервера зі своїм попередньо закріпленим значенням.
4. Якщо обидві перевірки пройдені (довірений ЦС і закріплене значення збігаються), з'єднання продовжується.
5. Якщо закріплене значення не збігається, навіть якщо сертифікат підписаний довіреним ЦС, з'єднання негайно припиняється з помилкою валідації.

Ця додаткова перевірка значно ускладнює перехоплення трафіку для зловмисника, навіть того, хто скомпрометував довірений ЦС.

Типи закріплення SSL

Існує два основні типи закріплення SSL:

  • Закріплення сертифіката (Certificate Pinning): Клієнт закріплює точний сертифікат X.509 сервера. Цей метод є дуже специфічним, але вимагає оновлення програми щоразу, коли сертифікат сервера оновлюється або змінюється.
  • Закріплення відкритого ключа (Public Key Pinning): Клієнт закріплює відкритий ключ, витягнутий із сертифіката сервера. Це забезпечує більшу гнучкість, ніж закріплення сертифіката, оскільки відкритий ключ зазвичай залишається постійним, навіть якщо сам сертифікат оновлюється (за умови, що пара ключів не змінюється). Це часто реалізується шляхом закріплення хешу інформації про відкритий ключ суб'єкта (SPKI).
Характеристика Закріплення сертифіката Закріплення відкритого ключа
Що закріплюється Повний сертифікат X.509 Відкритий ключ (наприклад, хеш SPKI)
Гнучкість Низька; вимагає оновлення програми при оновленні сертифіката Вища; дозволяє оновлення сертифіката з тим самим ключем
Вплив на оновлення Високий; потрібне оновлення програми, якщо сертифікат змінюється Низький; оновлення програми лише при зміні пари ключів
Специфічність Дуже висока Висока
Ризик впровадження Вищий ризик "зламати" програму, якщо погано керувати Нижчий ризик, більш стійкий до змін сертифікатів

Приклад: Концептуальне закріплення Android (Java)

```java
import okhttp3.CertificatePinner;
import okhttp3.OkHttpClient;
import okhttp3.Request;

public class PinnedHttpClient {

public static void main(String[] args) throws Exception {
    // Приклад хешу SHA256 відкритого ключа.
    // У реальній програмі це було б отримано з сертифіката цільового сервера.
    String hostname = "api.example.com";
    String sha256_publicKey_hash = "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="; // Замініть на фактичний хеш

    CertificatePinner certificatePinner = new CertificatePinner.Builder()
            .add(hostname, sha256_publicKey_hash)
            .build();

    OkHttpClient client = new OkHttpClient.Builder()
            .certificatePinner(certificatePinner)
            .build();

    Request request = new Request.Builder()
            .url("https://" + hostname + "/data")
            .build();

    // Цей виклик завершиться невдачею, якщо відкритий ключ сервера не збігається із закріпленим хешем,
    // навіть якщо сертифікат підписаний довіреним ЦС.
    try {
        client.newCall(request).execute();
        System.out.println("З'єднання успішне (або було б, якби викона
Оновлено: 04.03.2026
Назад до категорії

Спробуйте наші проксі

20,000+ проксі в 100+ країнах світу

support_agent
GProxy Support
Usually replies within minutes
Hi there!
Send us a message and we'll reply as soon as possible.