Сначала моя конфигурация 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
}
}
}
} <--