<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Tls on inetshell</title><link>https://inet.sh/en/tags/tls/</link><description>Recent content in Tls on inetshell</description><generator>Hugo</generator><language>en</language><lastBuildDate>Sat, 26 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://inet.sh/en/tags/tls/index.xml" rel="self" type="application/rss+xml"/><item><title>Google-managed certificate that never gets issued: CAA (pki.goog, letsencrypt.org), FAILED_NOT_VISIBLE and the right order</title><link>https://inet.sh/en/posts/gcp/google-managed-certificate-caa/</link><pubDate>Sat, 26 Sep 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/en/posts/gcp/google-managed-certificate-caa/</guid><description>The Google-managed certificate for an HTTPS load balancer sits in PROVISIONING for hours or drops to FAILED_NOT_VISIBLE or FAILED_CAA_FORBIDDEN. The three causes: DNS does not point to the load balancer IP yet, the certificate is not attached to a target proxy, or a CAA record in the zone does not authorize pki.goog or letsencrypt.org. How to check the status with gcloud, the correct CAA, and Certificate Manager with DNS authorization to issue before switching DNS.</description><content:encoded><![CDATA[<h2 id="tldr">TL;DR</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">example.com.   CAA 0 issue &#34;pki.goog&#34;
</span></span><span class="line"><span class="cl">example.com.   CAA 0 issue &#34;letsencrypt.org&#34;
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">gcloud compute ssl-certificates describe web-cert --global --format<span class="o">=</span><span class="s1">&#39;yaml(managed)&#39;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># managed:</span>
</span></span><span class="line"><span class="cl"><span class="c1">#   domainStatus:</span>
</span></span><span class="line"><span class="cl"><span class="c1">#     www.example.com: PROVISIONING | ACTIVE | FAILED_NOT_VISIBLE | FAILED_CAA_FORBIDDEN | FAILED_CAA_CHECKING | FAILED_RATE_LIMITED</span>
</span></span><span class="line"><span class="cl"><span class="c1">#   status: PROVISIONING | ACTIVE</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>To reach <code>ACTIVE</code> three things must hold at once: the domain&rsquo;s <strong>A/AAAA</strong> points to the load balancer IP (and nothing else), the certificate is <strong>attached to a target proxy</strong> with its forwarding rule, and no <strong>CAA</strong> in the zone forbids Google&rsquo;s CAs. Then, up to <strong>60 minutes</strong>.</p>
<h2 id="why">Why</h2>
<p>Google issues managed certificates through <strong>Google Trust Services</strong> (<code>pki.goog</code>) or <strong>Let&rsquo;s Encrypt</strong>, and picks one or the other on each issuance or renewal. To validate the domain it runs an HTTP check against the IP the name resolves to, so until DNS points at the load balancer there is nothing to validate. And like any CA, it honors <strong>CAA</strong> records: if your zone says only <code>digicert.com</code> may issue (a typical corporate policy), Google cannot.</p>
<p>The statuses tell the story:</p>
<table>
  <thead>
      <tr>
          <th><code>domainStatus</code></th>
          <th>Cause</th>
          <th>What to do</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>PROVISIONING</code></td>
          <td>In progress</td>
          <td>Wait; past 60 minutes, check the items below</td>
      </tr>
      <tr>
          <td><code>FAILED_NOT_VISIBLE</code></td>
          <td>The name does not resolve to the load balancer IP, or the certificate is not attached to a target proxy</td>
          <td>Fix A/AAAA, attach the certificate, wait for propagation</td>
      </tr>
      <tr>
          <td><code>FAILED_CAA_CHECKING</code></td>
          <td>Google could not read the CAA records (unresponsive DNS, broken DNSSEC)</td>
          <td>Fix the zone</td>
      </tr>
      <tr>
          <td><code>FAILED_CAA_FORBIDDEN</code></td>
          <td>There is a CAA and it includes neither <code>pki.goog</code> nor <code>letsencrypt.org</code></td>
          <td>Add both records</td>
      </tr>
      <tr>
          <td><code>FAILED_RATE_LIMITED</code></td>
          <td>Too many issuance attempts</td>
          <td>Wait; do not recreate the certificate in a loop</td>
      </tr>
  </tbody>
