On Thu, May 31, 2018 at 04:06:31PM +0200, Sebastien Marie wrote:
> Hi,
>
> When using smarthost ("host" option of "relay") for outgoing mails, TLS
> connection aren't verified. If it could make sens for standard MX, I
> think it would be better to verify the connection by default if the user
> specifies a TLS-aware url for the relay.
>
> The diff below changes the behaviour of:
> action "foo" relay host "smtps://example.com"
>
> Currently, smtpd will connect to example.com without verifying TLS at
> all. There is no option to force such verification (it was present in
> with previous grammar).
>
> With the following diff, the TLS connection is verified by default (and
> the connection aborted on error). Opportunistic TLS will be still possible
> with a new option: tls no-verify.
>
> So, for having the old behaviour the syntax will be:
> action "foo" relay host "smtps://example.com" tls no-verify
>
> It affects only smarthost connection. Outgoing using MX still use
> opportunistic TLS.
>
> Regarding the diff, it adds F_TLS_VERIFY option by default for each call
> of text_to_relayhost(), so also for "smtp://" or "lmtp://" urls. I checked
> that "smtp://" isn't affected by such flag (there is no TLS connection
> to verify), and I hope it will be the same for "lmtp://" (confirmation
> will be welcome). Next, the grammar is extended to permit to clear the
> flag if requested. smtpd(1) already have all the magic to check the
> connection.
>
> Thanks.
> --
> Sebastien Marie
Hello.
This makes sense, indeed.
Here is a slightly updated diff for your proposal. It makes the
documentatino more accurate: the server certificate is always
verified, the flag is only meant to accept invalid certificates. It
also fixes build (apparently the mta.c chunk was incorrect).
Eric.
Index: mta.c
===================================================================
RCS file: /cvs/src/usr.sbin/smtpd/mta.c,v
retrieving revision 1.212
diff -u -p -r1.212 mta.c
--- mta.c 31 May 2018 11:56:10 -0000 1.212
+++ mta.c 31 May 2018 19:56:03 -0000
@@ -677,6 +677,9 @@ mta_handle_envelope(struct envelope *evp
return;
}
+ if (dispatcher->u.remote.tls_noverify == 0)
+ evp->agent.mta.relay.flags |= F_TLS_VERIFY;
+
relay = mta_relay(evp);
/* ignore if we don't know the limits yet */
if (relay->limits &&
Index: parse.y
===================================================================
RCS file: /cvs/src/usr.sbin/smtpd/parse.y,v
retrieving revision 1.206
diff -u -p -r1.206 parse.y
--- parse.y 30 May 2018 19:01:58 -0000 1.206
+++ parse.y 31 May 2018 19:56:04 -0000
@@ -182,7 +182,7 @@ typedef struct {
%token KEY
%token LIMIT LISTEN LMTP LOCAL
%token MAIL_FROM MAILDIR MASK_SRC MASQUERADE MATCH MAX_MESSAGE_SIZE
MAX_DEFERRED MBOX MDA MTA MX
-%token NODSN
+%token NODSN NOVERIFY
%token ON
%token PKI PORT
%token QUEUE
@@ -541,6 +541,19 @@ HELO STRING {
dispatcher->u.remote.smarthost = strdup(t->t_name);
}
+| TLS NOVERIFY {
+ if (dispatcher->u.remote.smarthost == NULL) {
+ yyerror("tls no-verify may not be specified without host on a
dispatcher");
+ YYERROR;
+ }
+
+ if (dispatcher->u.remote.tls_noverify == 1) {
+ yyerror("tls no-verify already specified for this dispatcher");
+ YYERROR;
+ }
+
+ dispatcher->u.remote.tls_noverify = 1;
+}
| AUTH tables {
struct table *t = $2;
@@ -1571,6 +1584,7 @@ lookup(char *s)
{ "mta", MTA },
{ "mx", MX },
{ "no-dsn", NODSN },
+ { "no-verify", NOVERIFY },
{ "on", ON },
{ "pki", PKI },
{ "port", PORT },
Index: smtpd.conf.5
===================================================================
RCS file: /cvs/src/usr.sbin/smtpd/smtpd.conf.5,v
retrieving revision 1.183
diff -u -p -r1.183 smtpd.conf.5
--- smtpd.conf.5 31 May 2018 13:36:35 -0000 1.183
+++ smtpd.conf.5 31 May 2018 19:56:04 -0000
@@ -205,6 +205,9 @@ to advertise during the HELO phase.
.It Cm host Ar relay-url
Do not perform MX lookups but relay messages to the relay host described by
.Ar relay-url .
+If the url uses tls, the certificate will be verified by default.
+.It Cm tls Ar no-verify
+Do not require valid certificate for the specified host.
.It Cm auth Pf < Ar table Ns >
Use the mapping
.Ar table
Index: smtpd.h
===================================================================
RCS file: /cvs/src/usr.sbin/smtpd/smtpd.h,v
retrieving revision 1.545
diff -u -p -r1.545 smtpd.h
--- smtpd.h 29 May 2018 21:05:52 -0000 1.545
+++ smtpd.h 31 May 2018 19:56:05 -0000
@@ -1068,6 +1068,7 @@ struct dispatcher_remote {
char *smarthost;
char *auth;
+ int tls_noverify;
int backup;
char *backupmx;