LINUX.ORG.RU
решено ФорумAdmin

Squid в режиме HTTPS Forwarder

 , ,


2

3

День добрый!

Давно стоит Сквид в режиме форвардера и все работает но тут появилась задача коннектиться к нему по HTTPS из локалки. При этом использовать самоподписанный сертификат с установкой на машины клиентов. Взял официальное вики https://wiki.squid-cache.org/ConfigExamples и начал настраивать.

Прекрасно работает следующее правило:
https_port 8.8.8.8:64000 tls-cert=/etc/letsencrypt/.../fullchain.pem tls-key=/etc/letsencrypt/.../privkey.pem

А вот это не работает c ошибкой PROXY_CERTIFICATE_INVALID:
https_port 10.10.10.10:64002 tls-cert=/etc/squid/squidCA.pem

В первом случае как вы понимаете letsencrypt а во втором самоподписанный сертификат для работы по IP. Сертификат делал через openssl req -new -newkey rsa:2048 -sha256 -days 365 -nodes -x509 -extensions v3_ca -keyout myCA.pem -out myCA.pem потом перекинул в .der и установил как корневой на клиенте. В сертификате на всякий случай ЗАПОЛНЕНЫ ВСЕ ПОЛЯ, в т.ч. DN.

Все то же самое но как прозрачный прокси через intercept ssl-bump прекрасно работает, так же все работает если поднимать http_port вместо https_port с теми же настройками но я хочу шифровать как уже говорил и до прокси тоже.

Полный конфиг: https://pastebin.com/Bfwb1a2K Squid 4.6 собранный с SSL на Debian 11.

Что я делаю не так?

Ответ на: комментарий от aidaho

-keyout myCA.pem -out myCA.pem

Там же, или я что-то не понимаю? По крайней мере в файле он есть: -----BEGIN PRIVATE KEY----- MII...AB0= -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- MII...kzj -----END CERTIFICATE-----

FourtyTwo
() автор топика
Ответ на: комментарий от aidaho

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

FourtyTwo
() автор топика

Решение для моего случая нашлось после экспериментов с сертификатами и прочим. Я подозревал что по руководству с вики что-то не так с командой генерации самоподписанного сертификата, точнее не с ней а с тем насколько детально описание хоста при создании сертификата. Поправьте меня если я не прав так как в теме не силен.

Начнем с того что наткнулся в поисках на такую инфу на гитхабе:

Self signed certificate no longer valid as of Chrome 58 https://github.com/webpack/webpack-dev-server/issues/854

После более детального изучения работы команды openssl и состава сертификатов приходим к тому что Хрому не хватает информации из атрибута SAN, далее не пинайте сильно, информация в основном для новичков.

Метод первый, для ленивых

  1. Создаем сертификат по руководству с сквид-вики, ключ храним отдельно:
    openssl req -new -newkey rsa:2048 -sha256 -days 365 -nodes -x509 -extensions v3_ca -keyout squidCAkey.pem -out squidCA.pem
    При создании я забивал все атрибуты кроме Common Name (e.g. server FQDN or YOUR name) []: рандомными буквами, все эти поля на работу не влияют если вы делаете сертификат для внутренних целей. В атрибут Common Name соответственно пишем IP адрес нашего сервера.

  2. Идем на https://certificatetools.com, жмем Use existing certificate as template, выбираем метод Paste, копируем туда полученный в первом пункте сертификат (не ключ).
    После загрузки сертификата смотрим что у нас в поле Subject Alternative Names, добавляем туда IP адрес нашего сервера, жмем кнопку Add справа.
    Ниже в разделе CSR Options переключаем режим на Self-Sign, вписываем срок действия, жмем кнопку Submit.

Полученный сертификат и ключ выгружаем на сервер а так же ставим у клиента.

Метод второй, для тех кто не хочет на всякие левые сайты свои сертификаты палить и вообще

  1. Генерируем ключ:
    openssl genpkey -outform PEM -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out squidCAkey.pem

  2. Создаем запрос на подписание сертификата:
    cat > csr.conf
    [ req ]
    default_md = sha256
    prompt = no
    req_extensions = req_ext
    distinguished_name = req_distinguished_name
    [ req_distinguished_name ]
    commonName = IP адрес сервера
    countryName = DE
    stateOrProvinceName = DEDE
    localityName = DEDEDE
    organizationName = DEDEDEDE
    organizationalUnitName = DEDEDEDEDE
    emailAddress = DE@DE.DE
    [ req_ext ]
    basicConstraints=critical,CA:true
    subjectAltName = @alt_names
    [ alt_names ]
    IP.0 = IP адрес сервера

    _
    openssl req -new -nodes -key squidCAkey.pem -config csr.conf -out squidCA.csr

  3. Подписываем запрос:
    cat > cert.conf
    [ req ]
    default_md = sha256
    prompt = no
    req_extensions = req_ext
    distinguished_name = req_distinguished_name
    [ req_distinguished_name ]
    commonName = IP адрес сервера
    countryName = DE
    stateOrProvinceName = DEDE
    localityName = DEDEDE
    organizationName = DEDEDEDE
    organizationalUnitName = DEDEDEDEDE
    emailAddress = DE@DE.DE
    [ req_ext ]
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid:always,issuer
    basicConstraints=critical,CA:true
    subjectAltName = @alt_names
    [ alt_names ]
    IP.0 = IP адрес сервера

    _
    openssl req -x509 -nodes -in squidCA.csr -days 1825 -key squidCAkey.pem -config cert.conf -extensions req_ext -out squidCA.pem

Полученный сертификат ставим у клиента, если клиент винда то переименовать .pem в .crt.

В таком виде HTTPS форвардер стал работать без вопросов.

FourtyTwo
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.