</table>
<h2 id="the-right-caa">The right CAA</h2>
<p>With no CAA record at all, any CA may issue and Google works. If you have CAA (or your organization requires it), add <strong>both</strong> CAs:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">example.com.   CAA 0 issue &#34;pki.goog&#34;
</span></span><span class="line"><span class="cl">example.com.   CAA 0 issue &#34;letsencrypt.org&#34;
</span></span></code></pre></td></tr></table>
</div>
</div><p>Listing only one forces Google to always use that one; the documentation advises against it because a renewal may come out through the other. CAA records inherit downwards: a CAA on <code>example.com</code> covers <code>www.example.com</code> if the subdomain has none of its own.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">dig +short CAA example.com
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="certificate-manager-issue-before-switching-dns">Certificate Manager: issue before switching DNS</h2>
<p>With classic certificates (<code>compute ssl-certificates</code>) the domain must already point at the load balancer, which during a migration means a few minutes of broken HTTPS. <strong>Certificate Manager</strong> solves that with <strong>DNS authorization</strong>: you publish a validation CNAME and Google issues the certificate while traffic still flows to the old site.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">gcloud certificate-manager dns-authorizations create www-auth --domain<span class="o">=</span>www.example.com
</span></span><span class="line"><span class="cl">gcloud certificate-manager dns-authorizations describe www-auth --format<span class="o">=</span><span class="s1">&#39;yaml(dnsResourceRecord)&#39;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># dnsResourceRecord: name: _acme-challenge.www.example.com. type: CNAME data: xxxx.authorize.certificatemanager.goog.</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># publish that CNAME in your zone and then:</span>
</span></span><span class="line"><span class="cl">gcloud certificate-manager certificates create www-cert <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  --domains<span class="o">=</span>www.example.com --dns-authorizations<span class="o">=</span>www-auth
</span></span><span class="line"><span class="cl">gcloud certificate-manager maps create web-map
</span></span><span class="line"><span class="cl">gcloud certificate-manager maps entries create www --map<span class="o">=</span>web-map --certificate<span class="o">=</span>www-cert --hostname<span class="o">=</span>www.example.com
</span></span><span class="line"><span class="cl">gcloud compute target-https-proxies update web-proxy --certificate-map<span class="o">=</span>web-map
</span></span></code></pre></td></tr></table>
</div>
</div><p>Once the certificate is <code>ACTIVE</code>, you flip the A/AAAA and the cutover is zero. CAA applies the same way.</p>
<h2 id="traps">Traps</h2>
<ul>
<li><strong>Cloudflare or another proxy in front</strong> of the load balancer: the A record points at the proxy, not at Google, and validation fails with <code>FAILED_NOT_VISIBLE</code>. Grey cloud during issuance, or Certificate Manager with DNS authorization.</li>
<li><strong>A managed certificate attached to nothing never gets issued.</strong> Creating it and waiting does nothing; attach it to the target proxy first.</li>
<li><strong>Changing the domain list</strong> creates a new certificate: attach the new one, wait for <code>ACTIVE</code>, and only then remove the old one from the proxy, or you get a gap.</li>
<li><strong>Wildcards</strong> only with Certificate Manager and DNS authorization; classic managed certificates do not support them.</li>
<li><strong>Badly signed DNSSEC</strong> breaks CAA lookups: <code>FAILED_CAA_CHECKING</code> even when you have no CAA at all.</li>
</ul>
<p>Reference: <a href="https://docs.cloud.google.com/load-balancing/docs/ssl-certificates/google-managed-certs">Google-managed SSL certificates</a> and <a href="https://docs.cloud.google.com/certificate-manager/docs/overview">Certificate Manager</a> in the Google Cloud documentation.</p>
]]></content:encoded></item><item><title>iLO 2/3 and ERR_SSL_VERSION_OR_CIPHER_MISMATCH: opening the web UI from a modern browser</title><link>https://inet.sh/en/posts/ilo/err-ssl-version-or-cipher-mismatch/</link><pubDate>Fri, 25 Sep 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/en/posts/ilo/err-ssl-version-or-cipher-mismatch/</guid><description>Chrome and Edge show ERR_SSL_VERSION_OR_CIPHER_MISMATCH on HP iLO 2 and iLO 3 because they only speak TLS 1.0/1.1 and HPE will not add TLS 1.2. How to get in anyway: Firefox with security.tls.version.enable-deprecated in a separate profile, Edge in IE mode, and enforcing AES over SSH.</description><content:encoded><![CDATA[<h2 id="tldr">TL;DR</h2>
<p>Chrome and Edge no longer negotiate TLS 1.0/1.1 and there is no flag to bring them back. iLO 2 (TLS 1.0) and iLO 3 (TLS 1.1 at most) will never move to TLS 1.2. What works today:</p>
<ol>
<li><strong>Firefox</strong>, in a separate profile: <code>about:config</code> → <code>security.tls.version.enable-deprecated</code> = <code>true</code>.</li>
<li><strong>Edge in Internet Explorer mode</strong> (Windows).</li>
<li><strong>SSH into the iLO</strong> for anything that does not need the UI, and enforce AES while you are there:</li>
</ol>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">ssh -o <span class="nv">HostKeyAlgorithms</span><span class="o">=</span>+ssh-rsa -o <span class="nv">KexAlgorithms</span><span class="o">=</span>+diffie-hellman-group14-sha1 -c aes256-cbc Administrator@&lt;ilo-ip&gt;
</span></span><span class="line"><span class="cl"><span class="nb">set</span> /map1/config1 <span class="nv">oemhp_enforce_aes</span><span class="o">=</span>yes
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="why-it-happens">Why it happens</h2>
<table>
  <thead>
      <tr>
          <th>iLO</th>
          <th>Last firmware</th>
          <th>Max TLS</th>
          <th>Ciphers it offers</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>iLO 2</td>
          <td>2.33 (2018-03)</td>
          <td>1.0</td>
          <td>RC4-SHA, 3DES-SHA; AES-CBC if you enforce AES</td>
      </tr>
      <tr>
          <td>iLO 3</td>
          <td>1.94.2 (2020-12)</td>
          <td>1.1</td>
          <td>AES-128-CBC-SHA (DHE), 3DES</td>
      </tr>
  </tbody>
