diff --git a/doc/html/howtoe.html b/doc/html/howtoe.html index cbeb0e6..f9a03e9 100644 --- a/doc/html/howtoe.html +++ b/doc/html/howtoe.html @@ -33,6 +33,8 @@
  • How to resolve names through a parent proxy
  • How to set up an FTP proxy
  • How to set up an SNI proxy (tlspr)
  • +
  • How to set up TLS/SSL with SSLPlugin (https proxy, mTLS)
  • +
  • How to create CA and certificates for SSLPlugin
  • How to limit service access
  • How to create a user list
  • How to limit user access to resources @@ -639,6 +641,193 @@ allow * proxy

    +
  • How to set up TLS/SSL with SSLPlugin (https proxy, mTLS) +

    +SSLPlugin provides TLS/SSL support for 3proxy. It can be used to: +

    +

    +

    +Creating an https:// proxy: +
    To create an https:// proxy, you need a server certificate and key. The certificate must not be self-signed +and should contain Subject Alternative Names (SAN) for the proxy hostname/IP. +

    +plugin /path/to/SSLPlugin.ld.so ssl_plugin
    +ssl_server_cert /etc/3proxy/certs/server.crt
    +ssl_server_key /etc/3proxy/certs/server.key
    +ssl_serv
    +proxy -p3129
    +ssl_noserv
    +proxy -p3128
    +
    +

    +This creates an https:// proxy on port 3129 and an http:// proxy on port 3128. +Configure clients to use https://proxy-host:3129/ as the proxy URL. +

    +

    +Client certificate authentication (mTLS): +
    To require clients to authenticate with a certificate, use ssl_server_verify and provide the CA certificate: +

    +plugin /path/to/SSLPlugin.ld.so ssl_plugin
    +ssl_server_cert /etc/3proxy/certs/server.crt
    +ssl_server_key /etc/3proxy/certs/server.key
    +ssl_server_ca_file /etc/3proxy/certs/ca.crt
    +ssl_server_verify
    +ssl_serv
    +proxy -p3129
    +
    +

    +Only clients with a valid certificate signed by the CA can connect. +

    +

    +MITM for TLS traffic inspection: +
    To intercept and decrypt TLS traffic, you need a CA certificate to generate spoofed server certificates: +

    +plugin /path/to/SSLPlugin.ld.so ssl_plugin
    +ssl_server_ca_file /etc/3proxy/certs/ca.crt
    +ssl_server_ca_key /etc/3proxy/certs/ca.key
    +ssl_client_verify
    +ssl_client_ca_file /etc/ssl/certs/ca-certificates.crt
    +ssl_mitm
    +proxy -p3128
    +ssl_nomitm
    +proxy -p3129
    +
    +

    +The CA certificate must be trusted by clients. ssl_client_verify ensures the real server certificates are validated. +Without ssl_client_verify, the proxy is vulnerable to MITM attacks. +

    +

    +TLS client (connect to upstream via TLS): +
    To connect to upstream servers via TLS with client certificate authentication: +

    +plugin /path/to/SSLPlugin.ld.so ssl_plugin
    +ssl_client_cert /etc/3proxy/certs/client.crt
    +ssl_client_key /etc/3proxy/certs/client.key
    +ssl_client_verify
    +ssl_client_ca_file /etc/ssl/certs/ca-certificates.crt
    +ssl_cli
    +proxy -p3128
    +
    +
  • How to create CA and certificates for SSLPlugin +

    +Creating a Certificate Authority (CA): +
    For MITM or mTLS, you need a CA. Generate a CA private key and certificate: +

    +# Generate CA private key
    +openssl genrsa -out ca.key 4096
    +
    +# Generate CA certificate (valid for 10 years)
    +openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 \
    +    -subj "/C=US/ST=State/L=City/O=MyOrg/CN=My CA" \
    +    -out ca.crt
    +
    +

    +For MITM, import ca.crt into client browsers/OS as a trusted root CA. +

    +

    +Creating a server certificate for https:// proxy: +
    The server certificate must have proper Subject Alternative Names (SAN): +

    +# Generate server private key
    +openssl genrsa -out server.key 2048
    +
    +# Create a certificate signing request (CSR)
    +openssl req -new -key server.key \
    +    -subj "/C=US/ST=State/L=City/O=MyOrg/CN=proxy.example.com" \
    +    -out server.csr
    +
    +# Create extensions file for SAN
    +cat > server.ext << 'EOF'
    +authorityKeyIdentifier=keyid,issuer
    +basicConstraints=CA:FALSE
    +keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
    +extendedKeyUsage = serverAuth
    +subjectAltName = @alt_names
    +
    +[alt_names]
    +DNS.1 = proxy.example.com
    +DNS.2 = proxy
    +IP.1 = 192.168.1.100
    +EOF
    +
    +# Sign the certificate with CA
    +openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key \
    +    -CAcreateserial -out server.crt -days 365 -sha256 \
    +    -extfile server.ext
    +
    +

    +For a public https:// proxy, use a CA like Let's Encrypt instead of self-signed. +

    +

    +Creating a client certificate for mTLS: +

    +# Generate client private key
    +openssl genrsa -out client1.key 2048
    +
    +# Create CSR
    +openssl req -new -key client1.key \
    +    -subj "/C=US/ST=State/L=City/O=MyOrg/CN=client1" \
    +    -out client1.csr
    +
    +# Create extensions file
    +cat > client.ext << 'EOF'
    +basicConstraints=CA:FALSE
    +keyUsage = digitalSignature, nonRepudiation, keyEncipherment
    +extendedKeyUsage = clientAuth
    +EOF
    +
    +# Sign with CA
    +openssl x509 -req -in client1.csr -CA ca.crt -CAkey ca.key \
    +    -CAcreateserial -out client1.crt -days 365 -sha256 \
    +    -extfile client.ext
    +
    +# Create PKCS#12 bundle for browser import
    +openssl pkcs12 -export -out client1.p12 \
    +    -inkey client1.key -in client1.crt -certfile ca.crt
    +
    +

    +Import client1.p12 into the client browser or OS certificate store. +

    +

    +Quick setup script for development/testing: +

    +#!/bin/sh
    +# Creates CA, server, and client certificates for SSLPlugin testing
    +
    +# CA
    +openssl genrsa -out ca.key 4096
    +openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 \
    +    -subj "/CN=3proxy CA" -out ca.crt
    +
    +# Server
    +openssl genrsa -out server.key 2048
    +openssl req -new -key server.key -subj "/CN=localhost" -out server.csr
    +cat > server.ext << 'EOF'
    +basicConstraints=CA:FALSE
    +keyUsage = keyEncipherment
    +extendedKeyUsage = serverAuth
    +subjectAltName = DNS:localhost,DNS:proxy,IP:127.0.0.1
    +EOF
    +openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key \
    +    -CAcreateserial -out server.crt -days 365 -sha256 -extfile server.ext
    +
    +# Client
    +openssl genrsa -out client.key 2048
    +openssl req -new -key client.key -subj "/CN=client" -out client.csr
    +cat > client.ext << 'EOF'
    +basicConstraints=CA:FALSE
    +extendedKeyUsage = clientAuth
    +EOF
    +openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key \
    +    -CAcreateserial -out client.crt -days 365 -sha256 -extfile client.ext
    +openssl pkcs12 -export -out client.p12 -passout pass: \
    +    -inkey client.key -in client.crt -certfile ca.crt
    +
  • How to limit service access

    First, always specify the internal interface to accept incoming connections with the diff --git a/doc/html/howtor.html b/doc/html/howtor.html index 6433c6b..91b175c 100644 --- a/doc/html/howtor.html +++ b/doc/html/howtor.html @@ -33,6 +33,8 @@

  • Как разрешать имена на родительском прокси?
  • Как настроить FTP прокси?
  • Как настроить SNI proxy (tlspr)
  • +
  • Как настроить TLS/SSL с помощью SSLPlugin (https прокси, mTLS)
  • +
  • Как создать CA и сертификаты для SSLPlugin
  • Как ограничить доступ к службе
  • Как создать список пользователей
  • Как ограничить доступ пользователей к ресурсам @@ -647,6 +649,194 @@ proxy

    +
  • Как настроить TLS/SSL с помощью SSLPlugin (https прокси, mTLS) +

    +SSLPlugin обеспечивает поддержку TLS/SSL для 3proxy. Он может использоваться для: +

    +

    +

    +Создание https:// прокси: +
    Для создания https:// прокси требуется сертификат и ключ сервера. Сертификат не должен быть самоподписанным +и должен содержать альтернативные имена (SAN) для имени хоста/IP прокси. +

    +plugin /path/to/SSLPlugin.ld.so ssl_plugin
    +ssl_server_cert /etc/3proxy/certs/server.crt
    +ssl_server_key /etc/3proxy/certs/server.key
    +ssl_serv
    +proxy -p3129
    +ssl_noserv
    +proxy -p3128
    +
    +

    +Создаётся https:// прокси на порту 3129 и http:// прокси на порту 3128. +Настройте клиенты на использование https://proxy-host:3129/ в качестве URL прокси. +

    +

    +Аутентификация по клиентскому сертификату (mTLS): +
    Чтобы требовать от клиентов аутентификацию по сертификату, используйте ssl_server_verify и укажите CA-сертификат: +

    +plugin /path/to/SSLPlugin.ld.so ssl_plugin
    +ssl_server_cert /etc/3proxy/certs/server.crt
    +ssl_server_key /etc/3proxy/certs/server.key
    +ssl_server_ca_file /etc/3proxy/certs/ca.crt
    +ssl_server_verify
    +ssl_serv
    +proxy -p3129
    +
    +

    +Только клиенты с действительным сертификатом, подписанным CA, смогут подключиться. +

    +

    +MITM для инспекции TLS-трафика: +
    Для перехвата и расшифровки TLS-трафика требуется CA-сертификат для генерации подделанных серверных сертификатов: +

    +plugin /path/to/SSLPlugin.ld.so ssl_plugin
    +ssl_server_ca_file /etc/3proxy/certs/ca.crt
    +ssl_server_ca_key /etc/3proxy/certs/ca.key
    +ssl_client_verify
    +ssl_client_ca_file /etc/ssl/certs/ca-certificates.crt
    +ssl_mitm
    +proxy -p3128
    +ssl_nomitm
    +proxy -p3129
    +
    +

    +CA-сертификат должен быть доверенным для клиентов. ssl_client_verify обеспечивает проверку реальных серверных сертификатов. +Без ssl_client_verify прокси уязвим для MITM-атак. +

    +

    +TLS-клиент (соединение с вышестоящим сервером через TLS): +
    Для соединения с вышестоящими серверами через TLS с аутентификацией по клиентскому сертификату: +

    +plugin /path/to/SSLPlugin.ld.so ssl_plugin
    +ssl_client_cert /etc/3proxy/certs/client.crt
    +ssl_client_key /etc/3proxy/certs/client.key
    +ssl_client_verify
    +ssl_client_ca_file /etc/ssl/certs/ca-certificates.crt
    +ssl_cli
    +proxy -p3128
    +
    +
  • Как создать CA и сертификаты для SSLPlugin +

    +Создание удостоверяющего центра (CA): +
    Для MITM или mTLS требуется CA. Сгенерируйте закрытый ключ CA и сертификат: +

    +# Генерация закрытого ключа CA
    +openssl genrsa -out ca.key 4096
    +
    +# Генерация сертификата CA (действителен 10 лет)
    +openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 \
    +    -subj "/C=RU/ST=Region/L=City/O=MyOrg/CN=My CA" \
    +    -out ca.crt
    +
    +

    +Для MITM импортируйте ca.crt в браузеры/ОС клиентов как доверенный корневой CA. +

    +

    +Создание серверного сертификата для https:// прокси: +
    Серверный сертификат должен иметь правильные альтернативные имена (SAN): +

    +# Генерация закрытого ключа сервера
    +openssl genrsa -out server.key 2048
    +
    +# Создание запроса на подпись сертификата (CSR)
    +openssl req -new -key server.key \
    +    -subj "/C=RU/ST=Region/L=City/O=MyOrg/CN=proxy.example.com" \
    +    -out server.csr
    +
    +# Создание файла расширений для SAN
    +cat > server.ext << 'EOF'
    +authorityKeyIdentifier=keyid,issuer
    +basicConstraints=CA:FALSE
    +keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
    +extendedKeyUsage = serverAuth
    +subjectAltName = @alt_names
    +
    +[alt_names]
    +DNS.1 = proxy.example.com
    +DNS.2 = proxy
    +IP.1 = 192.168.1.100
    +EOF
    +
    +# Подписание сертификата CA
    +openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key \
    +    -CAcreateserial -out server.crt -days 365 -sha256 \
    +    -extfile server.ext
    +
    +

    +Для публичного https:// прокси используйте CA вроде Let's Encrypt вместо самоподписанного. +

    +

    +Создание клиентского сертификата для mTLS: +

    +# Генерация закрытого ключа клиента
    +openssl genrsa -out client1.key 2048
    +
    +# Создание CSR
    +openssl req -new -key client1.key \
    +    -subj "/C=RU/ST=Region/L=City/O=MyOrg/CN=client1" \
    +    -out client1.csr
    +
    +# Создание файла расширений
    +cat > client.ext << 'EOF'
    +basicConstraints=CA:FALSE
    +keyUsage = digitalSignature, nonRepudiation, keyEncipherment
    +extendedKeyUsage = clientAuth
    +EOF
    +
    +# Подписание CA
    +openssl x509 -req -in client1.csr -CA ca.crt -CAkey ca.key \
    +    -CAcreateserial -out client1.crt -days 365 -sha256 \
    +    -extfile client.ext
    +
    +# Создание PKCS#12 для импорта в браузер
    +openssl pkcs12 -export -out client1.p12 \
    +    -inkey client1.key -in client1.crt -certfile ca.crt
    +
    +

    +Импортируйте client1.p12 в хранилище сертификатов браузера или ОС клиента. +

    +

    +Скрипт быстрой настройки для разработки/тестирования: +

    +#!/bin/sh
    +# Создаёт CA, серверный и клиентский сертификаты для тестирования SSLPlugin
    +
    +# CA
    +openssl genrsa -out ca.key 4096
    +openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 \
    +    -subj "/CN=3proxy CA" -out ca.crt
    +
    +# Сервер
    +openssl genrsa -out server.key 2048
    +openssl req -new -key server.key -subj "/CN=localhost" -out server.csr
    +cat > server.ext << 'EOF'
    +basicConstraints=CA:FALSE
    +keyUsage = keyEncipherment
    +extendedKeyUsage = serverAuth
    +subjectAltName = DNS:localhost,DNS:proxy,IP:127.0.0.1
    +EOF
    +openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key \
    +    -CAcreateserial -out server.crt -days 365 -sha256 -extfile server.ext
    +
    +# Клиент
    +openssl genrsa -out client.key 2048
    +openssl req -new -key client.key -subj "/CN=client" -out client.csr
    +cat > client.ext << 'EOF'
    +basicConstraints=CA:FALSE
    +extendedKeyUsage = clientAuth
    +EOF
    +openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key \
    +    -CAcreateserial -out client.crt -days 365 -sha256 -extfile client.ext
    +openssl pkcs12 -export -out client.p12 -passout pass: \
    +    -inkey client.key -in client.crt -certfile ca.crt
    +
    +
  • Как ограничить доступ к службе

    Во-первых, для ограничения доступа необходимо указать внутренний интерфейс,