<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Requiring TLS: MTA-STS and TLS-RPT, DANE with ACME, and remote domain policies]]></title><description><![CDATA[<p dir="auto"><em>Written for 6.3.4. hMailServer 6.3.7 (17 October 2026) fixes DANE enforcement deferring mail to a DNSSEC-signed domain whose MX answer came compressed, <a href="http://live.com" rel="nofollow ugc">live.com</a> among them (work item 80), and treats a DNS lookup that fails as a failure rather than a name with no addresses: a delivery whose mail servers' lookup failed tells the sender that the DNS query failed (4.4.4) and retries, a DNSSEC validation that fails says where and why in the debug log, and the application log's lines for a skipped host end with the reason in brackets. The ACME HTTP-01 challenge responder, which served one connection at a time so that idle clients could make a certificate's issuance or renewal fail, now serves up to 64 connections at once (work item 97). See <a href="/topic/28277">the 6.3.7 announcement</a>. In hMailServer 6.3.8 (2 November 2026) the web services listener refuses an address an auto-ban or an IP range bans (work item 105), so an IP range of your own that allows some addresses none of SMTP, POP3 and IMAP now closes that listener to them, and with it the MTA-STS policy this topic publishes and ACME's http-01 validation where that listener answers it: check that the sending MTAs and the certificate authority do not come from such a range. See <a href="/topic/28278">the 6.3.8 announcement</a>.</em></p>
<p dir="auto">This topic is about mail travelling encrypted between servers, in both directions, and about being able to show that it did: honouring the MTA-STS and DANE policies other domains publish, publishing your own, adding a requirement of your own for a partner that publishes nothing, and sending the TLS-RPT and DMARC reports that tell other operators what became of their mail. It assumes a certificate is already installed and the listeners already use it; that is <a href="/topic/28187">Let's Encrypt certificates are automatic</a>, and the basics of SPF, DKIM and DMARC are in <a href="/topic/28188">Being trusted by the servers you send to</a>. The one thing to know first: the three outbound policies - <code>MtaStsEnabled</code>, <code>DaneEnforcementEnabled</code> and <code>DnssecValidationEnabled</code> - are <strong>on by default</strong>, and every outbound path described here that cannot get the encryption it requires <strong>defers</strong> the message with <code>4.7.0</code>. Where encryption is required, nothing falls back to sending in the clear.</p>
<h3><a class="anchor-offset" name="what-is-on-already-and-what-is-yours-to-do"></a>What is on already, and what is yours to do</h3>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Mechanism</th>
<th>Which mail</th>
<th>State as shipped</th>
<th>What you do</th>
</tr>
</thead>
<tbody>
<tr>
<td>Honouring other domains' MTA-STS policies</td>
<td>mail you send</td>
<td>on, <code>MtaStsEnabled=1</code></td>
<td>nothing</td>
</tr>
<tr>
<td>Honouring other domains' DANE records</td>
<td>mail you send</td>
<td>on, <code>DaneEnforcementEnabled=1</code> and <code>DnssecValidationEnabled=1</code></td>
<td>nothing</td>
</tr>
<tr>
<td>Publishing your own MTA-STS policy</td>
<td>mail you receive</td>
<td><code>MtaStsHostingEnabled=1</code>, but inert until <code>WebServicesHttpsPort</code> is set</td>
<td>set the port, have a certificate for <code>mta-sts.&lt;domain&gt;</code>, publish the <code>_mta-sts</code> TXT record</td>
</tr>
<tr>
<td>Publishing your own TLSA record</td>
<td>mail you receive</td>
<td>nothing to switch on</td>
<td>publish the record the ACME log prints, in a DNSSEC-signed zone</td>
</tr>
<tr>
<td>Remote domain policies (since 6.3.4)</td>
<td>both directions</td>
<td>none exist</td>
<td>create one per partner</td>
</tr>
<tr>
<td>TLS-RPT and DMARC aggregate reports you send</td>
<td>reports to other operators</td>
<td>inert until a sender address is set</td>
<td>set <code>TlsRptFromAddress</code> and <code>DmarcRptFromAddress</code></td>
</tr>
</tbody>
</table>
<p dir="auto">The three outbound policies, the authentication-results headers and the two reporters are on the Control Panel's <strong>TLS &amp; certificates → Transport security</strong> page (Windows-only); on either platform, <code>PUT /api/v1/settings/ini/{name}</code> and <code>hmctl ini set</code> write them. Of the keys in this topic, <code>WebServicesHttpsPort</code> and <code>AcmeEnabled</code> wait for a reinitialise (<strong>Apply now</strong>) and the rest apply when saved. Do not edit <code>hMailServer.ini</code> for them: since 6.3.4 the database holds these keys, and a line edited in the file is ignored and named in the error log as <code>HM5804</code>. <a href="/topic/28222">Settings: when a save takes effect</a> explains the store and <code>[SettingsOverride]</code>.</p>
<h3><a class="anchor-offset" name="honouring-another-domain-s-mta-sts-policy"></a>Honouring another domain's MTA-STS policy</h3>
<p dir="auto"><strong>It applies to an MX delivery, not to a fixed relay.</strong> For each message due for a domain, the server looks up the TXT record at <code>_mta-sts</code> under that domain. With no record, "no policy" is cached for 30 minutes and the message is delivered as usual. With a record, the policy is fetched over HTTPS from <code>mta-sts.&lt;domain&gt;</code> at <code>/.well-known/mta-sts.txt</code>, and its <code>mode</code> decides:</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th><code>mode</code></th>
<th>What the server does</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>none</code></td>
<td>Delivers as usual</td>
</tr>
<tr>
<td><code>testing</code></td>
<td>Writes a debug log line only; nothing is enforced</td>
</tr>
<tr>
<td><code>enforce</code></td>
<td>Drops every MX host the policy does not name. If none is left, the message is deferred with <code>4.7.0</code>. Otherwise TLS with certificate verification is required to the hosts that remain</td>
</tr>
</tbody>
</table>
<p dir="auto"><strong>How long a policy is believed.</strong> A policy is cached until its own <code>max_age</code> and revalidated by re-reading the DNS record's policy id at most once an hour. A DNS failure or a failed fetch during revalidation keeps the cached policy (RFC 8461 §5.1). The <code>mx:</code> patterns match either exactly or with a leading <code>*.</code> that matches exactly one label.</p>
<p dir="auto"><strong>What you see in the log.</strong></p>
<pre><code class="language-text">SMTPDeliverer - Message 4711: MTA-STS policy mode 'enforce' active for example.com. TLS with certificate validation is required.
SMTPDeliverer - Message 4711: Skipping MX host mx9.example.com - not permitted by the MTA-STS policy of example.com.
SMTPDeliverer - Message 4711: Delivery to example.com deferred. No MX host matches the domain's MTA-STS policy.
</code></pre>
<h3><a class="anchor-offset" name="honouring-dane"></a>Honouring DANE</h3>
<p dir="auto">DANE applies to an MX delivery when <code>DaneEnforcementEnabled=1</code>. The MX lookup for the recipient domain is DNSSEC-validated, and the chain status of the MX RRset decides what happens next.</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Step</th>
<th>Status</th>
<th>What happens</th>
</tr>
</thead>
<tbody>
<tr>
<td>The MX RRset</td>
<td>insecure</td>
<td>Delivered as usual</td>
</tr>
<tr>
<td>The MX RRset</td>
<td>bogus</td>
<td>The host is skipped entirely</td>
</tr>
<tr>
<td>The MX RRset</td>
<td>secure</td>
<td>A TLSA lookup is made per host, at <code>_25._tcp.&lt;mx-host&gt;</code></td>
</tr>
<tr>
<td>The TLSA lookup</td>
<td>bogus</td>
<td>The host is skipped</td>
</tr>
<tr>
<td>The TLSA lookup</td>
<td>no records</td>
<td>Delivered as usual</td>
</tr>
<tr>
<td>The TLSA lookup</td>
<td>validated</td>
<td>TLS is required and the certificate is pinned to the TLSA records</td>
</tr>
</tbody>
</table>
<p dir="auto">If no host could be attempted, the message is deferred with <code>4.7.0</code>.</p>
<p dir="auto">Three points that matter when you read a log:</p>
<ul>
<li><strong>The MX RRset must be DNSSEC-validated too</strong>, not only the TLSA record (RFC 7672 §2.2). A TLSA record found under a host name learned from a forged MX answer proves nothing, so the server validates the MX RRset and checks that the host it is about to contact is one of the names that RRset published.</li>
<li><strong>Only DANE-EE, usage 3, is honoured.</strong> A record of any other usage is skipped, issuer certificates are ignored, and the leaf is matched against selector 0 (whole certificate) or 1 (SubjectPublicKeyInfo) with matching type 0 (exact), 1 (SHA-256) or 2 (SHA-512).</li>
<li><strong>It fails open except for one value.</strong> <code>Bogus</code> - a published DNSSEC chain that does not validate - is the only status that can stop a delivery. Every other outcome lands on the ordinary delivery path.</li>
</ul>
<p dir="auto">An empty <code>DnssecTrustAnchors</code> means the built-in IANA root anchors. Setting <code>DnssecValidationEnabled=0</code> reverts to opportunistic, unvalidated TLSA use. With enforcement on, a recipient whose DNSSEC chain is bogus will not receive your mail rather than receive it unencrypted.</p>
<pre><code class="language-text">SMTPDeliverer - Message 4712: DNSSEC-validated DANE-EE TLSA records found for mx1.example.com. TLS with TLSA certificate matching is required.
SMTPDeliverer - Message 4712: TLSA records for mx1.example.com failed DNSSEC validation. Skipping this host (RFC 7672).
SMTPDeliverer - Message 4712: Delivery to example.com deferred. TLSA records of all MX hosts failed DNSSEC validation.
</code></pre>
<p dir="auto">And in the TCP/IP log, per handshake:</p>
<pre><code class="language-text">DANE: Session 812: Certificate matched DANE-EE TLSA record (selector 1, matching type 1).
DANE: Session 813: Certificate did not match any DANE-EE TLSA record. Failing TLS handshake.
</code></pre>
<p dir="auto">Both deferral paths use <code>4.7.0</code>, "other or undefined security status" (RFC 3463).</p>
<h3><a class="anchor-offset" name="publishing-your-own-mta-sts-policy"></a>Publishing your own MTA-STS policy</h3>
<p dir="auto"><code>MtaStsHostingEnabled</code> defaults to <code>1</code>. The built-in web services server serves <code>/.well-known/mta-sts.txt</code> for any hosted, active domain when the request's <code>Host</code> is <code>mta-sts.&lt;domain&gt;</code>, and generates the body from your live MX records unless <code>MtaStsPolicyMx</code> overrides them:</p>
<pre><code class="language-text">version: STSv1
mode: enforce
mx: mail.yourcompany.com
max_age: 604800
</code></pre>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Setting</th>
<th>Default</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>MtaStsHostingEnabled</code></td>
<td><code>1</code></td>
<td>On, but inert until the HTTPS listener exists</td>
</tr>
<tr>
<td><code>MtaStsPolicyMode</code></td>
<td><code>enforce</code></td>
<td><code>enforce</code>, <code>testing</code> or <code>none</code>; anything else is read as <code>enforce</code></td>
</tr>
<tr>
<td><code>MtaStsPolicyMaxAge</code></td>
<td><code>604800</code> (7 days)</td>
<td>Clamped to 86400 … 31557600</td>
</tr>
<tr>
<td><code>MtaStsPolicyMx</code></td>
<td>empty</td>
<td>Comma-separated override; empty derives the list from live MX records</td>
</tr>
<tr>
<td><code>WebServicesHttpsPort</code></td>
<td><code>0</code></td>
<td>Must be set. RFC 8461 §3.3 requires the policy to be fetched over HTTPS</td>
</tr>
</tbody>
</table>
<p dir="auto"><strong><code>WebServicesHttpsPort</code> is what makes it live.</strong> While it is <code>0</code> the server logs that the policy cannot be served and that sending servers will treat the domain as having no policy.</p>
<ol>
<li>Set <code>WebServicesHttpsPort</code>.</li>
<li>Add <code>mta-sts.yourcompany.com</code> to <code>AcmeDomains</code>, so that the HTTPS listener has a certificate for the name it will be asked for. Every name in <code>AcmeDomains</code> becomes a SAN on one certificate, and each must already resolve to this server (<a href="/topic/28187">Let's Encrypt certificates are automatic</a>).</li>
<li>Decide <code>MtaStsPolicyMode</code>. The default is <code>enforce</code>, under which a sender that cannot verify the certificate on your MX host defers its mail to you. The wiki's DNS page says to start at <code>testing</code>, which, once you publish a <code>_smtp._tls</code> TXT record (<code>v=TLSRPTv1; rua=mailto:...</code>), gives you TLS-RPT reports without losing mail while you find out whether every sender can reach you over TLS; then move to <code>enforce</code>.</li>
<li>Publish <code>_mta-sts.yourcompany.com. IN TXT "v=STSv1; id=20260908000000Z"</code>.</li>
<li>Bump the <code>id</code> whenever you change the policy.</li>
</ol>
<h3><a class="anchor-offset" name="dane-for-your-own-server-with-acme"></a>DANE for your own server, with ACME</h3>
<p dir="auto">Every successful ACME issuance writes the exact record to publish into the log:</p>
<pre><code class="language-text">ACME: DANE TLSA record for this certificate: _25._tcp.&lt;mx-host&gt;. IN TLSA 3 1 1 3b1f…
</code></pre>
<p dir="auto">That is <code>3 1 1</code>: DANE-EE, SubjectPublicKeyInfo, SHA-256. The digest is over the key, so the record stays valid across a renewal only when the key is kept, which is what <code>AcmeReuseKey</code> (default <code>1</code>) does. When it is on and a <code>privkey.pem</code> already exists, the log says <code>ACME: Reusing the existing certificate key (keeps published TLSA records valid).</code> Otherwise a fresh 2048-bit RSA key is generated. Leave it on if you publish TLSA records.</p>
<p dir="auto">The wiki's DNS page adds three things. Your zone must be <strong>DNSSEC-signed</strong> for the record to mean anything. Publish the record for every host named in your MX records. And re-publish before you rotate a certificate, never after. The Control Panel's DNS records page does not generate the TLSA value.</p>
<h3><a class="anchor-offset" name="a-requirement-of-your-own-remote-domain-policies"></a>A requirement of your own: remote domain policies</h3>
<p dir="auto"><em>Since 6.3.4 (schema 6045).</em> In 6.3.3 the only ways to insist on TLS to a destination are the server-wide delivery security setting, a route's own connection security, and the MTA-STS or DANE policy the domain publishes itself. A <strong>remote domain policy</strong> is you saying the same for a domain that publishes nothing: a partner, a bank.</p>
<p dir="auto"><strong>Where it lives.</strong> Policies are rows of <code>hm_remotedomainpolicies</code>, take effect for the next message without a restart, are part of the configuration backup, and have nothing in <code>hMailServer.ini</code>. Four surfaces write the same records:</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Where</th>
<th>How</th>
</tr>
</thead>
<tbody>
<tr>
<td>Control Panel (Windows)</td>
<td><strong>Mail flow &amp; delivery → Remote domains</strong>, beside Routes</td>
</tr>
<tr>
<td>Control Deck</td>
<td><strong>Remote domains</strong> in the navigation</td>
</tr>
<tr>
<td>REST API</td>
<td><code>GET</code>/<code>POST /api/v1/remote-domains</code>, <code>PUT</code>/<code>DELETE /api/v1/remote-domains/{id}</code>, <code>GET /api/v1/remote-domains/effective?domain=...</code></td>
</tr>
<tr>
<td>COM (Windows)</td>
<td><code>Application.Settings.RemoteDomainPolicies</code></td>
</tr>
</tbody>
</table>
<p dir="auto">All are server-administrator only. An API key restricted to named domains is refused, because a policy names somebody else's domain and decides this server's posture.</p>
<p dir="auto"><strong>A policy is not a route.</strong> A route says where mail for a domain goes and replaces the MX lookup. A policy says what this server will and will not do when it gets there, however the server was found. A domain may have both, and the policy applies to a routed delivery exactly as it applies to an MX one.</p>
<p dir="auto"><strong>Which policy applies.</strong> A policy names a domain (<code>bank.example</code>) or a pattern (<code>*.example</code>, <code>*</code>), and the most specific active one governs:</p>
<ol>
<li>an exact name beats any pattern, however long the pattern;</li>
<li>between two patterns, the one with more literal characters wins;</li>
<li>an inactive policy is skipped, and the next most specific active one governs in its place. Switching off the entry for one domain beneath a <code>*</code> that requires TLS removes an exception; it does not exempt that domain.</li>
</ol>
<p dir="auto"><code>GET /api/v1/remote-domains/effective?domain=mail.bank.example</code> (and <code>PolicyForDomain</code> over COM) answers which record a delivery will use, before a message has to find out. When one connection carries recipients of several domains, the strictest combination applies: the highest TLS requirement, and the smallest of each non-zero limit.</p>
<p dir="auto"><strong>Outbound TLS.</strong></p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Value</th>
<th>What delivery to the domain requires</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>none</code> (default)</td>
<td>Nothing beyond what the server does anyway: the delivery security setting, a route's security, and MTA-STS or DANE if the domain publishes them</td>
</tr>
<tr>
<td><code>encrypted</code></td>
<td>STARTTLS must be offered and the handshake must succeed. The certificate is not judged - the level for a partner with a self-signed or internal certificate</td>
</tr>
<tr>
<td><code>verified</code></td>
<td>Encrypted, and the certificate must chain to a trusted root and name the host connected to - what MTA-STS <code>enforce</code> asks</td>
</tr>
<tr>
<td><code>dane</code></td>
<td>Encrypted, and the certificate must match a DNSSEC-validated TLSA record. The TLSA lookup is made even with DANE enforcement off and even for a routed delivery; a host with no validated record is skipped, so with <code>DnssecValidationEnabled=0</code> every delivery under the policy is deferred</td>
</tr>
</tbody>
</table>
<p dir="auto"><strong>It can only raise the requirement.</strong> The policy, MTA-STS <code>enforce</code> and a usable TLSA record combine as the strictest of the three, never the newest. A domain that publishes MTA-STS <code>enforce</code> and is named here at <code>encrypted</code> still gets certificate verification. No value here weakens what a domain published for itself.</p>
<p dir="auto"><strong>A delivery it cannot satisfy is deferred, never sent in the clear.</strong> The recipient's status is <code>4.7.0</code>, the message stays queued and is retried on the usual schedule, and the log line - and the bounce, if the retries run out - names the rule:</p>
<pre><code class="language-text">Delivery deferred: the remote domain policy for bank.example requires TLS with a
certificate that verifies to this destination, and it could not be established.
The message has NOT been sent in the clear.
</code></pre>
<p dir="auto">It is a deferral rather than a bounce on purpose: the far end may fix its STARTTLS or its certificate before the queue gives up, which is how RFC 8461 §5 reasons about MTA-STS.</p>
<p dir="auto"><strong>Inbound.</strong> With <em>Require TLS on mail from this domain</em> set, an unencrypted session whose envelope sender is at the domain is answered <code>530 5.7.0 Must issue STARTTLS first</code> at <code>MAIL FROM</code>. It is not applied to an authenticated submission, nor to a connection from a configured incoming relay: behind a front-end filter the hop the policy is about happened before that machine, and TLS has to be required there. The envelope sender is whatever the connecting server claims, so this keeps honest partners encrypted and is not an anti-spoofing control.</p>
<p dir="auto"><strong>The rest of the record.</strong> The same row carries the largest message this server will send to the domain (beyond it no connection is opened and the message is bounced at once with <code>5.3.4</code>), the simultaneous connections and the messages a minute (beyond either, deferred with <code>4.4.5</code> for one to five minutes), whether automatic replies and forwards may go there, a backup-MX recipient callout, and since 6.3.4 (schema 6094) <em>Encrypt mail to this domain at this server</em>. The ceilings are in <a href="/topic/28259">Outbound shaping and IP warm-up</a>, gateway encryption in <a href="/topic/28260">End-to-end encryption</a>.</p>
<h3><a class="anchor-offset" name="telling-other-operators-what-happened-the-reports-you-send"></a>Telling other operators what happened: the reports you send</h3>
<p dir="auto">Two aggregate reporters, both scheduled hourly and both <strong>inert until a sender address is set</strong>. They flush their statistics either way, so switching one on does not start with an empty history.</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th></th>
<th>TLS-RPT (RFC 8460)</th>
<th>DMARC aggregate (RFC 7489)</th>
</tr>
</thead>
<tbody>
<tr>
<td>Address setting</td>
<td><code>TlsRptFromAddress</code></td>
<td><code>DmarcRptFromAddress</code></td>
</tr>
<tr>
<td>Organisation name</td>
<td><code>TlsRptOrganizationName</code>, default <code>hMailServer</code></td>
<td><code>DmarcRptOrganizationName</code>, default <code>hMailServer</code></td>
</tr>
<tr>
<td>Recorded by</td>
<td><code>ExternalDelivery</code>, per delivery attempt, classified <code>tlsa</code>, <code>sts</code> or <code>no-policy-found</code></td>
<td><code>SpamTestDMARC</code>, for every message evaluated against a published policy, passes included</td>
</tr>
<tr>
<td>Schema</td>
<td>-</td>
<td><code>DmarcRptSchemaVersion</code>, default <code>1</code> = RFC 7489 Appendix C; <code>2</code> = RFC 9990</td>
</tr>
</tbody>
</table>
<p dir="auto">DMARC reports are sent to an address outside the policy domain only when that address's own DNS says it wants them, so a domain cannot use its DMARC record to aim this server's reports at somebody else.</p>
<p dir="auto"><strong>Recording what this server concluded.</strong> Three related settings, the first two off by default:</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Setting</th>
<th>Default</th>
<th>What it writes</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>AuthenticationResultsEnabled</code></td>
<td>off</td>
<td>One <code>Authentication-Results</code> header per accepted inbound message (RFC 8601), with the SPF, DKIM and DMARC verdicts this server reached. Only checks that ran are reported</td>
</tr>
<tr>
<td><code>ReceivedSpfHeaderEnabled</code></td>
<td>off</td>
<td>A <code>Received-SPF</code> header (RFC 7208 §9.1), written only when the SPF check ran</td>
</tr>
<tr>
<td><code>AuthenticationResultsIdentity</code></td>
<td>empty = this computer's name</td>
<td>The authserv-id, always lower-cased</td>
</tr>
</tbody>
</table>
<p dir="auto">An arriving message that carries an <code>Authentication-Results</code> header claiming this server's identity has that header removed before the server writes its own; a header naming any other identity is left untouched.</p>
<p dir="auto">The reports <em>other</em> servers send about <em>your</em> domains go to the <code>rua=</code> address in your <code>_dmarc</code> and <code>_smtp._tls</code> records. Since 6.3.4 a domain's report mailbox reads them: see <a href="/topic/28258">DKIM rotation, DMARC and TLS reports</a>.</p>
<h3><a class="anchor-offset" name="a-checklist"></a>A checklist</h3>
<ol>
<li><code>AcmeEnabled=1</code>, <code>AcmeDomains</code> naming <code>mail.</code>, <code>mta-sts.</code> and <code>autoconfig.</code>, and port 80 reachable (<a href="/topic/28187">the ACME topic</a>).</li>
<li>Check <strong>TLS &amp; certificates → Transport encryption overview</strong>, which says whether anything still carries a password in the clear.</li>
<li>Leave <code>MtaStsEnabled</code>, <code>DaneEnforcementEnabled</code> and <code>DnssecValidationEnabled</code> at <code>1</code>.</li>
<li>Set <code>WebServicesHttpsPort</code>, start <code>MtaStsPolicyMode</code> at <code>testing</code>, and publish <code>_mta-sts</code> and <code>_smtp._tls</code> in DNS.</li>
<li>Publish the TLSA record the ACME log prints, if your zone is signed.</li>
<li>Since 6.3.4, name the partners that must never get mail in the clear as remote domain policies at <code>encrypted</code> or <code>verified</code>.</li>
<li>Turn on <code>AuthenticationResultsEnabled</code>, and set <code>TlsRptFromAddress</code> and <code>DmarcRptFromAddress</code>.</li>
<li>Diary the first renewal: it falls two-thirds of the way through the certificate's life, and the log line to look for is <code>ACME: Certificate issued successfully</code>.</li>
</ol>
<h3><a class="anchor-offset" name="what-this-topic-does-not-cover"></a>What this topic does not cover</h3>
<ul>
<li><strong>The connection to the database</strong> (<code>[Database] TlsMode</code> and <code>TlsCaFile</code>, since 6.3.4): <a href="/topic/28228">Choosing a database and encrypting the link</a>.</li>
<li><strong>Protocol versions, cipher suites, session resumption and client certificates</strong>: <a href="/topic/28256">TLS on the listeners</a>.</li>
<li><strong>Encrypting the message rather than the connection.</strong> TLS ends at the next server; <a href="/topic/28260">End-to-end encryption</a> is about what happens after that.</li>
</ul>
<h3><a class="anchor-offset" name="where-to-read-more"></a>Where to read more</h3>
<ul>
<li>Wiki: <a href="https://gitlab.com/hmailserver/hmailserver/-/wikis/Encryption-and-Certificates" rel="nofollow ugc">Encryption and Certificates</a>, §9.6 to §9.10; <a href="https://gitlab.com/hmailserver/hmailserver/-/wikis/DNS-for-Your-Domain" rel="nofollow ugc">DNS for Your Domain</a>, for the records themselves; <a href="https://gitlab.com/hmailserver/hmailserver/-/wikis/Routes-and-Relays" rel="nofollow ugc">Routes and Relays</a>, §14.2a, for the whole remote domain record.</li>
<li>Operator document at the v6.3.4 tag: <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/RemoteDomains.md" rel="nofollow ugc">RemoteDomains.md</a>.</li>
<li>Public documentation: <a href="https://www.progressiverobot.com/hmailserver-documentation/#94-outbound-transport-security" rel="nofollow ugc">9.4 Outbound transport security</a> and <a href="https://www.progressiverobot.com/hmailserver-documentation/#87-mta-sts--enforcing-encryption-inbound" rel="nofollow ugc">8.7 MTA-STS</a>.</li>
<li>On this forum: <a href="/topic/28187">Let's Encrypt certificates are automatic</a>, <a href="/topic/28188">Being trusted by the servers you send to</a>, and <a href="/topic/28193">Upgrading to 6.3.4</a> for what changes about <code>hMailServer.ini</code>.</li>
</ul>
]]></description><link>https://www.hmailserver.co.uk/topic/28257/requiring-tls-mta-sts-and-tls-rpt-dane-with-acme-and-remote-domain-policies</link><generator>RSS for Node</generator><lastBuildDate>Fri, 06 Nov 2026 09:05:54 GMT</lastBuildDate><atom:link href="https://www.hmailserver.co.uk/topic/28257.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 27 Sep 2026 19:39:13 GMT</pubDate><ttl>60</ttl></channel></rss>