On Mon, Mar 28, 2022 at 12:27:18AM -0400, Viktor Dukhovni 
<postfix-us...@dukhovni.org> wrote:

> On Mon, Mar 28, 2022 at 03:23:55PM +1100, raf wrote:
> 
> > I just tried this (debian-11, postfix-3.5.6)
> > and was surprised by the effect:
> > 
> >   postfix tls new-server-key
> >   postfix tls deploy-server-cert /etc/postfix/cert-20220328-033631.pem 
> > /etc/postfix/key-20220328-033631.pem
> > 
> > The main.cf file originally contained:
> > 
> >   smtpd_tls_chain_files =
> >     /etc/postfix/smtpd.key
> >     /etc/postfix/smtpd.cert
> > 
> > The deploy-server-cert subcommand appended the following:
> > 
> >   smtpd_tls_cert_file = /etc/postfix/cert-20220328-033631.pem
> >   smtpd_tls_key_file = /etc/postfix/key-20220328-033631.pem
> 
> Yes, the "postfix tls" script has not yet been updated to handle
> the new "chain files" syntax.  Sorry about that.
> 
> Contributions of suitably robust code welcome...
> 
> -- 
>     Viktor.

Hi,

Here's a very conservative patch. It does two things.

It includes smtp_tls_chain_files and
smtpd_tls_chain_files in the lists of parameters that
must have their default values in order for
enable-client and enable-server to change main.cf.
That might not be correct, but it seemed reasonable.

And it refuses to set smtpd_tls_cert_file and
smtpd_tls_key_file if smtpd_tls_chain_files is
currently set. Instead, it outputs instructions on what
to do manually.

Ideally, it would also use smtpd_tls_chain_files by
default, and even better, convert the old parameters to
the new parameter when given the chance, but I haven't
attempted that. That's tricky given the number of key
types that could be present.

It would be easy enough to use smtpd_tls_chain_files by
default, and even to replace smtpd_tls_cert_file and
smtpd_tls_key_file (etc.) with smtpd_tls_chain_files,
but it would be tricky to replace a subset of the files
listed in smtpd_tls_chain_files with the new files
(assuming the existence of other types of keys/certs).
It would require identifying the type of each key/cert
and only replacing the matching ones. I'm not certain
how to do that.

cheers,
raf

--- postfix-tls-script.orig     2020-05-31 00:37:04.000000000 +1000
+++ postfix-tls-script  2022-03-28 19:42:42.885356325 +1100
@@ -256,6 +256,7 @@
     smtp_tls_cert_file
     smtp_tls_dcert_file
     smtp_tls_eccert_file
+    smtp_tls_chain_files
 "
 
 server_settings="
@@ -265,6 +266,7 @@
     smtpd_tls_cert_file
     smtpd_tls_dcert_file
     smtpd_tls_eccert_file
+    smtpd_tls_chain_files
 "
 
 #
@@ -651,6 +653,23 @@
        fi
 }
 
+# args: certfile keyfile
+info_deploy_server_cert() {
+       cat <<-EOM
+       *** Updating smtpd_tls_chain_files is not supported, no changes made.
+       Set the equivalent of this in main.cf:
+         smtpd_tls_cert_file = $1
+         smtpd_tls_key_file = $2
+       Or:
+         smtpd_tls_chain_files =
+           $2
+           $1
+       Then run the command:
+         # postfix reload
+       if you want the new settings to take effect immediately.
+       EOM
+}
+
 set_fqdn() {
     if [ -n "$1" ]; then fqdn=$1; return 0; fi
     fqdn=`$postconf -xh myhostname` || return 1
@@ -796,23 +815,29 @@
        return 1
     fi
 
-    set -- \
-       "${key_param} = ${keyfile}" \
-       "${cert_param} = ${certfile}"
+    # Note: updating smtpd_tls_chain_files not supported
+    if all_default smtpd_tls_chain_files; then
+       set -- \
+           "${key_param} = ${keyfile}" \
+           "${cert_param} = ${certfile}"
 
-    if [ "${deploy}" = "enable" ]; then
-       set -- "$@" \
-           "smtpd_tls_security_level = may" \
-           "smtpd_tls_received_header = yes" \
-           "smtpd_tls_loglevel = 1"
-    fi
+       if [ "${deploy}" = "enable" ]; then
+           set -- "$@" \
+               "smtpd_tls_security_level = may" \
+               "smtpd_tls_received_header = yes" \
+               "smtpd_tls_loglevel = 1"
+       fi
 
-    if [ -n "${tls_random_source}" ]; then
-       set -- "$@" "tls_random_source = ${tls_random_source}"
-    fi
+       if [ -n "${tls_random_source}" ]; then
+           set -- "$@" "tls_random_source = ${tls_random_source}"
+       fi
 
-    # All in one shot, since postconf delays modifying "hot" main.cf files.
-    $postconf -e "$@" || return 1
+       # All in one shot, since postconf delays modifying "hot" main.cf files.
+       $postconf -e "$@" || return 1
+    else
+       info_deploy_server_cert "$certfile" "$keyfile" | $INFO
+       return 1
+    fi
 }
 
 # Prepare a new cert and perhaps re-use any existing private key.

Reply via email to