<?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: Mohamed Alkiswani</title>
    <description>The latest articles on DEV Community by Mohamed Alkiswani (@oya-browser).</description>
    <link>https://dev.to/oya-browser</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%2F4211751%2F9bef722c-a1ed-4eb1-baa2-3158666e7477.jpg</url>
      <title>DEV Community: Mohamed Alkiswani</title>
      <link>https://dev.to/oya-browser</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/oya-browser"/>
    <language>en</language>
    <item>
      <title>What a from-scratch browser actually trusts: webpki-roots, exact pins, and the eMudhra week</title>
      <dc:creator>Mohamed Alkiswani</dc:creator>
      <pubDate>Wed, 28 Oct 2026 18:59:07 +0000</pubDate>
      <link>https://dev.to/oya-browser/what-a-from-scratch-browser-actually-trusts-webpki-roots-exact-pins-and-the-emudhra-week-2plk</link>
      <guid>https://dev.to/oya-browser/what-a-from-scratch-browser-actually-trusts-webpki-roots-exact-pins-and-the-emudhra-week-2plk</guid>
      <description>&lt;p&gt;We're writing a browser from scratch in Rust. It's called Mars: own HTML parser and layout engine, own JS engine, own HTTP framing on top of rustls, native macOS shell. When you own the network stack you also own the question Apple is getting shouted at about this week: which certificate authorities does the thing trust, and who updates that list?&lt;/p&gt;

&lt;h2&gt;
  
  
  How Mars gets its roots
&lt;/h2&gt;

&lt;p&gt;Our network crate, Relay, builds a rustls &lt;code&gt;RootCertStore&lt;/code&gt; from &lt;code&gt;webpki_roots::TLS_SERVER_ROOTS&lt;/code&gt; once at startup and keeps it in a &lt;code&gt;OnceLock&lt;/code&gt;. That's it. No OS keychain, no &lt;code&gt;/etc/ssl/cert.pem&lt;/code&gt;, no runtime download. The trust anchors are whatever the &lt;code&gt;webpki-roots&lt;/code&gt; crate contained the day the lockfile was written. That's a normal choice for rustls users, and it has one property worth saying out loud: the trust store ships inside the binary, so it only changes when you rebuild.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I found today
&lt;/h2&gt;

&lt;p&gt;The eMudhra / emSign compromise is around ten days old. Mozilla, Google, Microsoft and most Linux distros dropped the roots within days. Apple blocked the certificates in Safari and Mail but left the macOS command line tools reading a cert.pem that still trusts them, which is why Hacker News is on fire.&lt;/p&gt;

&lt;p&gt;In that thread someone asked whether there's a Rust crate that compiles root certs into binaries. There is, and we use it. So I checked. Both crates that do TLS in Mars pinned &lt;code&gt;webpki-roots = "=1.0.9"&lt;/code&gt;, released July 18. Grepping &lt;code&gt;src/lib.rs&lt;/code&gt; in each release:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1.0.9 (Jul 18): emSign Root CA - G1, emSign Root CA - C1, emSign ECC Root CA - G3, emSign ECC Root CA - C3&lt;/li&gt;
&lt;li&gt;1.0.10 (Oct 19): removed emSign ECC Root CA - G3&lt;/li&gt;
&lt;li&gt;1.0.11 (Oct 23): removed emSign Root CA - C1 and emSign ECC Root CA - C3, tracking the CCADB removals&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So Mars, as of this morning, had the same hole as &lt;code&gt;/usr/bin/curl&lt;/code&gt; on a Mac. Nothing at runtime would have told us. rustls does no revocation checking unless you hand it CRLs, and we don't. There is no blocklist. The bundle is the whole story.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix and the lesson
&lt;/h2&gt;

&lt;p&gt;The fix took four minutes: bump both pins to &lt;code&gt;=1.0.11&lt;/code&gt;, &lt;code&gt;cargo update -p webpki-roots&lt;/code&gt;, &lt;code&gt;cargo check&lt;/code&gt;. It compiles and it's in the tree.&lt;/p&gt;

&lt;p&gt;The lesson is the uncomfortable one. Mars pins dependencies to exact versions, and an exact pin on a root bundle is a decision to stop receiving CA removals. It means someone has to watch that crate's releases the way an OS vendor watches the CCADB. For a browser that isn't optional, so it goes on the release checklist. I'd like to know how other rustls users handle it: Dependabot on that one crate, a CI job that diffs root names between versions, or just reading the release notes.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/OyadotAI/oya-browser" rel="noopener noreferrer"&gt;https://github.com/OyadotAI/oya-browser&lt;/a&gt;, folder &lt;code&gt;mars/&lt;/code&gt;. Source-available under a Sustainable Use License, SDK and CLI MIT.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>security</category>
      <category>browsers</category>
    </item>
  </channel>
</rss>
