<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Guard</title>
    <description>The latest articles on DEV Community by Guard (@guardilands).</description>
    <link>https://dev.to/guardilands</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4214025%2Fed6a1f58-2a02-409e-afab-9398d0d042a7.png</url>
      <title>DEV Community: Guard</title>
      <link>https://dev.to/guardilands</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/guardilands"/>
    <language>en</language>
    <item>
      <title>A revoked certificate is only revoked in the store that checks it</title>
      <dc:creator>Guard</dc:creator>
      <pubDate>Thu, 29 Oct 2026 00:07:09 +0000</pubDate>
      <link>https://dev.to/guardilands/a-revoked-certificate-is-only-revoked-in-the-store-that-checks-it-18jp</link>
      <guid>https://dev.to/guardilands/a-revoked-certificate-is-only-revoked-in-the-store-that-checks-it-18jp</guid>
      <description>&lt;p&gt;On 19 October 2026 Apple blocked twelve certificates. On 23 October it blocked one more: the emSign ECC Root CA - G3. Both actions were automatic for anything using Apple's security frameworks. Safari, Mail, and most apps: done, no action required.&lt;/p&gt;

&lt;p&gt;Terminal is a different story. Some tools that ship with macOS and the Xcode Command Line Tools do not read Apple's trust settings. They read a flat file, &lt;code&gt;/etc/ssl/cert.pem&lt;/code&gt;, and as of the week Apple published its advisory, that file had not been refreshed. Apple says so itself in support article 149555, and it says something worse in the same paragraph: those tools "don't check its block or whether the certificate was revoked."&lt;/p&gt;

&lt;p&gt;So the same laptop can show you two different answers about the same certificate, and both of them are correct answers to different questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part worth paying attention to
&lt;/h2&gt;

&lt;p&gt;While reading around this, I found two write-ups that contradict each other on a basic fact.&lt;/p&gt;

&lt;p&gt;One script author states that "macOS's built-in curl does not use the system trust store. It reads a flat file, &lt;code&gt;/etc/ssl/cert.pem&lt;/code&gt;, and does not check revocation."&lt;/p&gt;

&lt;p&gt;Another operator's notes on the same incident say: "On our Macs, &lt;code&gt;/usr/bin/curl&lt;/code&gt; and &lt;code&gt;/usr/bin/git&lt;/code&gt; still connected after this step, because they use Apple's trust settings."&lt;/p&gt;

&lt;p&gt;Both are describing &lt;code&gt;/usr/bin/curl&lt;/code&gt; on macOS in October 2026. One of them is wrong about the mechanism, or the mechanism differs by macOS version, or one of them is quietly running a Homebrew curl and reporting on the system one.&lt;/p&gt;

&lt;p&gt;This is not trivia. Everything downstream depends on it: whether removing the roots from the file actually protects you, whether a patched machine is patched, whether the update reverted your patch, and whether you can write "fixed" in your incident log.&lt;/p&gt;

&lt;h2&gt;
  
  
  A revocation is not a property of a certificate
&lt;/h2&gt;

&lt;p&gt;It is a property of a verifier. "Revoked" has no meaning until you name who is checking, against which store, with which rules, and how stale that store is.&lt;/p&gt;

&lt;p&gt;For this incident, at least four verifiers are in play on one Mac:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Apple's frameworks, using the keychain plus Apple's block list and online revocation. Fast, automatic, current.&lt;/li&gt;
&lt;li&gt;Tools compiled against the system LibreSSL that read &lt;code&gt;/etc/ssl/cert.pem&lt;/code&gt;. Flat file, no revocation checking. Staleness is whatever the last OS update left there.&lt;/li&gt;
&lt;li&gt;Homebrew's bundle at &lt;code&gt;/opt/homebrew/opt/ca-certificates&lt;/code&gt;. Updated by &lt;code&gt;brew&lt;/code&gt;, not by Apple.&lt;/li&gt;
&lt;li&gt;Whatever a particular language runtime bundles. Python's &lt;code&gt;certifi&lt;/code&gt; was affected here too and needed its own upgrade.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Four surfaces, four update paths, no shared clock. Apple's own remediation advice accounts for this. It tells administrators to remove the roots from &lt;code&gt;/etc/ssl/cert.pem&lt;/code&gt; manually, and then warns them that "a macOS software update can replace &lt;code&gt;/etc/ssl/cert.pem&lt;/code&gt; with Apple's version" and that they should re-run the check after every update.&lt;/p&gt;

&lt;p&gt;Read that again. The recommended workaround can be silently undone by an unrelated OS update, and the only notice you get is a file that quietly went back to its old contents.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a hand-patch does to your evidence
&lt;/h2&gt;

&lt;p&gt;When you edit that file by hand, you create a fork. Your machine's trust is now neither Apple's nor the default: it is an artifact of a specific edit, made on a specific day, by a specific person, and it will diverge again at the next update with no record of which state you are actually in.&lt;/p&gt;

&lt;p&gt;From the outside, two machines look identical. Both boot, both connect, both report a clean TLS handshake. One of them has Apple's fix, one has your patch, and one has your patch that an update already overwrote. The only way to tell them apart is to go look, on that machine, at that moment.&lt;/p&gt;

&lt;p&gt;So measure it instead of assuming it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Which store is this curl actually using?&lt;/span&gt;
/usr/bin/curl &lt;span class="nt"&gt;-v&lt;/span&gt; https://example.invalid 2&amp;gt;&amp;amp;1 | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"CAfile&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;CApath"&lt;/span&gt;

&lt;span class="c"&gt;# 2. Does the Apple frameworks path agree?&lt;/span&gt;
security verify-cert &lt;span class="nt"&gt;-c&lt;/span&gt; test.pem
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then check the file itself, and check whether it still matches what you think you installed. A hash plus a date is enough. If you roll this out through MDM, log the hash you pushed and re-check it after every OS update, because the update is the event that matters, not the patch.&lt;/p&gt;

&lt;p&gt;If instead you want one trust store whose update path you control, point the tools at Homebrew's bundle or a Mozilla bundle and set it once: &lt;code&gt;CURL_CA_BUNDLE&lt;/code&gt;, &lt;code&gt;GIT_SSL_CAINFO&lt;/code&gt;, &lt;code&gt;SSL_CERT_FILE&lt;/code&gt;. That trades Apple's latency for your own discipline, which is a real trade and not obviously the better one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rule I keep
&lt;/h2&gt;

&lt;p&gt;A warning has to name the verifier it speaks for, and its limits. "The certificate is revoked" is not a warning. It is a sentence with a subject missing.&lt;/p&gt;

&lt;p&gt;The sentence that survives contact with a real machine looks like: Apple's frameworks rejected this chain on 19 October, your curl still accepts it because it reads a 128-entry file last written by the OS build you installed in June, and the fix you applied by hand will be overwritten by the next update.&lt;/p&gt;

&lt;p&gt;Three clauses, all measurable, no assumptions about which store someone else's binary uses.&lt;/p&gt;

&lt;p&gt;The compromise was real. Eight intermediate CAs, six of them TLS, keys in the wind. But the incident is not over when the vendor blocks it. It is over when you can say which of your verifiers knows that.&lt;/p&gt;

</description>
      <category>security</category>
      <category>macos</category>
      <category>devops</category>
      <category>tls</category>
    </item>
  </channel>
</rss>
