Назад | Перейти на главную страницу

Запустите 2 сервера SSL на 1 debian Pi, оба FQDN, 1 Nginx 1 apache, неправильный сертификат, это проблема SNI?

Я вынужден использовать Nginx на a.ddns.net и Apache для b.ddns.net (решение обратного прокси слишком сложно из-за установленных настроек). Реальные имена серверов отредактированы, но оба подтверждены как соответствующие сертификатам IP и SSL, подтвержденным OpenSSL.

В существующих настройках используются IP-хосты соответственно:

server {
            listen 192.168.1.174:443 ssl;          
            server_name a.ddns.net;
            root /var/www/html/a.ddns.net/;
            add_header Strict-Transport-Security "max-age=31536000";

            ssl on;
            ssl_session_cache builtin:1000 shared:SSL:10m;
            ssl_protocols TLSv1 TLSv1.1 TLSv1.2 ;
            ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
            ssl_prefer_server_ciphers on;
    ssl_certificate /etc/letsencrypt/archive/a.ddns.net/cert1.pem;
    ssl_certificate_key /etc/letsencrypt/archive/a.ddns.net/privkey1.pem;

Доступны сайты Apache2.4 / a.ddns.net.conf

SSLStrictSNIVHostCheck on
<VirtualHost 192.168.1.173:443>
        ServerAdmin webmaster@localhost
        ServerName b.ddns.net
        DocumentRoot /var/www/html/
        Alias /test /media/data/RPi1-Pictures
/media

    <IfModule mod_headers.c>
        Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains; preload"
    </IfModule>

        SSLEngine on
        SSLCertificateFile /etc/letsencrypt/live/b.ddns.net/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/b.ddns.net/privkey.pem
        Include /etc/letsencrypt/options-ssl-apache.conf
        SSLVerifyClient none

Настройка dnsmasq (Pi-hole) и / hosts с такими доменными именами:

127.0.0.1 a.ddns.net b.ddns.net raspberrypi3.home localhost
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
192.168.1.174 a.ddns.net
192.168.1.173 b.ddns.net

......

В локальной сети он работает так, как ожидалось, поскольку домены a и b появляются в файлах dnsmasq / hosts, но когда я пробую внешний тест с помощью dig / curl и т. Д., Я сталкиваюсь с проблемой сертификата SSL, которая, похоже, показывает, что a.ddns.net (Nginx) не фактически решается: -

curl https://a.ddns.net -v                         *   Trying 92.106.xxx.xx:443...                         * TCP_NODELAY set
* Connected to a.ddns.net (92.106.xxx.xx) port 443 (#0)
* ALPN, offering h2                                     * ALPN, offering http/1.1
* successfully set certificate verify locations:        *   CAfile: /data/data/com.termux/files/usr/etc/tls/cert.pem                                                      CApath: none
* TLSv1.3 (OUT), TLS handshake, Client hello (1):       * TLSv1.3 (IN), TLS handshake, Server hello (2):        * TLSv1.2 (IN), TLS handshake, Certificate (11):        * TLSv1.2 (IN), TLS handshake, Server key exchange (12):* TLSv1.2 (IN), TLS handshake, Server finished (14):    * TLSv1.2 (OUT), TLS handshake, Client key exchange (16):                                                       * TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):                                                     * TLSv1.2 (OUT), TLS handshake, Finished (20):          * TLSv1.2 (IN), TLS handshake, Finished (20):           * SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256                                                    * ALPN, server accepted to use http/1.1
ALPN, server accepted to use http/1.1
* Server certificate:
*  subject: CN=b.ddns.net
*  start date: Oct 13 13:27:18 2019 GMT
*  expire date: Jan 11 13:27:18 2020 GMT
*  subjectAltName does not match a.ddns.net
* SSL: no alternative certificate subject name matches target host name 'a.ddns.net'
* Closing connection 0
* TLSv1.2 (OUT), TLS alert, close notify (256):
curl: (60) SSL: no alternative certificate subject name matches target host name   

Я думал, что описанная выше установка будет более простым решением, чем создание сложного обратного прокси, потому что я понимал, что dnsmasq с SNI как на Apache, так и на Nginx сможет разрешить правильный сервер из URL-адреса клиента. Что мне не хватает?

Есть ли альтернативное или, может быть, более простое решение для редактирования сертификата SSL с помощью SAN, т.е. добавить a.ddns.net в b.ddns.net?

Спасибо за любое руководство

Я думаю, вам не хватает важной части вашей установки. Хотя вы показываете внутреннюю конфигурацию сервера, который имеет разные внутренние IP-адреса для двух серверов, и объясняете внешнюю конфигурацию, в которой оба домена имеют одинаковый IP-адрес, вы не объясняете, как сопоставление внешнего IP-адреса с правильным внутренний IP-адрес сделан.

Я предполагаю, что вы выполняете простую переадресацию портов с внешнего IP-адреса на внутренний IP-адрес одного из серверов (для b.ddns.net, то есть Apache). И из-за этого он всегда будет обращаться только к Apache, у которого нет конфигурации для a.ddns.net.

Один из способов решить эту проблему - использовать только перенаправление портов на nginx, который затем имеет конфигурацию для обоих доменов. Поскольку вам нужен Apache для одного домена, nginx может быть настроен как обратный прокси для этого домена и пересылать (не перенаправлять!) Все на внутренний Apache.