On Sat, Nov 23, 2013 at 10:40:05PM +0100, Andreas Schulze wrote:
> But when I disable RC4 in smtpd_tls_exclude_ciphers (I assume) it's
> also not used when I enforce encrypt mode !? This script don't say so.
Yes, you're right, the script did not cover that case accurately,
the code from smtpd(8) reads:
cipher_exclusions = vstring_alloc(10);
ADD_EXCLUDE(cipher_exclusions, var_smtpd_tls_excl_ciph);
if (var_smtpd_enforce_tls)
ADD_EXCLUDE(cipher_exclusions, var_smtpd_tls_mand_excl);
if (ask_client_cert)
ADD_EXCLUDE(cipher_exclusions, "aNULL");
> Also the script don't handle situations where smtpd_tls_ciphers set
> to 'high' for example.
Yes, though that setting is substantially likely to have interoperability
issues. Your weakest link is unlikely to be any of the medium ciphers.
> So here is my update (without any optimization !)
> server_ciphers() {
> local use skip ciphers exclude e
> case $1 in
> may)
> grade="$(postconf -xh smtpd_tls_ciphers)"
> use="tls_${grade}_cipherlist"
> skip1="smtpd_tls_exclude_ciphers"
> skip2="";;
> encrypt)
> grade="$(postconf -xh smtpd_tls_mandatory_ciphers)"
> use="tls_${grade}_cipherlist"
> skip1="smtpd_tls_exclude_ciphers"
> skip2="smtpd_tls_mandatory_exclude_ciphers";;
> esac
> ciphers="$(postconf -xh $use)"
> exclude1="$(postconf -xh $skip1)"
> if [ -n "${exclude1}" ]; then
> OIFS="$IFS"; IFS=":,$OFS"
> set -- $exclude1
> IFS="$OIFS"
> for e; do ciphers="$ciphers:"'!'"$e"; done
> fi
> if [ -n "${skip2}" ]; then
> exclude2="$(postconf -xh $skip2)"
> if [ -n "${exclude2}" ]; then
> OIFS="$IFS"; IFS=":,$OFS"
> set -- $exclude2
> IFS="$OIFS"
> for e; do ciphers="$ciphers:"'!'"$e"; done
> fi
> fi
> openssl ciphers -v "$ciphers"
> }
>
> correct?
Yes, but your local variable list no longer matches exactly the
variables used in the code (grade, skip1, skip2 are not covered,
while skip is no longer used). The "local" built-in is I should
note not POSIX. Some shells may not support it.
For bonus points, you could look at "smtpd_tls_askccert" and
"smtpd_tls_req_ccert". If either is set to "yes", append ':!aNULL'
to the raw openssl cipher list.
--
Viktor.