</table>
<p>HPE put it in writing: <a href="https://support.hpe.com/hpesc/public/docDisplay?docId=a00100228en_us&amp;docLocale=en_US">TLS 1.2 is not supported on iLO 3 and will not be added</a> because the G7 line is out of support. iLO 2 (G6 and earlier) is worse: TLS 1.0 and nothing else.</p>
<p>On the browser side:</p>
<ul>
<li><strong>Chrome and Edge</strong> removed TLS 1.0/1.1 in 2020 (Chrome 84) and the <code>SSLVersionMin</code> policy that could re-enable them in 2022 (Chrome 98). Against an old iLO that shows up as <code>ERR_SSL_VERSION_OR_CIPHER_MISMATCH</code>.</li>
<li><strong>Firefox</strong> disabled them in 78 (2020) but kept the preference. Since 93 it also turns off 3DES, <a href="https://blog.mozilla.org/security/2021/10/05/securing-connections-disabling-3des-in-firefox-93/">unless deprecated TLS is enabled</a>. RC4 was removed in 44 (2016) and is not coming back. The usual error is <code>SSL_ERROR_UNSUPPORTED_VERSION</code> or <code>SSL_ERROR_NO_CYPHER_OVERLAP</code>.</li>
</ul>
<p>The <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1880709">bug to remove those Firefox preferences</a> is still open, so as of today (September 2026) this route still works.</p>
<h2 id="option-1-firefox-with-deprecated-tls-in-a-separate-profile">Option 1: Firefox with deprecated TLS, in a separate profile</h2>
<p>Do not weaken your daily browser. Create a profile just for management:</p>
<ol>
<li><code>about:profiles</code> → <strong>Create a New Profile</strong> → name it <code>ilo</code> → <strong>Launch profile in new browser</strong>.</li>
<li>In that profile, <code>about:config</code> → search <code>security.tls.version.enable-deprecated</code> → <code>true</code>.</li>
<li>Open <code>https://&lt;ilo-ip&gt;/</code> and accept the self-signed certificate.</li>
<li>If it still will not negotiate, <code>security.tls.version.min</code> → <code>1</code> (TLS 1.0, iLO 2) or <code>2</code> (TLS 1.1, iLO 3).</li>
</ol>
<p>When Firefox hits a TLS 1.0 site, the error page shows an <strong>Enable TLS 1.0 and 1.1</strong> button that flips the same preference. Old recipes touched four prefs (<code>fallback-limit</code>, <code>min</code>, <code>max</code>, <code>enable-deprecated</code>); on current Firefox <code>enable-deprecated</code> is enough and <code>min</code> is the fallback.</p>
<p>To launch that profile later:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">firefox -P ilo --no-remote
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="option-2-edge-in-internet-explorer-mode">Option 2: Edge in Internet Explorer mode</h2>
<p>Windows only. IE mode uses the Trident engine and the system&rsquo;s Schannel, which still keeps TLS 1.0/1.1.</p>
<ol>
<li><code>edge://settings/defaultBrowser</code> → <strong>Allow sites to be reloaded in Internet Explorer mode</strong> → <strong>Allow</strong> → restart Edge.</li>
<li>Open the iLO URL → <strong>⋯</strong> menu → <strong>Reload in Internet Explorer mode</strong>.</li>
<li>Edge remembers the page in IE mode for 30 days; add it to the IE mode pages list so it does not forget.</li>
</ol>
<p>On Windows 11 24H2 and later TLS 1.0/1.1 are also off in Schannel: if IE mode still fails, enable them under <strong>Internet Options → Advanced → Use TLS 1.0 / 1.1</strong> while you work on the iLO, and turn them off afterwards.</p>
<h2 id="option-3-from-the-ilo-itself-over-ssh">Option 3: from the iLO itself over SSH</h2>
<p>SSH into the iLO still works from any OpenSSH if you ask for the old algorithms (details in <a href="/en/posts/linux/ssh-no-matching-host-key-type-found/">SSH to legacy hosts</a>):</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">ssh -o <span class="nv">HostKeyAlgorithms</span><span class="o">=</span>+ssh-rsa <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    -o <span class="nv">KexAlgorithms</span><span class="o">=</span>+diffie-hellman-group14-sha1 <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    -c aes256-cbc <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    Administrator@&lt;ilo-ip&gt;
</span></span></code></pre></td></tr></table>
</div>
</div><p>Inside, two settings that help the web side:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># Offer AES instead of RC4/3DES (UI: Administration → Security → Encryption → Enforce AES/3DES Encryption)</span>
</span></span><span class="line"><span class="cl"><span class="nb">set</span> /map1/config1 <span class="nv">oemhp_enforce_aes</span><span class="o">=</span>yes
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># New certificate (expired, hostname changed): delete the current one; the iLO resets and generates a new self-signed cert</span>
</span></span><span class="line"><span class="cl">delete /map1/sslcert1
</span></span></code></pre></td></tr></table>
</div>
</div><p>Enforcing AES does <strong>not</strong> fix the error by itself: the problem is the TLS version, not only the cipher. What it buys you is that, once TLS 1.0/1.1 is enabled in the browser, the session uses AES-CBC and does not depend on 3DES (which Firefox only allows in deprecated mode) or RC4 (gone from every browser).</p>
<p>And for power, virtual media, users, and firmware you do not need the UI at all: <a href="/en/posts/ilo/cli-commands/">iLO CLI commands</a>.</p>
<h2 id="what-does-not-help">What does not help</h2>
<ul>
<li><strong>Updating the firmware</strong> on iLO 2/3 does not raise the TLS ceiling; just make sure you are on the last release (2.33 / 1.94.2) for the rest of the fixes. See <a href="/en/posts/ilo/upgrade-firmware-ssh/">upgrade firmware over SSH</a>.</li>
<li><strong>Chrome/Edge flags</strong>: none exist for TLS 1.0/1.1 since 2022.</li>
<li><strong>An old Chrome or a Windows 7 VM with IE11</strong> works, but it is worse than a Firefox profile: an unpatched OS plus an unpatched browser to open a management interface.</li>
</ul>
<h2 id="if-it-is-an-ilo-4">If it is an iLO 4</h2>
<p>iLO 4 with 2.x firmware negotiates TLS 1.2 and does not have this problem. If an iLO 4 gives you <code>ERR_SSL_VERSION_OR_CIPHER_MISMATCH</code>, it is on 1.x firmware: update it (2.8x is the final branch) and the browser gets in with no tricks.</p>
<h2 id="see-also">See also</h2>
<ul>
<li><a href="/en/posts/linux/ssh-no-matching-host-key-type-found/">SSH: &ldquo;no matching host key type found&rdquo;</a> — the same iLO 2/3 also break a modern SSH client.</li>
<li><a href="/en/posts/windows/modern-browser-xp-2003/">Browsing the modern web on XP and 2003</a> — the mirror case: old OS against the new web.</li>
<li>External reference: <a href="https://supertekboy.com/2021/11/19/accessing-hpe-ilo-3-fails-with-err-ssl-version-or-cipher-mismatch/">HPe iLO 3 fails with ERR_SSL_VERSION_OR_CIPHER_MISMATCH</a>.</li>
</ul>
]]></content:encoded></item></channel></rss>