Запустить 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 sites-available / 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?

Спасибо за любые указания.

2
задан 21 October 2019 в 19:27
1 ответ

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

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

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

1
ответ дан 3 December 2019 в 12:28

Теги

Похожие вопросы