<?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[TLS on the listeners: your own certificate, versions, ciphers and client certificates]]></title><description><![CDATA[<p dir="auto"><em>Written for 6.3.4. hMailServer 6.3.7 (17 October 2026) renames two Control Panel pages this topic names: SSL certificates is TLS certificates and SSL/TLS is TLS versions &amp; ciphers; Ctrl+K takes every old title and route to its page. See <a href="/topic/28277">the 6.3.7 announcement</a>. On Windows, hMailServer 6.3.8 (2 November 2026) reads each certificate and private key file, <code>dh2048.pem</code> and a port's client-certificate CA file from the file configured, and refuses with <code>HM7536</code> a name it cannot hand over as it is named (work item 115): a port whose certificate or key such a name gives does not start, a client-certificate CA file verifies no certificate, and <code>dh2048.pem</code> is left out as a missing one is. Before upgrading, give each such file whose path holds characters outside ASCII, and the folders above it, an ASCII name; the Control Panel shows a certificate or key file whose name is refused as Name refused. On Linux every name goes over in UTF-8, so on a server that ran under a <code>LANG</code> that is not UTF-8, rename such a file to its UTF-8 name before upgrading. See <a href="/topic/28278">the 6.3.8 announcement</a>.</em></p>
<p dir="auto">This topic is the manual half of TLS on the SMTP, IMAP and POP3 listeners: your own certificate and where the Windows service may read it, then versions, ciphers, key exchange, session resumption, client certificates with SASL <code>EXTERNAL</code>, and certificates for IP addresses. <strong>Know this first: a port set to use TLS whose certificate cannot be loaded does not fall back to plain text. It does not start.</strong> The application log says <code>HM5113</code>, and the only other symptom is a listener missing.</p>
<h3><a class="anchor-offset" name="where-each-thing-is-set-and-when-it-applies"></a>Where each thing is set, and when it applies</h3>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>What</th>
<th>Set in</th>
<th>Applies</th>
</tr>
</thead>
<tbody>
<tr>
<td>Certificates, and which port uses which</td>
<td>Control Panel: <strong>TLS &amp; certificates → SSL certificates</strong> and <strong>Connections &amp; protocols → TCP/IP ports</strong>; the Deck's certificates and listeners views; <code>/api/v1/certificates</code> and <code>/api/v1/ports</code>; <code>hmctl</code>'s <code>certificate</code> and <code>port</code> resources; COM</td>
<td>At a reinitialise, or a service restart</td>
</tr>
<tr>
<td>TLS 1.0 to 1.3, the cipher list for TLS 1.2 and below, the two cipher-order switches</td>
<td>Control Panel: <strong>TLS &amp; certificates → SSL/TLS</strong>; <code>PUT /api/v1/settings</code>; <code>hmctl settings set</code>; COM <code>Settings</code></td>
<td>See the note below</td>
</tr>
<tr>
<td><code>TlsCipherSuites13</code>, <code>TlsKeyExchangeGroups</code> and the four session settings</td>
<td>The same page; <code>PUT /api/v1/settings/ini/{name}</code>; <code>hmctl ini set</code>; on Linux <code>hmailserver --set-setting</code></td>
<td>At a reinitialise</td>
</tr>
</tbody>
</table>
<p dir="auto">A reinitialise is <strong>Apply now</strong> on the Control Panel's pending bar or in the Deck's Settings view, <code>POST /api/v1/server/reinitialize</code>, or <code>Application.Reinitialize</code> over COM. Every service stops and starts again in the same process; it ends the Deck's session and any drain in progress. <code>GET /api/v1/server/settings/pending</code> lists the <code>[Settings]</code> keys saved and not yet running, such as <code>TlsKeyExchangeGroups</code>; a port, a certificate, the versions and the cipher list are never in it. The Control Panel and COM are Windows-only; on Linux use the Deck, REST or <code>hmctl</code>.</p>
<p dir="auto"><strong>Do not edit <code>hMailServer.ini</code>.</strong> Since 6.3.4 the database holds the <code>[Settings]</code> keys, so a line changed in the file is put back (<code>HM5804</code>) or left unused; <a href="/topic/28222">Settings: when a save takes effect</a> explains the store and the reinitialise.</p>
<p dir="auto"><strong>When the versions and the cipher list apply.</strong> They and the two order switches are database settings (<code>hm_settings</code> rows), not <code>[Settings]</code> keys, so <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/SettingsApply.md" rel="nofollow ugc">SettingsApply.md</a> gives them no mark. <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/Roadmap.md" rel="nofollow ugc">Roadmap.md</a> says they are applied in the call that builds each listener's TLS context, and <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/SettingsApply.md" rel="nofollow ugc">SettingsApply.md</a> says those contexts are built when the servers start; the wiki's Control Panel Pages page, written against 6.2.28, says the SSL/TLS page's COM settings apply at once. Press <strong>Apply now</strong> after changing any of them, and check from outside.</p>
<h3><a class="anchor-offset" name="adding-your-own-certificate"></a>Adding your own certificate</h3>
<p dir="auto"><strong>Two PEM files.</strong> The certificate file must hold the leaf <strong>and</strong> the issuer chain: the server loads it twice, once as the certificate and once as the chain, and reports each failure separately. The private key is the second file.</p>
<p dir="auto"><strong>A passphrase-protected key is supported</strong>, per certificate. Give it in the add dialog, on the SSL certificates page's <strong>Private key passphrase</strong> card, in the Deck, or as <code>private_key_password</code> in <code>POST /api/v1/certificates</code>. It is write-only and kept under the machine's own secret store. The built-in backup and restore carries it to a new machine; a copied or shared database does not, so on a warm standby enter it again after a failover, and again on the primary after failing back, or the key does not load there and the TLS ports that use it do not start. An encrypted key with no passphrase is <code>HM6170</code>, and its port does not start.</p>
<p dir="auto"><strong>Where the files go.</strong> On Windows, a new 6.3.4 installation runs the service as <code>NT SERVICE\hMailServer</code>, which reads only what it has been granted (next section); put the files in <code>Data\Certificates</code> (<code>C:\Program Files\hMailServer\Data\Certificates</code> on a default installation), where a new 6.3.4 installation's self-signed pair is. An upgraded Windows server keeps the account it had; LocalSystem can read a file anywhere. On Linux the service runs as <code>User=hmailserver</code> under a unit with <code>ProtectHome=yes</code>, so nothing under <code>/home</code> is visible to it. The self-signed pair of a new installation is in <code>/var/lib/hmailserver/Certificates</code>, its key mode 0600 owned by the service's user; keep yours beside it, readable by that user.</p>
<ol>
<li>Copy the certificate file and the key into that folder.</li>
<li>Add the certificate: on Windows, <strong>TLS &amp; certificates → SSL certificates → Add certificate</strong> (a name, the PEM certificate file, the PEM key file, an optional passphrase); or the Deck's certificates view; or <code>POST /api/v1/certificates</code> with <code>name</code>, <code>certificate_file</code> and <code>private_key_file</code>. A file that is not there is refused (400). The Control Panel's grid then shows whether the certificate parses, when it expires, and whether the key is encrypted and matches.</li>
<li>On Windows under the virtual account, run <strong>Grant access</strong> (next section), so it reads the new paths.</li>
<li>Set the certificate on every TLS port: <strong>TCP/IP ports → Edit</strong>, the certificate list. Over REST, <code>PUT /api/v1/ports/{id}</code> is the whole record and fields left out take their defaults, so send protocol, address, port, connection security, <code>certificate_id</code> and the two client-certificate fields every time.</li>
<li>Reinitialise.</li>
<li>Check the application log for the codes below and, on Windows, <strong>Monitoring &amp; troubleshooting → Server status</strong> for the listeners actually running and <strong>TLS &amp; certificates → Transport encryption overview</strong>, which judges ports, certificates, versions and ciphers together.</li>
</ol>
<p dir="auto">From a shell over the REST listener: add the certificate, then, once the ports are set, reinitialise and read the banner over implicit TLS. <code>--from-json</code> with <code>-</code> reads the body from standard input, which keeps a passphrase off the process list; the JSON holds the fields of step 2 and, for an encrypted key, <code>private_key_password</code>.</p>
<pre><code class="language-sh">hmctl certificate create --from-json - &lt; certificate.json
hmctl api POST /api/v1/server/reinitialize
openssl s_client -connect mail.example.com:465 -quiet
</code></pre>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Code</th>
<th>Message</th>
<th>Meaning</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>HM5113</code></td>
<td><code>Failed to load certificate file</code> / <code>…certificate chain…</code> / <code>…private key file</code></td>
<td>The path, the format or the passphrase is wrong, the file cannot be read, or the key does not match. The port does not start</td>
</tr>
<tr>
<td><code>HM5113</code></td>
<td><code>Error initializing SSL. Certificate not set.</code></td>
<td>A TLS port has no certificate. The port does not start</td>
</tr>
<tr>
<td><code>HM6170</code></td>
<td>—</td>
<td>An encrypted key with no passphrase stored. The port does not start</td>
</tr>
<tr>
<td><code>HM5991</code></td>
<td><code>The TLS certificate … expired on …</code> / <code>… is not valid until …</code></td>
<td>Reported at startup; the port starts and offers it anyway, and clients refuse it. A future date usually means the server's clock is wrong</td>
</tr>
<tr>
<td><code>HM5603</code></td>
<td><code>Unable to enable Diffie-Hellman key agreement</code></td>
<td><code>dh2048.pem</code> is missing: from <code>Bin</code> on Windows, from beside the binary in <code>/usr/bin</code> on Linux</td>
</tr>
</tbody>
</table>
<p dir="auto"><strong>Replacing it later.</strong> When ACME renews, it logs <code>ACME: Restarting servers to load the new certificate.</code>; after replacing a file by hand, reinitialise likewise. If you publish DANE records, publish the new TLSA record before you rotate the certificate, never after; <code>GET /api/v1/tlsa</code> gives one <code>3 1 1</code> record per configured certificate, for <code>_25._tcp</code> only. Since 6.3.4 the alert <code>certificate.expiring</code> is on as shipped (7 days ahead), but nothing is mailed until <code>AlertRecipient</code> and <code>AlertSenderAddress</code> are set; the metrics listener exports <code>hmailserver_tls_certificate_expiry_seconds</code>. Since 6.3.4 a COM script's change to an SSL certificate is not in effect until <code>Save()</code>, and one never saved changes nothing, so a script that relied on an unsaved change must now save; the listeners still load the certificate at a reinitialise.</p>
<p dir="auto"><strong>ACME alongside.</strong> The built-in client gives its certificate to TLS ports that have none or hold the installation's self-signed one, and leaves alone a port that names a certificate somebody chose.</p>
<p dir="auto"><strong>The HTTPS listeners take files, not a certificate record</strong>: <code>RestApiCertificateFile</code>, <code>WebServicesCertificateFile</code> and <code>MetricsServerCertificateFile</code>, each with its private-key partner, all waiting for a reinitialise. ManageSieve reuses the certificate configured on an IMAP, POP3 or SMTP port.</p>
<h3><a class="anchor-offset" name="the-service-account-s-folder-rules-windows-since-6.3.4"></a>The service account's folder rules (Windows, since 6.3.4)</h3>
<p dir="auto"><code>hMailServer.exe /GrantServiceAccess</code>, run elevated, grants <code>NT SERVICE\hMailServer</code> Modify on the program folder's own <code>Data</code>, <code>Logs</code>, <code>Temp</code> and <code>Database</code>, Read on its other folders, and what an administrator approved. It is the <strong>Grant access…</strong> button on <strong>Maintenance → Server limits &amp; expert settings</strong>, card <em>Windows service account</em>, or, from an elevated Command Prompt in <code>Bin</code>:</p>
<pre><code>hMailServer.exe --confirm /GrantServiceAccess
</code></pre>
<p dir="auto">It checks every certificate and key file the configuration names (the SSL certificates, DKIM keys, and the REST, metrics and web-services files) against those grants. A file in a folder they reach needs nothing; where the file's own permissions keep the folder's grant from it, the grant gives Read on that file alone. A file they do not reach is listed <code>OUTSIDE</code> and is never given Read where it is, because the configuration could name any file on the machine. Move it into <code>Data\Certificates</code>, or approve its folder for Read with <code>--approve-read "&lt;folder&gt;"</code> or Yes at the question <code>--confirm</code> asks; approve only a folder you recognise. Some folders are refused even when approved, a share and a drive's root among them. <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/ServiceAccount.md" rel="nofollow ugc">ServiceAccount.md</a> does not list the client-certificate CA bundle among the files the grant checks, so keep that bundle in <code>Data\Certificates</code> too. The account's rules in full, from what is never granted to the exit codes, are in <a href="/topic/28227">Installing on Windows</a>.</p>
<h3><a class="anchor-offset" name="protocol-versions-and-the-legacy-switches"></a>Protocol versions and the legacy switches</h3>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Version</th>
<th>Bit in <code>SslVersions</code></th>
<th>COM</th>
<th>REST, in <code>PUT /api/v1/settings</code></th>
</tr>
</thead>
<tbody>
<tr>
<td>TLS 1.0 (legacy)</td>
<td>2</td>
<td><code>TlsVersion10Enabled</code></td>
<td><code>tls_version_10_enabled</code></td>
</tr>
<tr>
<td>TLS 1.1 (legacy)</td>
<td>4</td>
<td><code>TlsVersion11Enabled</code></td>
<td><code>tls_version_11_enabled</code></td>
</tr>
<tr>
<td>TLS 1.2</td>
<td>8</td>
<td><code>TlsVersion12Enabled</code></td>
<td><code>tls_version_12_enabled</code></td>
</tr>
<tr>
<td>TLS 1.3</td>
<td>16</td>
<td><code>TlsVersion13Enabled</code></td>
<td><code>tls_version_13_enabled</code></td>
</tr>
</tbody>
</table>
<p dir="auto">The shipped value is <strong>24, TLS 1.2 and 1.3 only</strong>; SSLv2 and SSLv3 cannot be switched on at all. Do not re-enable TLS 1.0 or 1.1 unless a specific old client forces you to, and plan to replace that client. The versions and the cipher list also govern the connections this server makes when it delivers. The REST, web-services HTTPS and metrics listeners add a TLS 1.2 minimum of their own, so TLS 1.0 switched on for an old mail client stays off for the management API, and a server left with only TLS 1.0 and 1.1 leaves those three listeners with no version at all. Every version switched off is <code>HM5990</code> and falls back to TLS 1.2 and 1.3; turning TLS off is done per port.</p>
<h3><a class="anchor-offset" name="cipher-suites-code-sslcipherlist-code-code-aead-only-code-and-code-tlsciphersuites13-code"></a>Cipher suites: <code>SslCipherList</code>, <code>AEAD-ONLY</code> and <code>TlsCipherSuites13</code></h3>
<ul>
<li><strong><code>SslCipherList</code></strong> is an OpenSSL cipher string for <strong>TLS 1.2 and below only</strong>; it does not touch TLS 1.3. The shipped value is the long-standing list, which also admits CBC-mode suites and static-RSA key exchange. A string OpenSSL rejects is <code>HM5511</code>, and the previous list stays.</li>
<li><strong><code>AEAD-ONLY</code></strong> is a named preset, not an OpenSSL string: set <code>SslCipherList</code> to that word and the server applies a vetted list of forward-secret AES-GCM and ChaCha20-Poly1305 suites (ECDHE and DHE), excluding every CBC-mode suite and static-RSA key exchange. The cost: TLS 1.2 clients that speak only CBC cannot connect, and <strong>TLS 1.0 and 1.1 are left with no usable suite</strong>, so never enable them alongside it; the Transport encryption overview flags that combination. A misspelled preset goes to OpenSSL, which rejects it, and <code>HM5511</code> names the string.</li>
<li><strong><code>TlsCipherSuites13</code></strong> takes RFC 8446 names, colon separated, for example <code>TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256</code>. Empty, the shipped value, leaves OpenSSL's defaults. A list rejected outright is <code>HM6120</code> and the defaults stand; names this build does not know are named in <code>HM6121</code> and the rest of the list <strong>is</strong> applied.</li>
<li><strong>Prefer server cipher order</strong> and <strong>Prioritize ChaCha20-Poly1305</strong> (<code>TlsOptionPreferServerCiphersEnabled</code>, <code>TlsOptionPrioritizeChaChaEnabled</code>; over REST <code>tls_prefer_server_ciphers</code>, <code>tls_prioritize_chacha</code>) are both off as shipped. The second works only with the first on and TLS 1.2 or 1.3 enabled.</li>
</ul>
<p dir="auto">A compliance baseline from a shell, then a reinitialise:</p>
<pre><code class="language-sh">hmctl settings set --set ssl_cipher_list=AEAD-ONLY --set tls_prefer_server_ciphers=true
hmctl ini set TlsCipherSuites13 TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256
hmctl api POST /api/v1/server/reinitialize
</code></pre>
<p dir="auto">The <code>ini</code> line takes the administrator password (<code>--password-file</code> or <code>HMAIL_PASSWORD</code>); an API key is refused there with 401.</p>
<h3><a class="anchor-offset" name="key-exchange-the-hybrid-post-quantum-groups"></a>Key exchange: the hybrid post-quantum groups</h3>
<p dir="auto"><code>TlsKeyExchangeGroups</code> ships as <code>X25519MLKEM768:SecP256r1MLKEM768:X25519:secp384r1:secp256r1</code>: two ML-KEM hybrids first, then the classical curves, so a modern peer agrees a hybrid and an older one falls back. The list reaches every TLS context in the server: the mail listeners, ManageSieve, the three HTTPS listeners and the outbound client, so mail this server sends uses it too. A list OpenSSL rejects, an empty one, or one that leaves no group, is <code>HM5720</code> and falls back to <code>secp384r1:x25519:secp256r1</code>, without the two hybrids; if even that is refused, <code>HM5721</code> and OpenSSL's own defaults.</p>
<h3><a class="anchor-offset" name="session-caches-tickets-and-ticket-key-rotation"></a>Session caches, tickets and ticket-key rotation</h3>
<p dir="auto">All four are on the SSL/TLS page's <strong>Session resumption</strong> tab and wait for a reinitialise. At their defaults three of them make no OpenSSL call at all.</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Setting</th>
<th>Default</th>
<th>A non-default value</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>TlsSessionTicketsEnabled</code></td>
<td>on</td>
<td>Off: no tickets on any version. TLS 1.2 clients fall back to the in-process cache; TLS 1.3 clients get no ticket</td>
</tr>
<tr>
<td><code>TlsSessionCacheSize</code></td>
<td>0, OpenSSL's cap of 20480</td>
<td>A positive value replaces the cap; <code>-1</code> turns the server-side cache off, leaving tickets alone</td>
</tr>
<tr>
<td><code>TlsSessionTimeoutSeconds</code></td>
<td>0, OpenSSL's 300</td>
<td>Bounds how long a leaked resumption secret stays useful</td>
</tr>
<tr>
<td><code>TlsTicketKeyRotationSeconds</code></td>
<td>0, one key for the life of the process</td>
<td>A captured ticket can be decrypted for at most two intervals; <code>86400</code> is a day</td>
</tr>
</tbody>
</table>
<p dir="auto"><strong>Rotation is the one worth turning on for forward secrecy.</strong> Without it every ticket is sealed under one key made at startup, and that key, recovered later from a memory dump or a hibernation file, opens every ticket ever recorded. Rotation is process-wide. Each listener keeps its own session-ID context, so a session made on a port that asks for no client certificate is never resumed on one that requires it.</p>
<h3><a class="anchor-offset" name="client-certificates-mutual-tls-and-sasl-code-external-code"></a>Client certificates (mutual TLS) and SASL <code>EXTERNAL</code></h3>
<p dir="auto">The policy is <strong>per port</strong>, on the TCP/IP port dialog (COM <code>ClientCertificatePolicy</code> and <code>ClientCertificateCAFile</code>; REST <code>client_certificate_policy</code> and <code>client_certificate_ca_file</code>).</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Policy</th>
<th>Behaviour</th>
<th>CA bundle cannot be loaded</th>
</tr>
</thead>
<tbody>
<tr>
<td>Off (0)</td>
<td>Nothing is asked. The default</td>
<td>—</td>
</tr>
<tr>
<td>Request (1)</td>
<td>Asked, verified if offered, the outcome logged; the handshake never fails over it</td>
<td><code>HM6140</code>, and the port starts anyway</td>
</tr>
<tr>
<td>Require (2)</td>
<td>The handshake fails unless the client presents a certificate chaining to the port's CA bundle</td>
<td>The listener is not started</td>
</tr>
</tbody>
</table>
<p dir="auto">The bundle is the <strong>only</strong> trust anchor for that port, not the Windows certificate store. A policy on a port without TLS is refused when you save it; <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/Roadmap.md" rel="nofollow ugc">Roadmap.md</a> adds a policy with no CA file, and Require on a STARTTLS (optional) port, where a client that never issues STARTTLS is never asked. A hand-edited database that has one anyway is <code>HM6142</code> (require stops the listener, request only logs). Start with <strong>Request</strong> to see which clients could survive <strong>Require</strong>; Require on the port ordinary mail clients use would lock out every one without a certificate.</p>
<p dir="auto"><strong><code>EXTERNAL</code>.</strong> A verified client certificate that names an address makes <code>AUTH EXTERNAL</code> (RFC 4422) available on that connection, on SMTP, IMAP and POP3, and to nobody else. It signs in as the mailbox the certificate names: a subjectAltName rfc822Name, the subject's emailAddress, or an address-shaped common name; a certificate for one user is never a credential for another. Since 6.3.4 such a sign-in also meets the domain's and the account's country policy, and an SMTP session signed in with it is no longer refused its second message with 550. Since 6.3.4 a mailbox encrypted at rest refuses <code>EXTERNAL</code> on IMAP and POP3, opening with its own password only.</p>
<h3><a class="anchor-offset" name="a-certificate-for-an-ip-address-linux-since-6.3.4"></a>A certificate for an IP address (Linux, since 6.3.4)</h3>
<p dir="auto">This is about certificates this server <strong>checks</strong> when it connects out, not the one it serves. An endpoint given by its address (an object store, a webhook, the update feed, an SMTP route, the syslog sink) presents a certificate with the address in an <code>iPAddress</code> entry, where RFC 5280 puts it. The Linux check read only <code>dNSName</code> entries and the common name, so such a certificate was refused; it is accepted now, and the HTTPS client no longer sends an address as the server name (SNI), as the IMAP migration client already did not. Newly refused on Linux: a wildcard taken to cover an address, and the common name of a certificate whose <code>iPAddress</code> entries name other addresses. Windows always accepted such certificates.</p>
<h3><a class="anchor-offset" name="what-it-does-not-do"></a>What it does not do</h3>
<ul>
<li>It does not obtain or renew certificates: that is ACME, in <a href="/topic/28187">Let's Encrypt certificates are automatic</a>.</li>
<li>Connection security per port, and what a mail client is told: <a href="/topic/28255">Connecting a mail client</a>.</li>
<li>MTA-STS, DANE, TLS-RPT and remote domain policies: <a href="/topic/28257">Requiring TLS</a>. The hardening checklist: <a href="/topic/28241">Hardening a public mail server</a>.</li>
<li>TLS to the database is <code>[Database] TlsMode</code> and <code>TlsCaFile</code>, with no Control Panel or Deck editor: <a href="/topic/28228">Choosing a database and encrypting the link</a>.</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.2 to §9.4 and §9.12, <a href="https://gitlab.com/hmailserver/hmailserver/-/wikis/Ports-Reference" rel="nofollow ugc">Ports Reference</a> §3.4, <a href="https://gitlab.com/hmailserver/hmailserver/-/wikis/Settings-Reference" rel="nofollow ugc">Settings Reference</a>, <a href="https://gitlab.com/hmailserver/hmailserver/-/wikis/Security-Hardening" rel="nofollow ugc">Security Hardening</a> §17.3.</li>
<li>Documents: <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/ServiceAccount.md" rel="nofollow ugc">ServiceAccount.md</a>, <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/SettingsApply.md" rel="nofollow ugc">SettingsApply.md</a>, <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/SecureDefaults.md" rel="nofollow ugc">SecureDefaults.md</a>, <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/SecretsAtRest.md" rel="nofollow ugc">SecretsAtRest.md</a>, <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/DatabaseTls.md" rel="nofollow ugc">DatabaseTls.md</a>, <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/AlertsAndAuditTrail.md" rel="nofollow ugc">AlertsAndAuditTrail.md</a>.</li>
<li>On the forum, for the certificate-expiry alert and where it is mailed: <a href="/topic/28273">Alerts, the audit trail, syslog and the journal</a>.</li>
<li>The documentation page, <a href="https://www.progressiverobot.com/hmailserver-documentation/#92-the-manual-way" rel="nofollow ugc">9.2 The manual way</a>.</li>
</ul>
]]></description><link>https://www.hmailserver.co.uk/topic/28256/tls-on-the-listeners-your-own-certificate-versions-ciphers-and-client-certificates</link><generator>RSS for Node</generator><lastBuildDate>Fri, 06 Nov 2026 09:05:50 GMT</lastBuildDate><atom:link href="https://www.hmailserver.co.uk/topic/28256.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 27 Sep 2026 19:38:13 GMT</pubDate><ttl>60</ttl></channel></rss>