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

Как настроить вложенный if для сертификата exim tls?

Сначала моя конфигурация tls сертификата exim выглядела так:

tls_certificate = ${if exists{/etc/exim4/ssl/${tls_sni}.crt}{/etc/exim4/ssl/${tls_sni}.crt}{/etc/exim4/ssl/exim.crt}}
tls_privatekey = ${if exists{/etc/exim4/ssl/${tls_sni}.key}{/etc/exim4/ssl/${tls_sni}.key}{/etc/exim4/ssl/exim.key}}

И это работает.

Я пытаюсь создать вложенное условие:

tls_certificate = ${if exists{/etc/exim4/ipssl/${received_ip_address}.crt}{/etc/exim4/ipssl/${received_ip_address}.crt}{${if exists{/etc/exim4/ssl/${tls_sni}.crt}{/etc/exim4/ssl/${tls_sni}.crt}{/etc/exim4/ssl/exim.crt}}}
tls_privatekey = ${if exists{/etc/exim4/ipssl/${received_ip_address}.key}{/etc/exim4/ipssl/${received_ip_address}.key}{${if exists{/etc/exim4/ssl/${tls_sni}.key}{/etc/exim4/ssl/${tls_sni}.key}{/etc/exim4/ssl/exim.key}}}

Эта конфигурация проходит синтаксический тест (exim -bV), но сервер закрывает tcp-соединение сразу после того, как любой клиент соединяется с сообщением в paniclog:

2017-08-01 07:14:56 expansion of tls_certificate failed: missing or misplaced { or }

Я думал, что не могу использовать вложенные условия if, но потом нашел это в конфигурации exim по умолчанию:

REMOTE_SMTP_RETURN_PATH=${if match_domain{$sender_address_domain}{+local_domains}{${sender_address_local_part}@DCreadhost}{${if match_domain{$sender_address_domain}{ETC_MAILNAME}{${sender_address_local_part}@DCreadhost}fail}}}

Почему в моем случае не работают вложенные условия? Есть ли способ сделать аналогичные условия для сертификатов TLS?

Я считаю, что вам не хватает одной закрывающей скобки. Совет: попробуйте написать такое условие при тестировании, чтобы упростить отладку при возникновении подобных проблем:

${
  if exists{/etc/exim4/ipssl/${received_ip_address}.crt} {
    /etc/exim4/ipssl/${received_ip_address}.crt
  } {
    ${
      if exists{/etc/exim4/ssl/${tls_sni}.crt} {
        /etc/exim4/ssl/${tls_sni}.crt
      } {
        /etc/exim4/ssl/exim.crt
      }
    }
  }
} <--