<?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: Håkan Fägnell</title>
    <description>The latest articles on DEV Community by Håkan Fägnell (@hkan_fgnell_322b4aba3d6).</description>
    <link>https://dev.to/hkan_fgnell_322b4aba3d6</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%2F4006570%2F4c0347f7-187a-4a19-8b8f-b0ea6540060a.jpg</url>
      <title>DEV Community: Håkan Fägnell</title>
      <link>https://dev.to/hkan_fgnell_322b4aba3d6</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hkan_fgnell_322b4aba3d6"/>
    <language>en</language>
    <item>
      <title>X-Frame-Options: How It Works and How to Set It | FortifyNet</title>
      <dc:creator>Håkan Fägnell</dc:creator>
      <pubDate>Wed, 19 Aug 2026 04:45:29 +0000</pubDate>
      <link>https://dev.to/hkan_fgnell_322b4aba3d6/x-frame-options-how-it-works-and-how-to-set-it-fortifynet-4oao</link>
      <guid>https://dev.to/hkan_fgnell_322b4aba3d6/x-frame-options-how-it-works-and-how-to-set-it-fortifynet-4oao</guid>
      <description>&lt;h1&gt;
  
  
  X-Frame-Options: What It Does and How to Configure It Right
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;X-Frame-Options is an HTTP response header that tells the browser whether your page may be rendered inside a frame or iframe on another site.&lt;/strong&gt; It has exactly two valid values: &lt;code&gt;DENY&lt;/code&gt; (no framing at all) and &lt;code&gt;SAMEORIGIN&lt;/code&gt; (framing allowed only from your own origin). Its purpose is to stop clickjacking, an attack where your site is loaded invisibly inside an attacker's page and your visitors are tricked into clicking things they cannot see. The modern replacement is the Content-Security-Policy directive &lt;code&gt;frame-ancestors&lt;/code&gt;, and the 2026 best practice is to send both headers. This guide covers the correct setup for every major server, plus the mistakes that silently disable the protection.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the X-Frame-Options header does
&lt;/h2&gt;

&lt;p&gt;When a browser loads a page that another document has embedded through &lt;code&gt;&amp;lt;iframe&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;frame&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;embed&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;object&amp;gt;&lt;/code&gt;, it checks the response headers of the embedded page before rendering it. If the response carries &lt;code&gt;X-Frame-Options: DENY&lt;/code&gt;, the browser refuses to draw the page inside the embedding document. With &lt;code&gt;SAMEORIGIN&lt;/code&gt;, it renders the page only if the embedding chain comes from the same origin (same scheme, host and port). Modern browsers evaluate the entire chain of ancestor frames, not just the top window.&lt;/p&gt;

&lt;p&gt;The header was formalized in &lt;a href="https://www.rfc-editor.org/rfc/rfc7034" rel="noopener noreferrer"&gt;RFC 7034&lt;/a&gt; in October 2013, after browsers had already shipped it. It remains one of the most widely deployed security headers: the &lt;a href="https://almanac.httparchive.org/en/2025/security" rel="noopener noreferrer"&gt;HTTP Archive Web Almanac 2025 security chapter&lt;/a&gt; measures X-Frame-Options on roughly 35% of mobile sites, making it a top three security header behind X-Content-Type-Options (close to 50%).&lt;/p&gt;

&lt;h2&gt;
  
  
  Clickjacking in 60 seconds
&lt;/h2&gt;

&lt;p&gt;Clickjacking was named by security researchers Robert Hansen and Jeremiah Grossman in 2008. The attack is simple: an attacker's page loads your site in an iframe, makes the iframe fully transparent with CSS, and positions it over harmless looking buttons. The visitor believes they are clicking "Play video", but the click actually lands on your site's "Delete account", "Confirm payment" or "Authorize app" button, using the victim's logged-in session. &lt;a href="https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html" rel="noopener noreferrer"&gt;OWASP&lt;/a&gt; documents variants ranging from Facebook "likejacking" to hijacked one-click purchases.&lt;/p&gt;

&lt;p&gt;Framing control is the defense. If the browser refuses to render your page inside an attacker's frame, the overlay trick collapses.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1555066931-4365d14bab8c%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1600%26q%3D80" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1555066931-4365d14bab8c%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1600%26q%3D80" alt="Developer reviewing web server configuration code on a laptop screen" width="1600" height="1067"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The two valid values, and the ones to avoid
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Effect&lt;/th&gt;
&lt;th&gt;Status in 2026&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DENY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No site may frame the page, including your own&lt;/td&gt;
&lt;td&gt;Valid, supported by all browsers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SAMEORIGIN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Only pages from the same origin may frame it&lt;/td&gt;
&lt;td&gt;Valid, supported by all browsers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ALLOW-FROM uri&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Was meant to allow one named origin&lt;/td&gt;
&lt;td&gt;Obsolete: Firefox removed it in version 70 (October 2019), Chrome and Safari never supported it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ALLOWALL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Never part of any spec&lt;/td&gt;
&lt;td&gt;Invalid: browsers ignore the header entirely, leaving no protection&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The dangerous part is how browsers handle invalid values: they ignore the whole header. A site sending &lt;code&gt;ALLOW-FROM&lt;/code&gt; or &lt;code&gt;ALLOWALL&lt;/code&gt; believes it is protected while browsers treat it as if no header were set. As the Web Almanac 2025 puts it, these values "may have been set by developers expecting protections to be active due to them setting the header."&lt;/p&gt;

&lt;h2&gt;
  
  
  What real-world data shows
&lt;/h2&gt;

&lt;p&gt;Across millions of sites measured by HTTP Archive in 2025, the header's values break down like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fquickchart.io%2Fchart%3Fw%3D700%26h%3D380%26bkg%3Dwhite%26c%3D%257B%2522type%2522%253A%2522bar%2522%252C%2522data%2522%253A%257B%2522labels%2522%253A%255B%2522SAMEORIGIN%2522%252C%2522DENY%2522%252C%2522ALLOWALL%2520%2528invalid%2529%2522%252C%2522Other%252Finvalid%2522%255D%252C%2522datasets%2522%253A%255B%257B%2522data%2522%253A%255B72.1%252C24.6%252C0.7%252C2.5%255D%252C%2522backgroundColor%2522%253A%255B%2522%25232563eb%2522%252C%2522%252316a34a%2522%252C%2522%2523dc2626%2522%252C%2522%25239ca3af%2522%255D%257D%255D%257D%252C%2522options%2522%253A%257B%2522plugins%2522%253A%257B%2522legend%2522%253A%257B%2522display%2522%253Afalse%257D%252C%2522title%2522%253A%257B%2522display%2522%253Atrue%252C%2522text%2522%253A%2522X-Frame-Options%2520values%2520across%2520the%2520web%252C%25202025%2520%2528%2525%2520of%2520XFO%2520headers%252C%2520mobile%2529%2522%257D%257D%252C%2522scales%2522%253A%257B%2522y%2522%253A%257B%2522beginAtZero%2522%253Atrue%252C%2522max%2522%253A80%257D%257D%257D%257D" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fquickchart.io%2Fchart%3Fw%3D700%26h%3D380%26bkg%3Dwhite%26c%3D%257B%2522type%2522%253A%2522bar%2522%252C%2522data%2522%253A%257B%2522labels%2522%253A%255B%2522SAMEORIGIN%2522%252C%2522DENY%2522%252C%2522ALLOWALL%2520%2528invalid%2529%2522%252C%2522Other%252Finvalid%2522%255D%252C%2522datasets%2522%253A%255B%257B%2522data%2522%253A%255B72.1%252C24.6%252C0.7%252C2.5%255D%252C%2522backgroundColor%2522%253A%255B%2522%25232563eb%2522%252C%2522%252316a34a%2522%252C%2522%2523dc2626%2522%252C%2522%25239ca3af%2522%255D%257D%255D%257D%252C%2522options%2522%253A%257B%2522plugins%2522%253A%257B%2522legend%2522%253A%257B%2522display%2522%253Afalse%257D%252C%2522title%2522%253A%257B%2522display%2522%253Atrue%252C%2522text%2522%253A%2522X-Frame-Options%2520values%2520across%2520the%2520web%252C%25202025%2520%2528%2525%2520of%2520XFO%2520headers%252C%2520mobile%2529%2522%257D%257D%252C%2522scales%2522%253A%257B%2522y%2522%253A%257B%2522beginAtZero%2522%253Atrue%252C%2522max%2522%253A80%257D%257D%257D%257D" alt="Bar chart showing the distribution of X-Frame-Options values on mobile sites in 2025: SAMEORIGIN 72.1 percent, DENY 24.6 percent, ALLOWALL 0.7 percent, other or invalid values 2.5 percent" width="1400" height="760"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Source: HTTP Archive Web Almanac 2025, security chapter, figure 9.30 (mobile dataset).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;About 72.1% of sites that send the header choose &lt;code&gt;SAMEORIGIN&lt;/code&gt; and 24.6% choose &lt;code&gt;DENY&lt;/code&gt;. Roughly 3% send values that do nothing, which on the scale of the web is hundreds of thousands of sites with imaginary protection. Checking what your server actually sends takes less than a minute.&lt;/p&gt;

&lt;h2&gt;
  
  
  X-Frame-Options vs CSP frame-ancestors
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://www.w3.org/TR/CSP2/" rel="noopener noreferrer"&gt;W3C Content Security Policy Level 2 specification&lt;/a&gt; (a W3C Recommendation since December 2016) introduced the &lt;code&gt;frame-ancestors&lt;/code&gt; directive and formally obsoleted X-Frame-Options. Where XFO is a blunt on/off switch, &lt;code&gt;frame-ancestors&lt;/code&gt; is a full allowlist:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;X-Frame-Options&lt;/th&gt;
&lt;th&gt;CSP frame-ancestors&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Block all framing&lt;/td&gt;
&lt;td&gt;&lt;code&gt;DENY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;frame-ancestors 'none'&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Allow own origin only&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SAMEORIGIN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;frame-ancestors 'self'&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Allow named partner origins&lt;/td&gt;
&lt;td&gt;Not possible (ALLOW-FROM is dead)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;frame-ancestors 'self' https://partner.example.com&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wildcard subdomains&lt;/td&gt;
&lt;td&gt;Not possible&lt;/td&gt;
&lt;td&gt;&lt;code&gt;frame-ancestors https://*.example.com&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spec status&lt;/td&gt;
&lt;td&gt;Informational RFC 7034 (2013), obsoleted&lt;/td&gt;
&lt;td&gt;W3C CSP Level 2 (2016), current standard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;When both headers are present&lt;/td&gt;
&lt;td&gt;Ignored by CSP2-capable browsers&lt;/td&gt;
&lt;td&gt;Takes precedence&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two details worth knowing. First, &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Content-Security-Policy/frame-ancestors" rel="noopener noreferrer"&gt;MDN&lt;/a&gt; notes that &lt;code&gt;frame-ancestors&lt;/code&gt; does not inherit from &lt;code&gt;default-src&lt;/code&gt;: a policy of &lt;code&gt;default-src 'none'&lt;/code&gt; still allows anyone to frame the page, so you must declare the directive explicitly. Second, all current versions of Chrome, Edge, Firefox and Safari support &lt;code&gt;frame-ancestors&lt;/code&gt;, so the only reason to keep sending X-Frame-Options is defense in depth for very old clients. That costs one line, so keep it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to configure it on your server
&lt;/h2&gt;

&lt;p&gt;Send the header on every HTML response, exactly once. The examples below set &lt;code&gt;SAMEORIGIN&lt;/code&gt; plus the equivalent CSP directive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;nginx&lt;/strong&gt; (inside &lt;code&gt;server&lt;/code&gt; or &lt;code&gt;location&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;X-Frame-Options&lt;/span&gt; &lt;span class="s"&gt;"SAMEORIGIN"&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Content-Security-Policy&lt;/span&gt; &lt;span class="s"&gt;"frame-ancestors&lt;/span&gt; &lt;span class="s"&gt;'self'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="k"&gt;"&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Apache 2.4&lt;/strong&gt; (httpd.conf or .htaccess, mod_headers enabled):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight apache"&gt;&lt;code&gt;&lt;span class="nc"&gt;Header&lt;/span&gt; &lt;span class="ss"&gt;always&lt;/span&gt; &lt;span class="ss"&gt;set&lt;/span&gt; X-Frame-Options "SAMEORIGIN"
&lt;span class="nc"&gt;Header&lt;/span&gt; &lt;span class="ss"&gt;always&lt;/span&gt; &lt;span class="ss"&gt;set&lt;/span&gt; Content-Security-Policy "frame-ancestors 'self';"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;IIS&lt;/strong&gt; (web.config):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;system.webServer&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;httpProtocol&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;customHeaders&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;add&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"X-Frame-Options"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"SAMEORIGIN"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;add&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Content-Security-Policy"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"frame-ancestors 'self';"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/customHeaders&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/httpProtocol&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/system.webServer&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Node.js with Express and Helmet:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;helmet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;helmet&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;helmet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;frameguard&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;sameorigin&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;helmet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;contentSecurityPolicy&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;directives&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;frameAncestors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;'self'&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Behind a CDN such as Cloudflare you can also inject both headers with a response header transform rule, which is useful when you cannot touch the origin server. If a partner site legitimately needs to embed you, keep XFO at &lt;code&gt;SAMEORIGIN&lt;/code&gt; and express the allowlist in CSP: &lt;code&gt;frame-ancestors 'self' https://partner.example.com&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistakes that silently disable the protection
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Using ALLOW-FROM in 2026.&lt;/strong&gt; Every current browser ignores it, and with it the whole header.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Setting the header in a meta tag.&lt;/strong&gt; &lt;code&gt;X-Frame-Options&lt;/code&gt; only works as an HTTP header, and &lt;code&gt;frame-ancestors&lt;/code&gt; is explicitly forbidden inside &lt;code&gt;&amp;lt;meta http-equiv="Content-Security-Policy"&amp;gt;&lt;/code&gt;. Both must come from the server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sending the header twice.&lt;/strong&gt; Duplicate or comma-joined values such as &lt;code&gt;SAMEORIGIN, SAMEORIGIN&lt;/code&gt; (0.28% of sites in the Almanac 2025 data) can be rejected as invalid. Set it in one place only, either the app or the web server, not both.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Using DENY on pages you embed yourself.&lt;/strong&gt; If your own checkout, widget or preview runs in an iframe, &lt;code&gt;DENY&lt;/code&gt; breaks it. Use &lt;code&gt;SAMEORIGIN&lt;/code&gt; or an explicit &lt;code&gt;frame-ancestors&lt;/code&gt; allowlist.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assuming default-src covers framing.&lt;/strong&gt; It does not. Declare &lt;code&gt;frame-ancestors&lt;/code&gt; explicitly.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to test your configuration
&lt;/h2&gt;

&lt;p&gt;Open your browser's developer tools, load your page, and inspect the response headers on the main document: you should see exactly one &lt;code&gt;X-Frame-Options&lt;/code&gt; and a &lt;code&gt;Content-Security-Policy&lt;/code&gt; containing &lt;code&gt;frame-ancestors&lt;/code&gt;. For the full picture, the free &lt;a href="https://fortifynet.com" rel="noopener noreferrer"&gt;FortifyNet scan&lt;/a&gt; checks your framing protection together with the rest of your security header set, SSL/TLS, DNS and email authentication in about 60 seconds, and tells you exactly which header to add where. No signup needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related guides
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fortifynet.com/blog/http-security-headers-guide" rel="noopener noreferrer"&gt;HTTP Security Headers: The Complete Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fortifynet.com/blog/what-is-hsts" rel="noopener noreferrer"&gt;What Is HSTS? HTTP Strict Transport Security Explained&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fortifynet.com/blog/website-security-checklist" rel="noopener noreferrer"&gt;Website Security Checklist: 12 Essential Steps&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is X-Frame-Options deprecated?&lt;/strong&gt;&lt;br&gt;
Formally yes: W3C CSP Level 2 obsoleted it in favor of &lt;code&gt;frame-ancestors&lt;/code&gt; back in 2016. In practice every browser still honors it, and OWASP recommends sending both headers for defense in depth. The one thing you must not do is rely on &lt;code&gt;ALLOW-FROM&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Should I use DENY or SAMEORIGIN?&lt;/strong&gt;&lt;br&gt;
Use &lt;code&gt;DENY&lt;/code&gt; if nothing on your site is ever shown in a frame, which is the strongest setting. Use &lt;code&gt;SAMEORIGIN&lt;/code&gt; if your own pages embed each other, for example dashboards, previews or internal widgets. In the 2025 Web Almanac data, 72.1% of sites choose SAMEORIGIN.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I allow one specific partner site to embed my pages?&lt;/strong&gt;&lt;br&gt;
X-Frame-Options cannot do this anymore. Use &lt;code&gt;Content-Security-Policy: frame-ancestors 'self' https://partner.example.com&lt;/code&gt; and list each allowed origin explicitly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happens if I send both X-Frame-Options and frame-ancestors?&lt;/strong&gt;&lt;br&gt;
Browsers that support CSP Level 2, which is all modern ones, enforce &lt;code&gt;frame-ancestors&lt;/code&gt; and ignore X-Frame-Options. Older clients fall back to X-Frame-Options. That fallback chain is exactly why sending both is the recommended setup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I set X-Frame-Options with a meta tag?&lt;/strong&gt;&lt;br&gt;
No. Browsers only honor it as a real HTTP response header. If you cannot change server configuration, set it through your hosting panel, CDN rules or application middleware.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://fortifynet.com/blog/x-frame-options" rel="noopener noreferrer"&gt;fortifynet.com/blog/x-frame-options&lt;/a&gt;. I'm the founder of FortifyNet, a website security scanner; this article comes from our blog, so factor in that founder bias when you read any tool recommendations here.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>securityheaders</category>
      <category>clickjacking</category>
      <category>xframeoptions</category>
      <category>csp</category>
    </item>
    <item>
      <title>ERR_CERT_AUTHORITY_INVALID: Causes and Fixes | FortifyNet</title>
      <dc:creator>Håkan Fägnell</dc:creator>
      <pubDate>Mon, 17 Aug 2026 04:45:29 +0000</pubDate>
      <link>https://dev.to/hkan_fgnell_322b4aba3d6/errcertauthorityinvalid-causes-and-fixes-fortifynet-30ni</link>
      <guid>https://dev.to/hkan_fgnell_322b4aba3d6/errcertauthorityinvalid-causes-and-fixes-fortifynet-30ni</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1516321318423-f06f85e504b3%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1600%26q%3D80" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1516321318423-f06f85e504b3%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1600%26q%3D80" alt="A laptop showing a browser certificate warning page"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ERR_CERT_AUTHORITY_INVALID means the browser could not build a chain of trust from the certificate your server presented back to a root certificate authority it already trusts.&lt;/strong&gt; Chrome shows it as &lt;code&gt;NET::ERR_CERT_AUTHORITY_INVALID&lt;/code&gt; under a "Your connection is not private" screen. It is almost never a sign that your certificate has expired, and almost always one of two things: your server is not sending its intermediate certificate, or the certificate was not issued by a publicly trusted CA at all. The fix takes minutes once you know which side the fault is on.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the error actually means
&lt;/h2&gt;

&lt;p&gt;Every TLS certificate is validated by walking a chain. The browser receives your server (leaf) certificate, reads which CA signed it, and looks for that CA. If the signing CA is an intermediate, the browser needs that intermediate certificate too, so it can check who signed &lt;em&gt;that&lt;/em&gt;, and keep walking until it reaches a root certificate that is already installed in its trust store.&lt;/p&gt;

&lt;p&gt;If any link in that walk is missing, unsigned by a trusted party, or issued by a CA the browser has removed, the chain cannot be completed and the connection is refused with ERR_CERT_AUTHORITY_INVALID.&lt;/p&gt;

&lt;p&gt;Chrome ships its own trust list, the Chrome Root Store, rather than relying only on the operating system. Firefox does the same. Safari and Edge lean on the OS store. That difference is why a site can fail in one browser and load in another on the same machine, and it is one of the most useful diagnostic signals you have.&lt;/p&gt;

&lt;h2&gt;
  
  
  The seven causes, and where the fault lies
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Cause&lt;/th&gt;
&lt;th&gt;Fault is on&lt;/th&gt;
&lt;th&gt;Typical tell&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Missing intermediate certificate in the server chain&lt;/td&gt;
&lt;td&gt;Server&lt;/td&gt;
&lt;td&gt;Fails on mobile and fresh devices, loads on your own desktop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Self-signed certificate&lt;/td&gt;
&lt;td&gt;Server&lt;/td&gt;
&lt;td&gt;Internal tools, staging, NAS boxes, routers, printers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Certificate from a private or internal CA&lt;/td&gt;
&lt;td&gt;Server&lt;/td&gt;
&lt;td&gt;Works on corporate laptops only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;TLS interception by antivirus or a corporate proxy&lt;/td&gt;
&lt;td&gt;Device / network&lt;/td&gt;
&lt;td&gt;Every HTTPS site fails, issuer name is your AV vendor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Outdated device root store (old Android, old Windows)&lt;/td&gt;
&lt;td&gt;Device&lt;/td&gt;
&lt;td&gt;Only that one device fails&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;System clock badly wrong&lt;/td&gt;
&lt;td&gt;Device&lt;/td&gt;
&lt;td&gt;Root itself appears not yet valid or long expired&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;The issuing CA has been distrusted or removed&lt;/td&gt;
&lt;td&gt;Server&lt;/td&gt;
&lt;td&gt;Fails in Chrome, still fine in an older browser&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Causes 1 and 2 account for the overwhelming majority of real reports. If you own the site, start there.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 30-second triage
&lt;/h2&gt;

&lt;p&gt;Before changing anything, work out whether the problem lives on the server or on the visitor's machine.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Open the site on mobile data, on a phone that has never visited it.&lt;/strong&gt; If it fails there but works on your desktop, you have a missing intermediate. Desktop browsers cache intermediates they have seen before and can silently repair a broken chain, which is exactly why this bug survives so long undetected.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Try a second browser on the same machine.&lt;/strong&gt; Failing in Chrome only points at the Chrome Root Store rejecting the CA. Failing everywhere on one machine points at interception or an outdated device.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Click the warning, then "Advanced", and read the issuer.&lt;/strong&gt; If the issuer is your antivirus product, a firewall vendor, or your employer's name, traffic is being intercepted and re-signed. That is cause 4, and it is not your website's fault.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check the chain from the command line&lt;/strong&gt; with OpenSSL:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;openssl s_client -connect example.com:443 -servername example.com -showcerts
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see at least two certificates in the output: your leaf, then one or more intermediates. If only one certificate comes back, the intermediate is missing and you have found the bug.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1580894732444-8ecded7900cd%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1600%26q%3D80" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1580894732444-8ecded7900cd%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1600%26q%3D80" alt="Network cabling in a server rack, representing the server-side certificate chain"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Fix 1: install the full certificate chain
&lt;/h2&gt;

&lt;p&gt;This is the single most common server-side cause. Your CA issues you a leaf certificate and one or more intermediates, and your server has to send all of them. Point your web server at the &lt;strong&gt;full chain&lt;/strong&gt; file rather than the leaf alone.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Server&lt;/th&gt;
&lt;th&gt;What to configure&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;nginx&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ssl_certificate&lt;/code&gt; must point at &lt;code&gt;fullchain.pem&lt;/code&gt; (leaf + intermediates concatenated), not &lt;code&gt;cert.pem&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apache 2.4.8+&lt;/td&gt;
&lt;td&gt;Concatenate leaf and intermediates into the file used by &lt;code&gt;SSLCertificateFile&lt;/code&gt;; &lt;code&gt;SSLCertificateChainFile&lt;/code&gt; is deprecated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IIS&lt;/td&gt;
&lt;td&gt;Import the intermediate into the &lt;strong&gt;Intermediate Certification Authorities&lt;/strong&gt; store on the machine account&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Caddy / Traefik&lt;/td&gt;
&lt;td&gt;Handled automatically when using built-in ACME&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Load balancer or CDN&lt;/td&gt;
&lt;td&gt;The chain must be uploaded at the edge, not only on the origin&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you use Let's Encrypt, the fix is usually a one-word change: use &lt;code&gt;fullchain.pem&lt;/code&gt;, never &lt;code&gt;cert.pem&lt;/code&gt;. Let's Encrypt notes that every certificate it issues has an intermediate directly signed by its most widely trusted root, and that multiple active intermediates rotate over time, so hard-coding a specific intermediate file is fragile (&lt;a href="https://letsencrypt.org/certificates/" rel="noopener noreferrer"&gt;Let's Encrypt, Chains of Trust&lt;/a&gt;). Reload the server after the change; a config change alone does nothing until the process picks it up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fix 2: replace a self-signed certificate
&lt;/h2&gt;

&lt;p&gt;A self-signed certificate signs itself. No public CA vouches for it, so no browser can ever trust it without manual intervention. This is correct behaviour, not a bug.&lt;/p&gt;

&lt;p&gt;For anything public-facing, get a free certificate from a publicly trusted CA and automate renewal. For genuinely internal tools, either add your internal root to the trust stores of the devices that need it, or issue from an internal CA that is already distributed by your device management. Do not train your team to click through the warning; that habit is precisely what phishing operators rely on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fix 3: rule out interception and stale devices
&lt;/h2&gt;

&lt;p&gt;If the issuer shown in the warning is an antivirus product, temporarily disable its HTTPS or SSL scanning feature and reload. Many security suites insert their own root to inspect encrypted traffic, and a broken or expired inspection root breaks every HTTPS site at once.&lt;/p&gt;

&lt;p&gt;On an outdated device, install pending OS updates. Root stores ship with system updates, and a device several years behind will be missing newer roots entirely. Finally, confirm the clock: a system date that is wildly wrong can make a valid root look not-yet-valid, which surfaces as an authority error rather than a date error.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fix 4: check whether your CA is still trusted
&lt;/h2&gt;

&lt;p&gt;Root programs remove CAs that fail their requirements, and those removals are real events with real deadlines. The Chrome Root Program requires that from &lt;strong&gt;15 June 2026&lt;/strong&gt;, newly issued public TLS certificates carry only the serverAuth extended key usage; certificates that also carry clientAuth will no longer be trusted by Chrome, and CA owners whose hierarchies do not comply must restructure or exit the store (&lt;a href="https://googlechrome.github.io/chromerootprogram/" rel="noopener noreferrer"&gt;Chrome Root Program Policy&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;If a site suddenly fails in Chrome while older clients still accept it, a distrust event is a realistic explanation. The remedy is to reissue from a compliant CA.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this error is about to get more common
&lt;/h2&gt;

&lt;p&gt;Certificate lifetimes are collapsing. Under CA/Browser Forum ballot SC-081v3, adopted in April 2025, the maximum validity period steps down from 398 days to 200 days on &lt;strong&gt;15 March 2026&lt;/strong&gt;, to 100 days in 2027, and to 47 days in 2029 (&lt;a href="https://cabforum.org/2025/04/11/ballot-sc081v3-introduce-schedule-of-reducing-validity-and-data-reuse-periods/" rel="noopener noreferrer"&gt;CA/Browser Forum, Ballot SC-081v3&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fquickchart.io%2Fchart%3Fw%3D700%26h%3D380%26bkg%3Dwhite%26c%3D%257B%2522type%2522%253A%2522bar%2522%252C%2522data%2522%253A%257B%2522labels%2522%253A%255B%2522Now%2520%2528to%2520Mar%25202026%2529%2522%252C%2522From%252015%2520Mar%25202026%2522%252C%2522From%252015%2520Mar%25202027%2522%252C%2522From%252015%2520Mar%25202029%2522%255D%252C%2522datasets%2522%253A%255B%257B%2522label%2522%253A%2522Max%2520lifetime%2520%2528days%2529%2522%252C%2522data%2522%253A%255B398%252C200%252C100%252C47%255D%252C%2522backgroundColor%2522%253A%2522%25232563eb%2522%257D%255D%257D%252C%2522options%2522%253A%257B%2522plugins%2522%253A%257B%2522title%2522%253A%257B%2522display%2522%253Atrue%252C%2522text%2522%253A%2522Maximum%2520TLS%2520certificate%2520lifetime%2520%2528CA%252FBrowser%2520Forum%2520SC-081v3%2529%2522%257D%252C%2522legend%2522%253A%257B%2522display%2522%253Afalse%257D%252C%2522datalabels%2522%253A%257B%2522display%2522%253Atrue%252C%2522anchor%2522%253A%2522end%2522%252C%2522align%2522%253A%2522top%2522%252C%2522color%2522%253A%2522%2523111827%2522%257D%257D%252C%2522scales%2522%253A%257B%2522y%2522%253A%257B%2522title%2522%253A%257B%2522display%2522%253Atrue%252C%2522text%2522%253A%2522Days%2522%257D%252C%2522beginAtZero%2522%253Atrue%257D%257D%257D%257D" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fquickchart.io%2Fchart%3Fw%3D700%26h%3D380%26bkg%3Dwhite%26c%3D%257B%2522type%2522%253A%2522bar%2522%252C%2522data%2522%253A%257B%2522labels%2522%253A%255B%2522Now%2520%2528to%2520Mar%25202026%2529%2522%252C%2522From%252015%2520Mar%25202026%2522%252C%2522From%252015%2520Mar%25202027%2522%252C%2522From%252015%2520Mar%25202029%2522%255D%252C%2522datasets%2522%253A%255B%257B%2522label%2522%253A%2522Max%2520lifetime%2520%2528days%2529%2522%252C%2522data%2522%253A%255B398%252C200%252C100%252C47%255D%252C%2522backgroundColor%2522%253A%2522%25232563eb%2522%257D%255D%257D%252C%2522options%2522%253A%257B%2522plugins%2522%253A%257B%2522title%2522%253A%257B%2522display%2522%253Atrue%252C%2522text%2522%253A%2522Maximum%2520TLS%2520certificate%2520lifetime%2520%2528CA%252FBrowser%2520Forum%2520SC-081v3%2529%2522%257D%252C%2522legend%2522%253A%257B%2522display%2522%253Afalse%257D%252C%2522datalabels%2522%253A%257B%2522display%2522%253Atrue%252C%2522anchor%2522%253A%2522end%2522%252C%2522align%2522%253A%2522top%2522%252C%2522color%2522%253A%2522%2523111827%2522%257D%257D%252C%2522scales%2522%253A%257B%2522y%2522%253A%257B%2522title%2522%253A%257B%2522display%2522%253Atrue%252C%2522text%2522%253A%2522Days%2522%257D%252C%2522beginAtZero%2522%253Atrue%257D%257D%257D%257D" alt="Bar chart showing maximum TLS certificate lifetime falling from 398 days to 200, 100 and 47 days under CA/Browser Forum ballot SC-081v3"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Maximum TLS certificate lifetime under CA/Browser Forum ballot SC-081v3. Source: CA/Browser Forum, April 2025.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;More renewals mean more chances for an automation script to deploy a leaf without its intermediate. Every renewal is now a deployment, and every deployment can break the chain. Teams that renewed manually once a year and never thought about it again will hit this error for the first time in 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verifying the fix
&lt;/h2&gt;

&lt;p&gt;After changing the chain, do not trust your own browser. It has cached the intermediate and will show you a green padlock over a chain that still fails for everyone else. Verify from a clean vantage point: an external scanner, a phone on mobile data, or a fresh browser profile. Confirm that the leaf and every intermediate are being served, and that no intermediate is itself expired.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related guides
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://fortifynet.com/blog/your-connection-is-not-private" rel="noopener noreferrer"&gt;"Your connection is not private": what it means and how to fix it&lt;/a&gt; covers the wider warning screen this error appears under.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://fortifynet.com/blog/err-ssl-protocol-error" rel="noopener noreferrer"&gt;ERR_SSL_PROTOCOL_ERROR: what it means and how to fix it&lt;/a&gt; handles the handshake-level failures that look similar but have different causes.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://fortifynet.com/blog/ssl-tls-certificate-security" rel="noopener noreferrer"&gt;SSL/TLS certificate security: the complete guide to an A+ rating&lt;/a&gt; walks through chain, protocol and cipher configuration end to end.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is ERR_CERT_AUTHORITY_INVALID dangerous for visitors?&lt;/strong&gt;&lt;br&gt;
It can be. The browser is telling you it cannot verify who it is talking to, which is exactly the condition a machine-in-the-middle attack creates. On a site you do not control, treat the warning as real and do not proceed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why does the site work on my computer but not for my customers?&lt;/strong&gt;&lt;br&gt;
Desktop browsers cache intermediate certificates from previous visits and can complete a broken chain from memory. Devices that have never seen the intermediate cannot. This asymmetry is the classic signature of a missing intermediate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does clearing the browser cache fix it?&lt;/strong&gt;&lt;br&gt;
Rarely, and only when the fault is on the device. If the chain is broken on the server, clearing the cache changes nothing for anyone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How is it different from ERR_CERT_COMMON_NAME_INVALID?&lt;/strong&gt;&lt;br&gt;
AUTHORITY_INVALID means the issuer cannot be trusted. COMMON_NAME_INVALID means the issuer is trusted but the certificate was issued for a different hostname than the one being visited.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I just click through the warning?&lt;/strong&gt;&lt;br&gt;
On your own staging server, yes. On any site handling real data, no. Clicking through disables the exact protection that would tell you the connection had been tampered with.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check your chain before your visitors do
&lt;/h2&gt;

&lt;p&gt;A missing intermediate is invisible from your own desk and obvious to every new visitor. &lt;a href="https://fortifynet.com" rel="noopener noreferrer"&gt;Run a free FortifyNet scan&lt;/a&gt; and see your full certificate chain, protocol support, security headers, DNS and email authentication in about 60 seconds. No signup required.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Sources: &lt;a href="https://cabforum.org/2025/04/11/ballot-sc081v3-introduce-schedule-of-reducing-validity-and-data-reuse-periods/" rel="noopener noreferrer"&gt;CA/Browser Forum, Ballot SC-081v3&lt;/a&gt;; &lt;a href="https://googlechrome.github.io/chromerootprogram/" rel="noopener noreferrer"&gt;Chrome Root Program Policy&lt;/a&gt;; &lt;a href="https://letsencrypt.org/certificates/" rel="noopener noreferrer"&gt;Let's Encrypt, Chains of Trust&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://fortifynet.com/blog/err-cert-authority-invalid" rel="noopener noreferrer"&gt;fortifynet.com/blog/err-cert-authority-invalid&lt;/a&gt;. I'm the founder of FortifyNet, a website security scanner; this article comes from our blog, so factor in that founder bias when you read any tool recommendations here.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ssl</category>
      <category>browsererrors</category>
      <category>certificates</category>
      <category>chrome</category>
    </item>
    <item>
      <title>Pingdom Alternative: 7 Best Options in 2026 | FortifyNet</title>
      <dc:creator>Håkan Fägnell</dc:creator>
      <pubDate>Thu, 13 Aug 2026 04:45:29 +0000</pubDate>
      <link>https://dev.to/hkan_fgnell_322b4aba3d6/pingdom-alternative-6-best-options-in-2026-fortifynet-41oe</link>
      <guid>https://dev.to/hkan_fgnell_322b4aba3d6/pingdom-alternative-6-best-options-in-2026-fortifynet-41oe</guid>
      <description>&lt;p&gt;The best Pingdom alternative in 2026 depends on why you are switching. If the bill is the problem, &lt;strong&gt;UptimeRobot&lt;/strong&gt; watches 50 URLs for free every 5 minutes, and its Solo plan costs $9/month against Pingdom's $10/month entry tier with just 10 uptime checks (&lt;a href="https://uptimerobot.com/pricing/" rel="noopener noreferrer"&gt;UptimeRobot&lt;/a&gt; and &lt;a href="https://www.pingdom.com/synthetic-pricing/" rel="noopener noreferrer"&gt;Pingdom&lt;/a&gt; pricing pages, August 2026). If you can run a Docker container, &lt;strong&gt;Uptime Kuma&lt;/strong&gt; is free, self-hosted and past 88,000 GitHub stars. And if what you really need to know is not just &lt;em&gt;whether&lt;/em&gt; your site is down but &lt;em&gt;why&lt;/em&gt;, &lt;strong&gt;FortifyNet&lt;/strong&gt; audits SSL/TLS, DNS, email authentication and security headers in one free 60-second scan.&lt;/p&gt;

&lt;p&gt;Below is an honest comparison of seven options, with prices and limits taken from each vendor's own pricing page in August 2026.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1573164713988-8665fc963095%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1200%26q%3D80" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1573164713988-8665fc963095%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1200%26q%3D80" alt="A monitoring dashboard with performance charts on a computer screen, watched by an analyst" width="1200" height="801"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why people look for a Pingdom alternative
&lt;/h2&gt;

&lt;p&gt;Pingdom, owned by SolarWinds, is still a polished product. Three things send people looking elsewhere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;There is no free tier.&lt;/strong&gt; Pingdom offers a trial, and after that the cheapest synthetic monitoring plan is $10/month billed annually, which includes 10 uptime checks, 1 advanced transaction check and 50 SMS alerts (&lt;a href="https://www.pingdom.com/synthetic-pricing/" rel="noopener noreferrer"&gt;Pingdom synthetic pricing&lt;/a&gt;, August 2026). Several rivals give you more monitors for free than Pingdom includes on its entry plan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Costs climb with check count.&lt;/strong&gt; Plans scale to roughly $249/month as uptime checks, transaction checks and SMS allowances grow. If you watch dozens of client sites, per-check pricing adds up faster than flat tiers like StatusCake's 100-monitor entry plan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alerting depth sits in higher tiers.&lt;/strong&gt; On-call schedules, escalation chains and incident timelines largely live upmarket or in separate SolarWinds products, while newer tools such as Better Stack bundle them from the first paid plan.&lt;/p&gt;

&lt;p&gt;If what you actually monitor is page speed rather than availability, start with our &lt;a href="https://fortifynet.com/blog/gtmetrix-alternative" rel="noopener noreferrer"&gt;GTmetrix alternatives comparison&lt;/a&gt; instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually matters in an uptime monitor
&lt;/h2&gt;

&lt;p&gt;Downtime is expensive enough that the tooling decision deserves ten minutes of thought. In the Uptime Institute's Annual Outage Analysis 2025, 57% of operators said their most recent significant outage cost more than $100,000, and roughly one in five put it above $1 million (&lt;a href="https://uptimeinstitute.com/about-ui/press-releases/uptime-announces-annual-outage-analysis-report-2025" rel="noopener noreferrer"&gt;Uptime Institute&lt;/a&gt;). ITIC's 2024-2025 Hourly Cost of Downtime survey found 93% of enterprises put a single hour of downtime above $300,000. Four things to compare before the price:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check interval.&lt;/strong&gt; A 5-minute interval can miss a 4-minute outage entirely, and it sets your worst-case detection delay. Free tiers usually check every 3 to 5 minutes; paid tiers drop to 60 or even 30 seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alert routing.&lt;/strong&gt; An alert nobody wakes up for is a report, not an alert. Look for phone-call escalation, on-call rotations and per-channel rules, not just email.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Status pages.&lt;/strong&gt; A public status page deflects support tickets during an incident. Some tools include branded pages free; others sell them separately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What ping checks cannot see.&lt;/strong&gt; An uptime monitor confirms your homepage answers with HTTP 200. It will happily report "up" while your TLS certificate is a day from expiring, your SPF record breaks email delivery, or your domain shows up in a credential dump. Availability and health are different questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 7 best Pingdom alternatives compared
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Free tier&lt;/th&gt;
&lt;th&gt;Paid from (annual)&lt;/th&gt;
&lt;th&gt;Fastest check (paid)&lt;/th&gt;
&lt;th&gt;Standout feature&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;UptimeRobot&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;50 monitors, 5-min (non-commercial)&lt;/td&gt;
&lt;td&gt;$9/mo&lt;/td&gt;
&lt;td&gt;15 s&lt;/td&gt;
&lt;td&gt;Most generous free allowance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Better Stack&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;10 monitors, 3-min&lt;/td&gt;
&lt;td&gt;$29/mo&lt;/td&gt;
&lt;td&gt;30 s&lt;/td&gt;
&lt;td&gt;On-call and incident management built in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;StatusCake&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes, basic&lt;/td&gt;
&lt;td&gt;$20.41/mo&lt;/td&gt;
&lt;td&gt;1 min (30 s on Business)&lt;/td&gt;
&lt;td&gt;100 monitors on the entry plan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Site24x7&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;5 basic monitors&lt;/td&gt;
&lt;td&gt;$9/mo&lt;/td&gt;
&lt;td&gt;1 min&lt;/td&gt;
&lt;td&gt;Full infrastructure suite (Zoho)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Uptime Kuma&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free, self-hosted&lt;/td&gt;
&lt;td&gt;$0 + your server&lt;/td&gt;
&lt;td&gt;Configurable&lt;/td&gt;
&lt;td&gt;90+ notification channels&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pulsetic&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;10 monitors, 5-min&lt;/td&gt;
&lt;td&gt;$9/mo&lt;/td&gt;
&lt;td&gt;30 s (Team, $19/mo)&lt;/td&gt;
&lt;td&gt;Cheapest route to 30-second checks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;FortifyNet&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Full 60-second audit&lt;/td&gt;
&lt;td&gt;Freemium&lt;/td&gt;
&lt;td&gt;Audit, not ping&lt;/td&gt;
&lt;td&gt;Finds the failures ping checks miss&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Pingdom (reference)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;None, trial only&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;$10/mo&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;1 min&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Established synthetic suite&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Sources: vendor pricing pages, August 2026. Entry prices are annual-billing rates and change; check the vendor page before buying.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. UptimeRobot, the default budget pick
&lt;/h3&gt;

&lt;p&gt;The free plan monitors 50 URLs at 5-minute intervals, which is the most generous free allowance in this list, though since October 2024 it is limited to personal, non-commercial use (&lt;a href="https://uptimerobot.com/pricing/" rel="noopener noreferrer"&gt;UptimeRobot pricing&lt;/a&gt;). The Solo plan at $9/month billed annually unlocks 60-second checks and commercial use; Team is $38/month and Enterprise starts at $69/month, with login seats billed extra on the two higher tiers.&lt;/p&gt;

&lt;p&gt;Best for: solo builders, side projects and small businesses replacing Pingdom's entry plan at a lower price.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Better Stack, monitoring plus incident management
&lt;/h3&gt;

&lt;p&gt;Better Stack bundles what Pingdom sells piecemeal: uptime checks, a status page, on-call scheduling, escalation policies and incident timelines. The free tier includes 10 monitors at 3-minute intervals with 1 phone-call alert; paid starts at $29/month with 30-second checks (&lt;a href="https://betterstack.com/pricing" rel="noopener noreferrer"&gt;Better Stack pricing&lt;/a&gt;, August 2026).&lt;/p&gt;

&lt;p&gt;Best for: teams that would otherwise buy an uptime monitor and a separate incident-management tool.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. StatusCake, most monitors per dollar
&lt;/h3&gt;

&lt;p&gt;StatusCake keeps a basic free tier, and its entry paid plan at $20.41/month includes 100 uptime monitors at 1-minute intervals plus page speed, domain and SSL expiry monitoring (&lt;a href="https://www.statuscake.com/pricing/" rel="noopener noreferrer"&gt;StatusCake pricing&lt;/a&gt;, August 2026). The Business plan at $66.66/month raises that to 300 monitors at 30-second intervals.&lt;/p&gt;

&lt;p&gt;Best for: agencies and freelancers watching many small client sites on one bill.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Site24x7, the all-in-one suite
&lt;/h3&gt;

&lt;p&gt;Site24x7, part of the Zoho family, folds uptime monitoring into a wider platform covering servers, applications, logs and networks. There is a free plan for up to 5 basic monitors, and the Starter plan begins at $9/month (&lt;a href="https://www.site24x7.com/site24x7-pricing.html" rel="noopener noreferrer"&gt;Site24x7 pricing&lt;/a&gt;, August 2026).&lt;/p&gt;

&lt;p&gt;Best for: teams that want website, server and application monitoring on a single invoice.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Uptime Kuma, self-hosted and free
&lt;/h3&gt;

&lt;p&gt;Uptime Kuma is the open-source favourite, past 88,000 GitHub stars by mid-2026 (&lt;a href="https://github.com/louislam/uptime-kuma" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;). Version 2.0 (October 2025) added MariaDB support and rootless Docker images; version 2.1 (February 2026) added Globalping-powered worldwide probes and domain expiry monitoring. It checks HTTP(S), TCP, DNS, ping, Docker containers and SSL certificate expiry, and alerts through more than 90 notification channels.&lt;/p&gt;

&lt;p&gt;The cost is your own server and your own maintenance, and there is no SLA. One caution: host it on infrastructure separate from what it watches, or an outage takes the watchman down with the site.&lt;/p&gt;

&lt;p&gt;Best for: homelabs and technical teams comfortable operating their own tooling.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Pulsetic, the reader-suggested addition
&lt;/h3&gt;

&lt;p&gt;Pulsetic joined this list after a reader suggested it in the comments, and its pricing holds up against the rest of the field. The free tier covers 10 monitors at 5-minute intervals, the Solo plan at $9/month moves to 60-second checks, and 30-second checks start on the Team plan at $19/month (&lt;a href="https://pulsetic.com/pricing/" rel="noopener noreferrer"&gt;Pulsetic pricing&lt;/a&gt;, checked 18 August 2026). Going by the plans in this comparison, that Team tier is the cheapest route to 30-second checks here.&lt;/p&gt;

&lt;p&gt;Best for: budget users who want 60-second checks at entry-level pricing, with an affordable 30-second upgrade path.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. FortifyNet, because "up" is not the same as "healthy"
&lt;/h3&gt;

&lt;p&gt;FortifyNet is not a ping-based uptime monitor, and it does not pretend to be. It answers the question uptime tools skip: is the site that just answered HTTP 200 actually configured safely? The free 60-second scan checks SSL/TLS configuration, DNS records, email authentication (SPF, DKIM and DMARC), HTTP security headers, dark-web exposure for your domain and performance, then returns one prioritised list.&lt;/p&gt;

&lt;p&gt;Pair it with any monitor above. The monitor tells you the moment the site goes down; FortifyNet finds the expired-certificate-in-three-days, missing-DMARC, leaked-credentials class of problem that never triggers a ping alert until it is too late.&lt;/p&gt;

&lt;p&gt;Best for: site owners who want to catch quiet failures before customers, or attackers, notice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Entry prices, side by side
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fquickchart.io%2Fchart%3Fw%3D700%26h%3D330%26c%3D%257B%2522type%2522%253A%2520%2522bar%2522%252C%2520%2522data%2522%253A%2520%257B%2522labels%2522%253A%2520%255B%2522Uptime%2520Kuma%2522%252C%2520%2522UptimeRobot%2522%252C%2520%2522Site24x7%2522%252C%2520%2522Pingdom%2522%252C%2520%2522StatusCake%2522%252C%2520%2522Better%2520Stack%2522%255D%252C%2520%2522datasets%2522%253A%2520%255B%257B%2522label%2522%253A%2520%2522USD%2Fmonth%2522%252C%2520%2522data%2522%253A%2520%255B0%252C%25209%252C%25209%252C%252010%252C%252020.4%252C%252029%255D%252C%2520%2522backgroundColor%2522%253A%2520%2522%25232563eb%2522%257D%255D%257D%252C%2520%2522options%2522%253A%2520%257B%2522indexAxis%2522%253A%2520%2522y%2522%252C%2520%2522plugins%2522%253A%2520%257B%2522title%2522%253A%2520%257B%2522display%2522%253A%2520true%252C%2520%2522text%2522%253A%2520%2522Entry%2520paid%2520plan%252C%2520USD%2Fmonth%2520%2528Aug%25202026%2529%2522%257D%252C%2520%2522legend%2522%253A%2520%257B%2522display%2522%253A%2520false%257D%257D%257D%257D" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fquickchart.io%2Fchart%3Fw%3D700%26h%3D330%26c%3D%257B%2522type%2522%253A%2520%2522bar%2522%252C%2520%2522data%2522%253A%2520%257B%2522labels%2522%253A%2520%255B%2522Uptime%2520Kuma%2522%252C%2520%2522UptimeRobot%2522%252C%2520%2522Site24x7%2522%252C%2520%2522Pingdom%2522%252C%2520%2522StatusCake%2522%252C%2520%2522Better%2520Stack%2522%255D%252C%2520%2522datasets%2522%253A%2520%255B%257B%2522label%2522%253A%2520%2522USD%2Fmonth%2522%252C%2520%2522data%2522%253A%2520%255B0%252C%25209%252C%25209%252C%252010%252C%252020.4%252C%252029%255D%252C%2520%2522backgroundColor%2522%253A%2520%2522%25232563eb%2522%257D%255D%257D%252C%2520%2522options%2522%253A%2520%257B%2522indexAxis%2522%253A%2520%2522y%2522%252C%2520%2522plugins%2522%253A%2520%257B%2522title%2522%253A%2520%257B%2522display%2522%253A%2520true%252C%2520%2522text%2522%253A%2520%2522Entry%2520paid%2520plan%252C%2520USD%2Fmonth%2520%2528Aug%25202026%2529%2522%257D%252C%2520%2522legend%2522%253A%2520%257B%2522display%2522%253A%2520false%257D%257D%257D%257D" alt="Bar chart comparing entry paid plan prices per month: Uptime Kuma 0, UptimeRobot 9, Site24x7 9, Pingdom 10, StatusCake 20.4, Better Stack 29 US dollars" width="1400" height="660"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Cheapest paid plan per tool, USD/month billed annually, August 2026. Uptime Kuma is open source, so the licence is free and you pay only for hosting. Pulsetic's Solo plan is also $9/month (not yet in the chart). Feature scope differs widely between these entry plans.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How to switch from Pingdom without missing an incident
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Inventory your checks.&lt;/strong&gt; List every uptime check, transaction check and integration you have in Pingdom, including the ones a colleague set up years ago.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run both tools in parallel for two weeks.&lt;/strong&gt; Set up the new monitor while Pingdom still runs. Two overlapping bills for two weeks is cheaper than one missed outage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Match intervals and locations.&lt;/strong&gt; A 60-second check from three regions is not comparable to a 5-minute check from one. Configure the new tool at least as tightly as the old one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rebuild alert routing before cosmetics.&lt;/strong&gt; Escalation rules and phone alerts first, status page styling last.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test the failure path deliberately.&lt;/strong&gt; Take a staging endpoint down on purpose and confirm the right person's phone actually rings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cancel Pingdom only after a clean overlap.&lt;/strong&gt; Export any uptime history you may need for SLA reporting first.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Which one should you pick?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Cheapest reliable monitoring for a few sites: &lt;strong&gt;UptimeRobot&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;On-call scheduling and incident management included: &lt;strong&gt;Better Stack&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Many client sites on a budget: &lt;strong&gt;StatusCake&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Uptime plus servers, apps and logs in one place: &lt;strong&gt;Site24x7&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Full control and zero licence cost: &lt;strong&gt;Uptime Kuma&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Cheapest route to 30-second checks: &lt;strong&gt;Pulsetic&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Finding the problems a ping check cannot see: &lt;strong&gt;FortifyNet&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For most small businesses the practical answer is a pair: one ping monitor from the list above for the moment things break, and a recurring FortifyNet scan for the quiet failures in between.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is there a completely free Pingdom alternative?&lt;/strong&gt;&lt;br&gt;
Two kinds. UptimeRobot's free plan covers 50 monitors at 5-minute intervals but is limited to personal, non-commercial use since October 2024. Uptime Kuma is free and open source for any use, but you host and maintain it yourself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does Pingdom still have a free plan?&lt;/strong&gt;&lt;br&gt;
No. Pingdom offers a trial, after which synthetic monitoring starts at $10/month billed annually for 10 uptime checks and 1 advanced check (Pingdom pricing page, August 2026).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What check interval do I actually need?&lt;/strong&gt;&lt;br&gt;
Match it to the cost of an undetected minute. A personal blog is fine at 5 minutes. A checkout flow deserves 30 to 60 seconds, because the interval is your worst-case detection delay on top of alerting time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can an uptime monitor tell me why my site is down?&lt;/strong&gt;&lt;br&gt;
Only roughly. Most distinguish DNS failure, connection timeout and HTTP error codes, which narrows the search. For causes that build up silently, such as certificates about to expire, broken SPF or DMARC records, or missing security headers, run a FortifyNet scan and fix what it flags before it becomes downtime.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is a self-hosted monitor like Uptime Kuma reliable enough for production?&lt;/strong&gt;&lt;br&gt;
Yes, with one rule: run it on infrastructure independent of what it monitors, ideally a different provider and region. You also own updates, backups and the notification configuration, and there is no SLA behind it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Watch uptime, but audit health too
&lt;/h2&gt;

&lt;p&gt;An uptime monitor tells you the moment your site stops answering. It says nothing about the certificate that expires on Sunday, the DMARC record that quietly broke, or the staff password sitting in a breach dump. FortifyNet's free scan takes about 60 seconds, needs no account, and covers SSL/TLS, DNS, email authentication, security headers, dark-web exposure and performance in one prioritised report.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://fortifynet.com" rel="noopener noreferrer"&gt;Run your free FortifyNet scan&lt;/a&gt;&lt;/strong&gt; and see what your uptime monitor cannot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related guides
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fortifynet.com/blog/gtmetrix-alternative" rel="noopener noreferrer"&gt;GTmetrix alternative: the 6 best options in 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fortifynet.com/blog/google-pagespeed-alternative" rel="noopener noreferrer"&gt;Best Google PageSpeed alternatives in 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fortifynet.com/blog/website-security-checklist" rel="noopener noreferrer"&gt;Website security checklist: 12 essential steps for 2026&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://fortifynet.com/blog/pingdom-alternative" rel="noopener noreferrer"&gt;fortifynet.com/blog/pingdom-alternative&lt;/a&gt;. I'm the founder of FortifyNet, a website security scanner; this article comes from our blog, so factor in that founder bias when you read any tool recommendations here.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>pingdom</category>
      <category>uptimemonitoring</category>
      <category>websitemonitoring</category>
      <category>alerting</category>
    </item>
    <item>
      <title>SSL/TLS Security Guide 2026: Achieve an A+ Rating</title>
      <dc:creator>Håkan Fägnell</dc:creator>
      <pubDate>Tue, 11 Aug 2026 04:45:29 +0000</pubDate>
      <link>https://dev.to/hkan_fgnell_322b4aba3d6/ssltls-security-guide-2026-achieve-an-a-rating-57ce</link>
      <guid>https://dev.to/hkan_fgnell_322b4aba3d6/ssltls-security-guide-2026-achieve-an-a-rating-57ce</guid>
      <description>&lt;h2&gt;
  
  
  What is SSL/TLS and Why Does It Matter?
&lt;/h2&gt;

&lt;p&gt;SSL (Secure Sockets Layer) and its modern successor TLS (Transport Layer Security) are cryptographic protocols that protect the connection between a web server and a browser. Think of them as a secure tunnel through which all data passes, encrypted so that no one can read or tamper with it along the way.&lt;/p&gt;

&lt;p&gt;When you see a padlock icon in your browser address bar and the URL starts with "https://", that is SSL/TLS in action. Without it, any data your visitors send - login credentials, payment details, personal information - travels as plain text that anyone on the same network can intercept.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key benefits of SSL/TLS:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data Privacy&lt;/strong&gt; means that all information exchanged between your server and your visitor is encrypted. Even if someone intercepts the traffic, they see only meaningless scrambled data. &lt;strong&gt;Data Integrity&lt;/strong&gt; ensures that data cannot be silently modified in transit - any tampering breaks the connection. &lt;strong&gt;Authentication&lt;/strong&gt; means the certificate proves that your site really is who it claims to be, protecting visitors from fake sites that impersonate yours. &lt;strong&gt;SEO benefit&lt;/strong&gt; is real too - Google has used HTTPS as a ranking signal since 2014 and continues to reward secure sites.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Evolution: From SSL to TLS 1.3
&lt;/h2&gt;

&lt;p&gt;The first SSL protocol appeared in 1995. Over the years, researchers discovered serious security flaws in each version, driving the development of newer, stronger protocols.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SSL 2.0 and SSL 3.0&lt;/strong&gt; are completely broken and must be disabled. They are vulnerable to attacks like POODLE and DROWN. Any modern server should refuse these completely. &lt;strong&gt;TLS 1.0 and TLS 1.1&lt;/strong&gt; were improvements but are now deprecated - the Payment Card Industry (PCI DSS) compliance standard formally requires them to be disabled. &lt;strong&gt;TLS 1.2&lt;/strong&gt; is the current minimum acceptable standard. It is secure when configured correctly and is still widely supported. &lt;strong&gt;TLS 1.3&lt;/strong&gt; is the gold standard, released in 2018. It is faster than TLS 1.2 because it requires fewer round-trips to establish a connection, and it removes all the outdated, weak algorithms that made older versions vulnerable. Enabling TLS 1.3 while keeping TLS 1.2 gives you the best combination of security and compatibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Achieve an A+ Rating on SSL Labs
&lt;/h2&gt;

&lt;p&gt;SSL Labs (ssllabs.com/ssltest) is the industry-standard tool for grading SSL/TLS configurations. An A+ rating means your server is configured at the highest level. Here is what you need to do:&lt;/p&gt;

&lt;h3&gt;
  
  
  Disable Legacy Protocols
&lt;/h3&gt;

&lt;p&gt;The first step is to configure your server to refuse old, insecure protocol versions. On nginx, open your configuration file and set the protocols line to allow only TLS 1.2 and 1.3. On Apache, you use the SSLProtocol directive to achieve the same result. This one change alone eliminates many common vulnerabilities.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use Strong Cipher Suites
&lt;/h3&gt;

&lt;p&gt;A cipher suite is the combination of algorithms used to encrypt your connection. Older cipher suites using algorithms like RC4, 3DES, or MD5 are weak and should be disabled. Modern configurations use suites based on ECDHE (Elliptic Curve Diffie-Hellman Ephemeral) key exchange combined with AES-GCM encryption. The key word is "ephemeral" - it ensures Perfect Forward Secrecy, meaning that even if your server's private key is somehow obtained in the future, past communications cannot be decrypted.&lt;/p&gt;

&lt;h3&gt;
  
  
  Enable HTTP Strict Transport Security (HSTS)
&lt;/h3&gt;

&lt;p&gt;HSTS is a security policy sent as an HTTP header that tells browsers: "This site should always be accessed over HTTPS. If you ever see an HTTP link to this site, upgrade it to HTTPS automatically." This prevents downgrade attacks where an attacker tries to trick your visitor's browser into connecting over unencrypted HTTP.&lt;/p&gt;

&lt;p&gt;The header should include a long max-age (at least one year), the includeSubDomains flag to cover all your subdomains, and the preload flag if you plan to submit to the HSTS preload list - a list hardcoded into browsers so that even the very first visit to your site is protected.&lt;/p&gt;

&lt;h3&gt;
  
  
  Enable OCSP Stapling
&lt;/h3&gt;

&lt;p&gt;When a browser connects to your site, it needs to verify that your certificate has not been revoked. Normally this requires the browser to make a separate request to your Certificate Authority, which adds delay. OCSP Stapling solves this by having your server fetch and cache the validity proof from the CA and then bundle it directly into the TLS handshake. This makes connections faster and eliminates a privacy concern - the CA no longer learns which sites your visitors are connecting to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Certificate Types Explained
&lt;/h2&gt;

&lt;p&gt;There are several types of SSL certificates, differing in how thoroughly your identity is verified before the certificate is issued.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Domain Validated (DV) certificates&lt;/strong&gt; are the simplest. The CA just checks that you control the domain by having you add a DNS record or a file to your website. Let's Encrypt issues DV certificates for free. They provide full encryption and are perfectly suitable for most websites.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Organization Validated (OV) certificates&lt;/strong&gt; require the CA to verify your organization's legal existence. This adds a layer of trust but is not visible to regular users without digging into certificate details.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Extended Validation (EV) certificates&lt;/strong&gt; involve the strictest vetting - the CA verifies your organization's legal identity, physical address, and operational status. They are used by banks and major e-commerce sites.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wildcard certificates&lt;/strong&gt; cover your main domain and all its subdomains with a single certificate - useful if you run multiple subdomains.&lt;/p&gt;

&lt;p&gt;Can a free Let's Encrypt certificate achieve an A+ rating? Absolutely yes. The grade you receive from SSL Labs depends entirely on your server configuration, not on what type of certificate you have or how much you paid for it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Certificate Renewal and Automation
&lt;/h2&gt;

&lt;p&gt;SSL certificates expire. When they do, browsers immediately show security warnings to all your visitors - a catastrophic outcome for any business. Let's Encrypt certificates are valid for 90 days, and commercial certificates typically last one year.&lt;/p&gt;

&lt;p&gt;The solution is automation. The certbot tool, provided by Let's Encrypt, can automatically renew certificates before they expire. Set it to run twice per day via a scheduled task. FortifyNet monitors your certificate expiry dates and sends you alerts 30 days and 7 days before expiry, giving you plenty of time to act even if automation fails.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Mistakes to Avoid
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Incomplete certificate chain&lt;/strong&gt; is the most common issue. Your server must send not just your certificate, but also any intermediate certificates in the chain. Without them, some browsers will reject your certificate. &lt;strong&gt;Mixed content&lt;/strong&gt; occurs when your HTTPS page loads resources - images, scripts, fonts - over HTTP. This breaks the secure connection and shows security warnings. &lt;strong&gt;Expired certificates&lt;/strong&gt; are entirely avoidable with automation. &lt;strong&gt;Self-signed certificates&lt;/strong&gt; are only appropriate for internal development - they will never be trusted by browsers for public-facing sites.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is the difference between SSL and TLS?&lt;/strong&gt; TLS is the modern, secure replacement for SSL. The term "SSL" is still used colloquially but all modern secure connections actually use TLS 1.2 or 1.3. SSL 2.0 and SSL 3.0 are broken and should never be used.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How often should I renew my SSL certificate?&lt;/strong&gt; Let's Encrypt certificates are valid for 90 days and should be renewed automatically every 60 days. Commercial certificates typically last one year. Always use automation - manual renewal is error-prone and frequently forgotten.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can a free certificate be as secure as a paid one?&lt;/strong&gt; Yes, completely. The encryption strength is identical. The only difference is the level of identity verification and whether a financial warranty is included. For most websites, a free Let's Encrypt certificate is the right choice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why does my site show "Not Secure" even though I have a certificate?&lt;/strong&gt; The most common cause is mixed content - your HTTPS page is loading some resources over HTTP. Open your browser's developer console and look for Mixed Content warnings. Update all resource URLs to use HTTPS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is a downgrade attack?&lt;/strong&gt; An attacker positioned between your visitor and your server tricks the browser into connecting over HTTP or an older, weaker version of TLS. HSTS prevents this by instructing browsers to always use HTTPS, and the preload list ensures this protection applies from the very first visit.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://fortifynet.com/blog/ssl-tls-certificate-security" rel="noopener noreferrer"&gt;fortifynet.com/blog/ssl-tls-certificate-security&lt;/a&gt;. I'm the founder of FortifyNet, a website security scanner; this article comes from our blog, so factor in that founder bias when you read any tool recommendations here.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ssl</category>
      <category>tls</category>
      <category>https</category>
      <category>certificate</category>
    </item>
    <item>
      <title>GTmetrix Alternative: 6 Best Options in 2026 | FortifyNet</title>
      <dc:creator>Håkan Fägnell</dc:creator>
      <pubDate>Mon, 10 Aug 2026 04:45:29 +0000</pubDate>
      <link>https://dev.to/hkan_fgnell_322b4aba3d6/gtmetrix-alternative-6-best-options-in-2026-fortifynet-17m</link>
      <guid>https://dev.to/hkan_fgnell_322b4aba3d6/gtmetrix-alternative-6-best-options-in-2026-fortifynet-17m</guid>
      <description>&lt;p&gt;The best GTmetrix alternative depends on what pushed you away in the first place. If the free plan is the problem, &lt;strong&gt;WebPageTest Starter&lt;/strong&gt; gives you 150 test runs per month at no cost, against GTmetrix Basic's 5 tests per month for three months (&lt;a href="https://gtmetrix.com/free-plan-features.html" rel="noopener noreferrer"&gt;GTmetrix&lt;/a&gt;, August 2026). If you want field data straight from Google, &lt;strong&gt;PageSpeed Insights&lt;/strong&gt; is free and uncapped. And if you want to know whether a slow page is also an exposed page, &lt;strong&gt;FortifyNet&lt;/strong&gt; checks performance next to SSL/TLS, DNS, email authentication and security headers in one 60-second scan.&lt;/p&gt;

&lt;p&gt;Below is an honest comparison of six options, with current prices and limits taken from each vendor's own pricing page in August 2026.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1449965408869-eaa3f722e40d%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1600%26q%3D80" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1449965408869-eaa3f722e40d%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1600%26q%3D80" alt="A speedometer needle sweeping through its range, used as a metaphor for measuring website load speed" width="1600" height="1067"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why people start looking for a GTmetrix alternative
&lt;/h2&gt;

&lt;p&gt;GTmetrix is still a good tool. It is the free tier that changed. A GTmetrix Basic account today gets &lt;strong&gt;5 On-Demand tests per month for three months&lt;/strong&gt;, testing from two locations (Seattle and London), with one month of monitoring history (&lt;a href="https://gtmetrix.com/free-plan-features.html" rel="noopener noreferrer"&gt;GTmetrix free plan features&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;That is enough to look at a page once. It is not enough to iterate: change a setting, retest, compare, retest again. A single afternoon of optimisation work can burn a month's allowance.&lt;/p&gt;

&lt;p&gt;The paid tiers are reasonably priced but tightly scoped at the bottom. The entry Lite plan is $5.99/month billed monthly, or $59.90 billed yearly, and it includes 50 On-Demand tests, &lt;strong&gt;1 monitored slot&lt;/strong&gt;, 5 test locations and just &lt;strong&gt;1 month of data retention&lt;/strong&gt;. You need the Advanced plan at $29.99/month (or $299.90/year) before you get unlimited on-demand tests, hourly monitoring, 10 monitored slots and 25 locations (&lt;a href="https://gtmetrix.com/pricing.html" rel="noopener noreferrer"&gt;GTmetrix pricing&lt;/a&gt;, August 2026).&lt;/p&gt;

&lt;p&gt;If you manage more than one site, or you want a year of history to prove a regression to a client, that is where the search for an alternative usually starts.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually matters when you compare speed tools
&lt;/h2&gt;

&lt;p&gt;Before the table, three things worth being clear about.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lab data and field data are not the same thing.&lt;/strong&gt; A GTmetrix or WebPageTest run is &lt;em&gt;lab data&lt;/em&gt;: one synthetic load, from one machine, on one connection. Google's Core Web Vitals assessment uses &lt;em&gt;field data&lt;/em&gt;, real visits from real Chrome users, evaluated at the &lt;strong&gt;75th percentile&lt;/strong&gt;. A tool can show you a beautiful lab score while your actual users are failing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The 2026 thresholds are unchanged.&lt;/strong&gt; To pass Core Web Vitals a page needs LCP under 2.5 seconds, INP under 200 milliseconds and CLS under 0.1, each at the 75th percentile of real users. Poor starts at LCP over 4 seconds, INP over 500 milliseconds and CLS over 0.25 (&lt;a href="https://web.dev/articles/defining-core-web-vitals-thresholds" rel="noopener noreferrer"&gt;web.dev&lt;/a&gt;). INP replaced FID as the responsiveness metric, so any tool still reporting FID as a Core Web Vital is out of date.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Retention is the sleeper feature.&lt;/strong&gt; Scores are easy to get. Proving that last Tuesday's deploy is what slowed the page down requires history. This is exactly where free tiers differ most.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 6 best GTmetrix alternatives compared
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Free tier&lt;/th&gt;
&lt;th&gt;Paid from&lt;/th&gt;
&lt;th&gt;Free test locations&lt;/th&gt;
&lt;th&gt;Data retention (free)&lt;/th&gt;
&lt;th&gt;Field data (CrUX)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;WebPageTest&lt;/strong&gt; (Catchpoint)&lt;/td&gt;
&lt;td&gt;150 test runs/mo&lt;/td&gt;
&lt;td&gt;$180/yr (1,000 runs/mo)&lt;/td&gt;
&lt;td&gt;30 worldwide&lt;/td&gt;
&lt;td&gt;60 days&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Google PageSpeed Insights&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Unlimited, no account&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Google infrastructure&lt;/td&gt;
&lt;td&gt;Not stored&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;FortifyNet&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Full 60-second audit&lt;/td&gt;
&lt;td&gt;Freemium&lt;/td&gt;
&lt;td&gt;Global&lt;/td&gt;
&lt;td&gt;Scan history in account&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Pingdom&lt;/strong&gt; (SolarWinds)&lt;/td&gt;
&lt;td&gt;None, 14-day trial&lt;/td&gt;
&lt;td&gt;~$15/mo synthetic&lt;/td&gt;
&lt;td&gt;Paid only&lt;/td&gt;
&lt;td&gt;Paid only&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DebugBear&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;None, 14-day trial&lt;/td&gt;
&lt;td&gt;Paid only&lt;/td&gt;
&lt;td&gt;Paid only&lt;/td&gt;
&lt;td&gt;Paid only&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Chrome DevTools / Lighthouse&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Unlimited, local&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Your own machine&lt;/td&gt;
&lt;td&gt;Not stored&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;GTmetrix (for reference)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;5 tests/mo for 3 mo&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;$5.99/mo&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;2 (Seattle, London)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;1 month&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Yes, 1-month CrUX&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Sources: vendor pricing pages, August 2026. Pingdom and DebugBear entry prices vary between resellers and are quoted as approximate.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. WebPageTest, the closest like-for-like swap
&lt;/h3&gt;

&lt;p&gt;If you liked GTmetrix's waterfall charts and filmstrips, WebPageTest is the natural move. The free Starter plan includes &lt;strong&gt;150 test runs per month&lt;/strong&gt;, 30 global test locations, filmstrip and video capture, Lighthouse, the Opportunities report and &lt;strong&gt;60 days of test history&lt;/strong&gt; (&lt;a href="https://www.catchpoint.com/pricing" rel="noopener noreferrer"&gt;Catchpoint pricing&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;WebPageTest Pro starts at $180/year for 1,000 runs per month and adds scheduled tests, alerts, the API, private tests, bulk testing, 35 locations including mainland China, up to 5 team seats and 13 months of retention. Note that a "test run" is a single page load, so a test with first and repeat views counts as two.&lt;/p&gt;

&lt;p&gt;Best for: developers who want depth, and anyone whose main complaint about GTmetrix was the test allowance.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Google PageSpeed Insights, the free authority
&lt;/h3&gt;

&lt;p&gt;PageSpeed Insights is the only tool on this list that shows you the exact field data Google uses for the Core Web Vitals assessment, drawn from the Chrome User Experience Report. It is free, uncapped and needs no account.&lt;/p&gt;

&lt;p&gt;The trade-off is that it stores nothing. There is no history, no monitoring, no alerts, no comparison between two runs. Use it as the referee, not the workbench. We cover this in more depth in our &lt;a href="https://fortifynet.com/blog/google-pagespeed-alternative" rel="noopener noreferrer"&gt;Google PageSpeed alternatives comparison&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Best for: confirming whether Google thinks your page passes.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. FortifyNet, when speed is only half the question
&lt;/h3&gt;

&lt;p&gt;Most speed tools answer "is this page fast?" and stop. A slow page is often a symptom of something else: an expired or misconfigured certificate adding handshake delays, DNS that resolves slowly, third-party scripts nobody audited, missing compression.&lt;/p&gt;

&lt;p&gt;FortifyNet's free 60-second scan runs performance checks alongside SSL/TLS configuration, DNS records, email authentication (SPF, DKIM and DMARC), HTTP security headers and dark-web exposure for your domain, then gives you one prioritised list. If you are the only technical person at a small company, one report beats five tabs.&lt;/p&gt;

&lt;p&gt;Best for: site owners who want the performance and security picture together rather than a specialist speed lab.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Pingdom, for uptime plus speed
&lt;/h3&gt;

&lt;p&gt;Pingdom's strength was never really page analysis, it is availability monitoring: is the site up, from where, and who gets paged. SolarWinds retired the free tier, so you now start with a 14-day trial, and synthetic monitoring plans begin around $15/month and scale with the number of checks.&lt;/p&gt;

&lt;p&gt;Best for: teams whose real requirement is uptime alerting, with speed as a bonus.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. DebugBear, for continuous Core Web Vitals
&lt;/h3&gt;

&lt;p&gt;DebugBear is a specialist: scheduled synthetic tests plus real user monitoring, built specifically around Core Web Vitals and Lighthouse trends. There is no free tier, only a 14-day trial, and the entry plan is limited to a single project, which matters if you are an agency.&lt;/p&gt;

&lt;p&gt;Best for: performance engineers who need field and lab data in one dashboard and have budget for it.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Chrome DevTools and Lighthouse CLI, free and local
&lt;/h3&gt;

&lt;p&gt;The tool already on your machine. Open DevTools, run a Lighthouse audit, and you get the same engine PageSpeed Insights uses in its lab section, with unlimited runs and no queue. For automation, the Lighthouse CLI runs from npm as &lt;code&gt;npx lighthouse&lt;/code&gt; and outputs JSON or HTML you can commit to a repo.&lt;/p&gt;

&lt;p&gt;The catch: it tests from your machine, on your connection, with your extensions. Results are not comparable to a clean cloud test unless you are careful.&lt;/p&gt;

&lt;p&gt;Best for: developers iterating locally before running a public test.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1551288049-bebda4e38f71%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1200%26q%3D80" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1551288049-bebda4e38f71%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1200%26q%3D80" alt="A laptop screen showing web analytics charts and performance metrics" width="1200" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Free-tier limits, side by side
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fquickchart.io%2Fchart%3Fw%3D700%26h%3D300%26c%3D%257B%2522type%2522%253A%2520%2522bar%2522%252C%2520%2522data%2522%253A%2520%257B%2522labels%2522%253A%2520%255B%2522WebPageTest%2520Starter%2522%252C%2520%2522GTmetrix%2520Basic%2522%252C%2520%2522Pingdom%2522%252C%2520%2522DebugBear%2522%255D%252C%2520%2522datasets%2522%253A%2520%255B%257B%2522label%2522%253A%2520%2522Free%2520tests%252Fmonth%2522%252C%2520%2522data%2522%253A%2520%255B150%252C%25205%252C%25200%252C%25200%255D%252C%2520%2522backgroundColor%2522%253A%2520%2522%25232563eb%2522%257D%255D%257D%252C%2520%2522options%2522%253A%2520%257B%2522indexAxis%2522%253A%2520%2522y%2522%252C%2520%2522plugins%2522%253A%2520%257B%2522title%2522%253A%2520%257B%2522display%2522%253A%2520true%252C%2520%2522text%2522%253A%2520%2522Free-tier%2520tests%2520per%2520month%2520%2528Aug%25202026%2529%2522%257D%252C%2520%2522legend%2522%253A%2520%257B%2522display%2522%253A%2520false%257D%257D%257D%257D" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fquickchart.io%2Fchart%3Fw%3D700%26h%3D300%26c%3D%257B%2522type%2522%253A%2520%2522bar%2522%252C%2520%2522data%2522%253A%2520%257B%2522labels%2522%253A%2520%255B%2522WebPageTest%2520Starter%2522%252C%2520%2522GTmetrix%2520Basic%2522%252C%2520%2522Pingdom%2522%252C%2520%2522DebugBear%2522%255D%252C%2520%2522datasets%2522%253A%2520%255B%257B%2522label%2522%253A%2520%2522Free%2520tests%252Fmonth%2522%252C%2520%2522data%2522%253A%2520%255B150%252C%25205%252C%25200%252C%25200%255D%252C%2520%2522backgroundColor%2522%253A%2520%2522%25232563eb%2522%257D%255D%257D%252C%2520%2522options%2522%253A%2520%257B%2522indexAxis%2522%253A%2520%2522y%2522%252C%2520%2522plugins%2522%253A%2520%257B%2522title%2522%253A%2520%257B%2522display%2522%253A%2520true%252C%2520%2522text%2522%253A%2520%2522Free-tier%2520tests%2520per%2520month%2520%2528Aug%25202026%2529%2522%257D%252C%2520%2522legend%2522%253A%2520%257B%2522display%2522%253A%2520false%257D%257D%257D%257D" alt="Bar chart comparing free monthly test allowances: WebPageTest Starter 150, GTmetrix Basic 5, Pingdom 0, DebugBear 0" width="1400" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Free monthly test allowances, August 2026. PageSpeed Insights and local Lighthouse runs are uncapped and are excluded from the chart.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How to switch without losing your baseline
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Export what you have.&lt;/strong&gt; Before your GTmetrix retention window closes, screenshot or export the reports you might need as evidence later. On Basic, history is short.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Record a reference run.&lt;/strong&gt; Test your three most important pages in the new tool on the same day, same location, same connection setting. That becomes your new baseline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Match the analysis options.&lt;/strong&gt; A GTmetrix score taken from London on a throttled connection will not match a WebPageTest run from Dulles on cable. Fix location, device and throttling before comparing anything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check the field data separately.&lt;/strong&gt; Run PageSpeed Insights on the same URLs and note the 75th-percentile LCP, INP and CLS. Lab numbers guide your work, field numbers decide whether you pass.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set up monitoring on one page first.&lt;/strong&gt; Most free tiers allow a single monitored page. Pick the highest-traffic entry page rather than the homepage if they differ.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Which one should you pick?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Want the closest replacement with a generous free tier: &lt;strong&gt;WebPageTest&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Want to know if Google thinks you pass: &lt;strong&gt;PageSpeed Insights&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Want performance and security in one report: &lt;strong&gt;FortifyNet&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Want alerts when the site goes down: &lt;strong&gt;Pingdom&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Want continuous Core Web Vitals with real user data: &lt;strong&gt;DebugBear&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Want to iterate locally at zero cost: &lt;strong&gt;Chrome DevTools&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For most small businesses, the practical answer is a pair: WebPageTest or FortifyNet for the working audit, and PageSpeed Insights as the final check against Google's own field data.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is GTmetrix still free in 2026?&lt;/strong&gt;&lt;br&gt;
There is still a free GTmetrix Basic account, but it is limited to 5 On-Demand tests per month for three months, two test locations and one month of data retention. It is a trial in practice rather than an ongoing free tier.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which GTmetrix alternative is the most accurate?&lt;/strong&gt;&lt;br&gt;
No lab tool is definitive, because lab tests are single synthetic loads. For the numbers Google actually uses in ranking, PageSpeed Insights field data (or Search Console's Core Web Vitals report) is authoritative. Lab tools are for diagnosis, not verdicts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why does my GTmetrix grade differ from my PageSpeed score?&lt;/strong&gt;&lt;br&gt;
Because they weight different metrics and test from different places under different network conditions. Chasing identical numbers across tools is wasted effort. Pick one lab tool, keep its settings constant, and track the trend.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can a slow site hurt my search rankings?&lt;/strong&gt;&lt;br&gt;
Core Web Vitals are part of Google's page experience signals, assessed on field data at the 75th percentile. They are one input among many, not a switch. A page that fails badly is at a disadvantage; a page that passes comfortably gains no special boost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do security issues affect page speed?&lt;/strong&gt;&lt;br&gt;
They can. Misconfigured TLS, redirect chains from HTTP to HTTPS to www, slow DNS resolution and unaudited third-party scripts all add real milliseconds before your content starts rendering.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check speed and security in the same scan
&lt;/h2&gt;

&lt;p&gt;A fast site that leaks email through a missing DMARC record is still a liability. FortifyNet's free scan takes about 60 seconds, needs no account and covers SSL/TLS, DNS, SPF, DKIM, DMARC, HTTP security headers, dark-web exposure and performance in one prioritised report.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://fortifynet.com" rel="noopener noreferrer"&gt;Run your free FortifyNet scan&lt;/a&gt;&lt;/strong&gt; and see the whole picture, not just the speed number.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related guides
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fortifynet.com/blog/google-pagespeed-alternative" rel="noopener noreferrer"&gt;Best Google PageSpeed alternatives in 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fortifynet.com/blog/core-web-vitals-2026" rel="noopener noreferrer"&gt;Core Web Vitals 2026: what you need to know for your Google ranking&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fortifynet.com/blog/website-security-checklist" rel="noopener noreferrer"&gt;Website security checklist: 12 essential steps for 2026&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://fortifynet.com/blog/gtmetrix-alternative" rel="noopener noreferrer"&gt;fortifynet.com/blog/gtmetrix-alternative&lt;/a&gt;. I'm the founder of FortifyNet, a website security scanner; this article comes from our blog, so factor in that founder bias when you read any tool recommendations here.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>gtmetrix</category>
      <category>sitespeed</category>
      <category>corewebvitals</category>
      <category>performance</category>
    </item>
    <item>
      <title>Dark Web Monitoring Guide for Businesses 2026</title>
      <dc:creator>Håkan Fägnell</dc:creator>
      <pubDate>Sun, 09 Aug 2026 04:45:29 +0000</pubDate>
      <link>https://dev.to/hkan_fgnell_322b4aba3d6/dark-web-monitoring-guide-for-businesses-2026-35ml</link>
      <guid>https://dev.to/hkan_fgnell_322b4aba3d6/dark-web-monitoring-guide-for-businesses-2026-35ml</guid>
      <description>&lt;h2&gt;
  
  
  What Is the Dark Web?
&lt;/h2&gt;

&lt;p&gt;The internet is not one uniform space - it has layers. The surface web is the part you access through Google, Bing, or any other search engine. It represents only a small fraction of all internet content. The deep web is the much larger portion of the internet that is not indexed by search engines - your email inbox, your bank's internal pages, corporate intranets, and databases all live here. The dark web is a specific portion of the deep web that is intentionally hidden and can only be accessed using specialized software, most commonly the Tor browser.&lt;/p&gt;

&lt;p&gt;The dark web is not inherently criminal. It has legitimate uses: investigative journalists use it to communicate with sources in countries where press freedom is restricted, activists in authoritarian regimes use it to organize safely, and privacy advocates use it to avoid surveillance. However, it is also home to criminal marketplaces where stolen data is bought and sold at scale.&lt;/p&gt;

&lt;p&gt;When a data breach occurs at any company that holds your data - a social media platform, a software tool your employees use, a healthcare provider, an e-commerce site - that stolen data often ends up for sale on dark web marketplaces within hours or days of the breach. The buyers are typically other cybercriminals who use the credentials to attack corporate systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Credentials End Up Compromising Your Business
&lt;/h2&gt;

&lt;p&gt;The path from a third-party data breach to a successful attack on your organization typically works as follows. A breach occurs at some service - LinkedIn, Adobe, Dropbox, Trello - any platform that your employees happen to use with their work email address. Millions of email and password combinations are extracted and sold on dark web forums.&lt;/p&gt;

&lt;p&gt;The buyers of this data run automated "credential stuffing" attacks. They take the list of breached email/password combinations and systematically test them against corporate login portals - your VPN, your email platform (Microsoft 365 or Google Workspace), your HR system, your project management tools. If even one employee has reused the same password across their personal account on the breached service and their corporate account, the attacker gains access.&lt;/p&gt;

&lt;p&gt;This is not theoretical. Credential stuffing is the cause of a significant portion of corporate account takeovers. Research consistently shows that 60-70% of people reuse passwords across multiple services. This means that a breach at one company creates a risk vector for your organization even though you were not the breached party.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Dark Web Monitoring Works
&lt;/h2&gt;

&lt;p&gt;Dark web monitoring services - like the capability built into FortifyNet - continuously monitor known breach databases, dark web forums, and paste sites for credentials associated with your organization's domain. When they find an email address ending in your domain in a breach database, they alert you.&lt;/p&gt;

&lt;p&gt;FortifyNet uses the HaveIBeenPwned (HIBP) API, built by security researcher Troy Hunt. HIBP is the largest and most comprehensive publicly available database of compromised credentials, containing over 14 billion records from thousands of breaches. The database is updated whenever new breach data becomes available, which means you receive alerts not just about historical breaches but about new ones as they emerge.&lt;/p&gt;

&lt;p&gt;An important technical note: the way FortifyNet queries this database protects your privacy. Rather than sending your email addresses or passwords to the API, it uses a technique called k-anonymity. Only the first five characters of a hashed credential are sent - enough to look up a list of potential matches, which are then compared locally. Your actual credentials are never transmitted.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding What Breach Data Tells You
&lt;/h2&gt;

&lt;p&gt;When FortifyNet detects that credentials from your domain are exposed, you will see specific information about each breach: which service was compromised, what types of data were exposed (email addresses, passwords, names, phone numbers, and so on), when the breach occurred, and how many records from your domain were involved.&lt;/p&gt;

&lt;p&gt;This information is actionable. If the breach occurred in 2018 and exposed only email addresses (not passwords), the risk level is lower - but those email addresses can still be used for targeted phishing. If the breach exposed password hashes from 2022, those hashes may have already been cracked and the plaintext passwords circulated. Even old breaches matter because password reuse means a five-year-old breach can still unlock accounts today.&lt;/p&gt;

&lt;h2&gt;
  
  
  Incident Response When Credentials Are Found
&lt;/h2&gt;

&lt;p&gt;Discovering that your organization's credentials appear in breach databases requires an immediate, structured response. The priority in the first 24 hours is to contain the exposure: identify every affected email address and account, force immediate password resets for those accounts, enable or verify that multi-factor authentication (MFA) is active on all affected accounts, and review access logs for those accounts over the past 90 days to identify any suspicious activity that may have already occurred.&lt;/p&gt;

&lt;p&gt;Within the first week, the focus shifts to prevention and communication: notify affected employees (frame this as a security alert to help them, not as an accusation), conduct awareness training on password hygiene and the risks of password reuse, review whether those accounts had access to sensitive systems that may have been compromised, and consider whether any data that those accounts could access may now be at risk.&lt;/p&gt;

&lt;p&gt;If your organization is subject to GDPR and the breach involves personal data of EU citizens, you may have an obligation to notify your supervisory authority within 72 hours of becoming aware of a breach. This is why having a monitoring service that alerts you promptly is valuable - it starts the clock for your notification obligation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preventing Future Exposures
&lt;/h2&gt;

&lt;p&gt;The most effective preventive measures are also the simplest. Requiring strong, unique passwords enforced through a corporate password manager eliminates the password reuse problem at its root. When employees use different passwords everywhere, a breach at one service cannot compromise their corporate accounts.&lt;/p&gt;

&lt;p&gt;Multi-factor authentication (MFA) is the single most effective control for preventing account takeover even when credentials are compromised. An attacker who obtains a correct password still cannot log in without the second factor. Hardware security keys (FIDO2/WebAuthn) are the strongest form of MFA because they are phishing-resistant - they cryptographically bind the authentication to the specific website being logged into, making it impossible for a phishing site to steal the factor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;How many breached accounts is serious?&lt;/strong&gt; Any number. Even one exposed account belonging to an employee with elevated privileges - an IT administrator, a financial approver, an HR manager - can be catastrophic. Treat every alert as high priority regardless of count.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We use Google Workspace and they have strong security. Are we still at risk?&lt;/strong&gt; Yes. The risk is not Google being breached - it is your employees using the same password for their Google account that they used for some other service that was breached. Google's security is excellent, but it cannot protect against correct passwords being used.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How long does it take for breached data to appear in monitoring services?&lt;/strong&gt; Major breaches are typically discovered and added to databases like HIBP within days to weeks of the breach becoming known. However, some breaches circulate privately on dark web forums for months before becoming public. This is why continuous monitoring matters - the data keeps expanding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We changed all passwords after a breach alert. Are we safe?&lt;/strong&gt; Yes, if you also enabled MFA on affected accounts. Passwords alone are not sufficient - MFA ensures that even if future credentials are compromised, attackers cannot use them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Should we tell affected employees which specific service their credentials came from?&lt;/strong&gt; Yes. Employees should know so they can also change their passwords on that personal service, and so they understand the specific risk. Transparency builds security culture rather than undermining it.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://fortifynet.com/blog/dark-web-monitoring-guide" rel="noopener noreferrer"&gt;fortifynet.com/blog/dark-web-monitoring-guide&lt;/a&gt;. I'm the founder of FortifyNet, a website security scanner; this article comes from our blog, so factor in that founder bias when you read any tool recommendations here.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>darkweb</category>
      <category>databreach</category>
      <category>credentialexposure</category>
      <category>haveibeenpwned</category>
    </item>
    <item>
      <title>GDPR Compliance Security Audit Guide 2026 | FortifyNet</title>
      <dc:creator>Håkan Fägnell</dc:creator>
      <pubDate>Sat, 08 Aug 2026 04:45:29 +0000</pubDate>
      <link>https://dev.to/hkan_fgnell_322b4aba3d6/gdpr-compliance-security-audit-guide-2026-fortifynet-5a1d</link>
      <guid>https://dev.to/hkan_fgnell_322b4aba3d6/gdpr-compliance-security-audit-guide-2026-fortifynet-5a1d</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Disclaimer:&lt;/strong&gt; This article is a general educational guide and does not constitute legal advice. Laws and regulations may vary depending on your country, industry, and specific situation. Always consult a qualified legal advisor or data protection specialist for guidance tailored to your organization.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Introduction: What This Guide Covers
&lt;/h2&gt;

&lt;p&gt;GDPR can feel overwhelming - especially when you're running a website and trying to understand what it actually means for your day-to-day operations. This guide breaks down the key technical and organizational areas you should be aware of, in plain language.&lt;/p&gt;

&lt;p&gt;We're not here to scare you. Most of what GDPR requires for websites is practical common sense: keep your systems secure, be transparent about what data you collect, and have a plan if something goes wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Core Idea: "Appropriate Security"
&lt;/h2&gt;

&lt;p&gt;At its heart, GDPR's Article 32 asks organizations to implement security measures that are "appropriate to the risk." This means there's no single checklist - your obligations depend on what kind of data you handle and how sensitive it is.&lt;/p&gt;

&lt;p&gt;A small blog that collects newsletter sign-ups has different requirements than a healthcare platform handling medical records. But for almost any website that collects personal data, some baseline security measures are generally expected:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;HTTPS/SSL&lt;/strong&gt; - encrypted connections between your website and visitors&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Access controls&lt;/strong&gt; - limiting who can access personal data internally&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Incident detection&lt;/strong&gt; - knowing when something goes wrong&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regular security reviews&lt;/strong&gt; - checking that your protections are still working&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One important thing: you need to be able to &lt;strong&gt;show&lt;/strong&gt; that you're doing these things, not just say you are. Documentation matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cookies: More Than Just a Banner
&lt;/h2&gt;

&lt;p&gt;Cookie consent is one of the most visible parts of GDPR compliance - and also one of the most commonly misunderstood.&lt;/p&gt;

&lt;p&gt;The basic rule: any cookie that isn't strictly necessary for your website to function requires the visitor's &lt;strong&gt;prior, informed consent&lt;/strong&gt;. That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Analytics tools like Google Analytics need consent&lt;/li&gt;
&lt;li&gt;Marketing pixels (Facebook, LinkedIn, etc.) need consent&lt;/li&gt;
&lt;li&gt;Session cookies for login are generally necessary and don't need consent&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A valid consent mechanism means the user can easily say no just as easily as yes. Pre-ticked boxes don't count. A huge "Accept All" button next to a tiny grey "Manage settings" link is also problematic.&lt;/p&gt;

&lt;p&gt;And here's the technical detail that trips up many websites: &lt;strong&gt;cookies must not be set before consent is given&lt;/strong&gt;. Many sites load tracking scripts in the background while the consent banner is still showing - this is a violation regardless of what the banner says.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your Privacy Policy
&lt;/h2&gt;

&lt;p&gt;A privacy policy is a legal requirement if you collect any personal data. But it needs to contain specific information, not just general statements.&lt;/p&gt;

&lt;p&gt;At a minimum, it should explain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who is collecting the data (your organization's name and contact)&lt;/li&gt;
&lt;li&gt;What data you collect and why&lt;/li&gt;
&lt;li&gt;What legal basis you're using (consent, legitimate interest, etc.)&lt;/li&gt;
&lt;li&gt;Who you share data with&lt;/li&gt;
&lt;li&gt;How long you keep the data&lt;/li&gt;
&lt;li&gt;What rights users have (access, deletion, correction, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vague statements like "we may share data with partners" typically don't meet the standard. Be specific.&lt;/p&gt;

&lt;h2&gt;
  
  
  If Something Goes Wrong: Breach Notification
&lt;/h2&gt;

&lt;p&gt;If you have a personal data breach - someone gains unauthorized access to your users' data - you may have legal obligations to report it.&lt;/p&gt;

&lt;p&gt;Under GDPR Article 33, you generally need to notify your national data protection authority within &lt;strong&gt;72 hours&lt;/strong&gt; of becoming aware of a breach, if it poses a risk to people's rights. In Sweden, that authority is IMY (Integritetsskyddsmyndigheten).&lt;/p&gt;

&lt;p&gt;This is why monitoring your systems matters - the faster you detect a problem, the more time you have to respond and report correctly.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: Not every incident needs to be reported. Whether a breach triggers notification obligations depends on the nature and severity of the incident. Consult legal advice for your specific situation.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A Note on NIS2
&lt;/h2&gt;

&lt;p&gt;The NIS2 Directive is an EU cybersecurity regulation that came into effect in October 2024. It applies to organizations in specific sectors (energy, healthcare, finance, digital infrastructure, and others) and sets stricter cybersecurity requirements than GDPR.&lt;/p&gt;

&lt;p&gt;If you're in one of these sectors, NIS2 is worth investigating further - ideally with a specialist who knows your industry. The incident reporting timelines under NIS2 are tighter than GDPR (24 hours for initial notification).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This guide doesn't cover NIS2 in depth, as its applicability varies greatly by organization type and country.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Do I need a Data Protection Officer (DPO)?&lt;/strong&gt;&lt;br&gt;
Most small and medium websites do not. A DPO is generally required if you're a public authority, or if your core business involves large-scale processing of sensitive data. When in doubt, check with a legal advisor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I need to register with a data protection authority?&lt;/strong&gt;&lt;br&gt;
In most EU countries, you don't need to proactively register. But you do need to maintain internal records of your data processing activities (called a RoPA).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I know if my website is technically compliant?&lt;/strong&gt;&lt;br&gt;
A security audit can help identify technical gaps - things like expired SSL certificates, missing security headers, or cookies firing before consent. Tools like FortifyNet can give you a quick overview of your website's technical security posture.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to Get Proper Legal Advice
&lt;/h2&gt;

&lt;p&gt;This guide is meant to give you a starting point - not a complete answer. GDPR compliance depends on your specific situation, the data you process, your country, and your industry.&lt;/p&gt;

&lt;p&gt;For proper guidance, consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your national data protection authority's website (e.g., &lt;a href="https://www.imy.se" rel="noopener noreferrer"&gt;imy.se&lt;/a&gt; for Sweden)&lt;/li&gt;
&lt;li&gt;A qualified data protection lawyer or consultant&lt;/li&gt;
&lt;li&gt;Your company's legal team if you have one&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Don't rely solely on blog articles (including this one!) for legal compliance decisions.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://fortifynet.com/blog/gdpr-compliance-security-audit" rel="noopener noreferrer"&gt;fortifynet.com/blog/gdpr-compliance-security-audit&lt;/a&gt;. I'm the founder of FortifyNet, a website security scanner; this article comes from our blog, so factor in that founder bias when you read any tool recommendations here.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>gdpr</category>
      <category>compliance</category>
      <category>imy</category>
      <category>dpo</category>
    </item>
    <item>
      <title>What Is DKIM? Email Signing Explained | FortifyNet</title>
      <dc:creator>Håkan Fägnell</dc:creator>
      <pubDate>Fri, 07 Aug 2026 04:45:29 +0000</pubDate>
      <link>https://dev.to/hkan_fgnell_322b4aba3d6/what-is-dkim-email-signing-explained-fortifynet-1a2</link>
      <guid>https://dev.to/hkan_fgnell_322b4aba3d6/what-is-dkim-email-signing-explained-fortifynet-1a2</guid>
      <description>&lt;p&gt;&lt;strong&gt;DKIM (DomainKeys Identified Mail) is an email authentication standard, defined in &lt;a href="https://datatracker.ietf.org/doc/html/rfc6376" rel="noopener noreferrer"&gt;RFC 6376&lt;/a&gt;, that attaches a cryptographic signature to every message your domain sends.&lt;/strong&gt; The receiving mail server looks up your public key in DNS, recomputes the signature over the message body and selected headers, and confirms two things: the mail really came from your domain, and nobody altered it in transit. If you send email from your own domain, DKIM is no longer a nice-to-have. Google and Yahoo have required it from bulk senders since February 2024, and Microsoft began rejecting non-compliant high-volume mail to Outlook.com, Hotmail.com and Live.com on 5 May 2025 (&lt;a href="https://techcommunity.microsoft.com/blog/microsoftdefenderforoffice365blog/strengthening-email-ecosystem-outlook%E2%80%99s-new-requirements-for-high%E2%80%90volume-senders/4399730" rel="noopener noreferrer"&gt;Microsoft Defender for Office 365 blog&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1596526131083-e8c633c948d2%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1600%26q%3D80" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1596526131083-e8c633c948d2%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1600%26q%3D80" alt="Envelope and padlock representing a cryptographically signed email message"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How DKIM actually works
&lt;/h2&gt;

&lt;p&gt;DKIM is a public-key signature scheme wrapped around SMTP. The flow has four steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;You generate a key pair.&lt;/strong&gt; The private key stays on your sending mail server or with your email provider. The public key is published in DNS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your server signs outbound mail.&lt;/strong&gt; It hashes the message body plus a chosen list of headers (From, Subject, Date and others), signs that hash with the private key, and inserts the result as a &lt;code&gt;DKIM-Signature:&lt;/code&gt; header.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The receiver fetches your public key.&lt;/strong&gt; It reads the domain (&lt;code&gt;d=&lt;/code&gt;) and selector (&lt;code&gt;s=&lt;/code&gt;) from the signature header and queries &lt;code&gt;&amp;lt;selector&amp;gt;._domainkey.&amp;lt;domain&amp;gt;&lt;/code&gt; for a TXT record.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The receiver verifies.&lt;/strong&gt; It recomputes the hash and checks it against the signature. A match means the signed parts of the message are authentic and unmodified.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Crucially, DKIM survives forwarding in a way SPF does not. SPF validates the connecting IP address, so it breaks the moment a mailing list or forwarder relays your message. A DKIM signature travels with the message itself, which is why DKIM alignment is usually the more durable half of a DMARC policy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Anatomy of a DKIM record
&lt;/h2&gt;

&lt;p&gt;A published DKIM record is a DNS TXT record at a selector-specific hostname. Here is a trimmed example for the selector &lt;code&gt;s1&lt;/code&gt; on &lt;code&gt;example.com&lt;/code&gt;, published at &lt;code&gt;s1._domainkey.example.com&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The tags you will meet most often:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tag&lt;/th&gt;
&lt;th&gt;Where it appears&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;v=&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;DNS record&lt;/td&gt;
&lt;td&gt;Version, always &lt;code&gt;DKIM1&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;k=&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;DNS record&lt;/td&gt;
&lt;td&gt;Key type: &lt;code&gt;rsa&lt;/code&gt; (default) or &lt;code&gt;ed25519&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;p=&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;DNS record&lt;/td&gt;
&lt;td&gt;The Base64 public key. An empty &lt;code&gt;p=&lt;/code&gt; revokes the key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;t=y&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;DNS record&lt;/td&gt;
&lt;td&gt;Testing mode. Receivers should not penalise failures&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;d=&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Signature header&lt;/td&gt;
&lt;td&gt;The signing domain, the one DMARC aligns against&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;s=&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Signature header&lt;/td&gt;
&lt;td&gt;Selector, so one domain can hold many keys&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;h=&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Signature header&lt;/td&gt;
&lt;td&gt;The list of headers covered by the signature&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bh=&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Signature header&lt;/td&gt;
&lt;td&gt;Hash of the canonicalised body&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;x=&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Signature header&lt;/td&gt;
&lt;td&gt;Signature expiry, as a Unix timestamp&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;One detail trips up almost everyone: a 2048-bit RSA public key is longer than the 255-byte limit for a single DNS character string, so it must be published as multiple quoted strings that the resolver concatenates. Some DNS panels do this silently, others do not, and a mis-chunked key fails verification without any visible error.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to set up DKIM in five steps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Generate a 2048-bit RSA key pair&lt;/strong&gt;, or let your provider generate it. Google Workspace, Microsoft 365, Zoho, Mailgun, SendGrid, Postmark and Amazon SES all issue keys from their admin consoles.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pick a descriptive selector.&lt;/strong&gt; Use one per sending source, for example &lt;code&gt;google1&lt;/code&gt;, &lt;code&gt;mg-2026a&lt;/code&gt;, &lt;code&gt;zoho._domainkey&lt;/code&gt;. Never reuse a selector across two systems.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Publish the TXT record&lt;/strong&gt; at &lt;code&gt;&amp;lt;selector&amp;gt;._domainkey.&amp;lt;yourdomain&amp;gt;&lt;/code&gt;. Wait for propagation, which usually takes minutes but can take up to the TTL of the parent zone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enable signing&lt;/strong&gt; in the sending platform. Publishing the key without turning on signing is the single most common half-finished DKIM deployment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verify.&lt;/strong&gt; Query the record from a terminal with &lt;code&gt;dig TXT s1._domainkey.example.com +short&lt;/code&gt;, then send a test message to a mailbox you control and read the &lt;code&gt;Authentication-Results:&lt;/code&gt; header. You want to see &lt;code&gt;dkim=pass&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Repeat this for every system that sends as your domain: your mail host, your marketing platform, your invoicing tool, your helpdesk. Each one needs its own selector and its own key.&lt;/p&gt;

&lt;h2&gt;
  
  
  DKIM vs SPF vs DMARC
&lt;/h2&gt;

&lt;p&gt;The three standards are complementary, not alternatives. DKIM proves integrity, SPF authorises the sending path, and DMARC ties either result back to the visible From address and tells receivers what to do on failure.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;SPF&lt;/th&gt;
&lt;th&gt;DKIM&lt;/th&gt;
&lt;th&gt;DMARC&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Defined in&lt;/td&gt;
&lt;td&gt;RFC 7208&lt;/td&gt;
&lt;td&gt;RFC 6376&lt;/td&gt;
&lt;td&gt;RFC 7489&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What it validates&lt;/td&gt;
&lt;td&gt;Sending IP address&lt;/td&gt;
&lt;td&gt;Message signature&lt;/td&gt;
&lt;td&gt;Alignment of SPF or DKIM with the From domain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Survives forwarding&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Depends on DKIM surviving&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Crypto involved&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Public-key signature&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DNS records needed&lt;/td&gt;
&lt;td&gt;One TXT per domain&lt;/td&gt;
&lt;td&gt;One TXT per selector&lt;/td&gt;
&lt;td&gt;One TXT at &lt;code&gt;_dmarc&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typical failure cause&lt;/td&gt;
&lt;td&gt;Exceeding 10 DNS lookups&lt;/td&gt;
&lt;td&gt;Missing or mis-chunked key&lt;/td&gt;
&lt;td&gt;Neither mechanism aligned&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reporting built in&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes, aggregate and forensic&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fquickchart.io%2Fchart%3Fw%3D700%26h%3D380%26c%3D%257B%2522type%2522%253A%2520%2522bar%2522%252C%2520%2522data%2522%253A%2520%257B%2522labels%2522%253A%2520%255B%2522SPF%2522%252C%2520%2522DMARC%2522%252C%2520%2522DKIM%2522%255D%252C%2520%2522datasets%2522%253A%2520%255B%257B%2522label%2522%253A%2520%2522%2525%2520of%2520domains%2522%252C%2520%2522data%2522%253A%2520%255B56.0%252C%252030.4%252C%252022.7%255D%252C%2520%2522backgroundColor%2522%253A%2520%255B%2522%25232563eb%2522%252C%2520%2522%25237c3aed%2522%252C%2520%2522%25230ea5e9%2522%255D%257D%255D%257D%252C%2520%2522options%2522%253A%2520%257B%2522title%2522%253A%2520%257B%2522display%2522%253A%2520true%252C%2520%2522text%2522%253A%2520%2522Email%2520authentication%2520adoption%252C%25205.5M%2520domains%2520%2528Feb%25202026%2529%2522%257D%252C%2520%2522legend%2522%253A%2520%257B%2522display%2522%253A%2520true%257D%252C%2520%2522scales%2522%253A%2520%257B%2522yAxes%2522%253A%2520%255B%257B%2522ticks%2522%253A%2520%257B%2522beginAtZero%2522%253A%2520true%252C%2520%2522max%2522%253A%252060%257D%257D%255D%257D%257D%257D" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fquickchart.io%2Fchart%3Fw%3D700%26h%3D380%26c%3D%257B%2522type%2522%253A%2520%2522bar%2522%252C%2520%2522data%2522%253A%2520%257B%2522labels%2522%253A%2520%255B%2522SPF%2522%252C%2520%2522DMARC%2522%252C%2520%2522DKIM%2522%255D%252C%2520%2522datasets%2522%253A%2520%255B%257B%2522label%2522%253A%2520%2522%2525%2520of%2520domains%2522%252C%2520%2522data%2522%253A%2520%255B56.0%252C%252030.4%252C%252022.7%255D%252C%2520%2522backgroundColor%2522%253A%2520%255B%2522%25232563eb%2522%252C%2520%2522%25237c3aed%2522%252C%2520%2522%25230ea5e9%2522%255D%257D%255D%257D%252C%2520%2522options%2522%253A%2520%257B%2522title%2522%253A%2520%257B%2522display%2522%253A%2520true%252C%2520%2522text%2522%253A%2520%2522Email%2520authentication%2520adoption%252C%25205.5M%2520domains%2520%2528Feb%25202026%2529%2522%257D%252C%2520%2522legend%2522%253A%2520%257B%2522display%2522%253A%2520true%257D%252C%2520%2522scales%2522%253A%2520%257B%2522yAxes%2522%253A%2520%255B%257B%2522ticks%2522%253A%2520%257B%2522beginAtZero%2522%253A%2520true%252C%2520%2522max%2522%253A%252060%257D%257D%255D%257D%257D%257D" alt="Adoption of SPF, DMARC and DKIM across 5.5 million domains as of February 2026, showing SPF at 56.0 percent, DMARC at 30.4 percent and DKIM at 22.7 percent"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DKIM remains the least deployed of the three. A February 2026 scan of 5.5 million domains put SPF at 56.0%, DMARC at 30.4% and DKIM at 22.7% (&lt;a href="https://dmarcguard.io/research/email-authentication-2026/" rel="noopener noreferrer"&gt;DMARCguard research&lt;/a&gt;). The authors note DKIM is likely undercounted, because a scanner can only probe common selectors and cannot discover custom ones.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Key length, rotation, and the replay problem
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Use 2048-bit RSA.&lt;/strong&gt; RFC 8301 deprecated signing keys below 1024 bits, and NIST SP 800-57 treats 2048 bits as the current floor for RSA. 1024-bit keys still verify at most receivers but are on borrowed time. Going to 4096 bits buys little and makes DNS publishing harder.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rotate on a schedule.&lt;/strong&gt; RFC 6376 recommends periodic rotation without naming an interval; &lt;a href="https://www.m3aawg.org/DKIMKeyRotation" rel="noopener noreferrer"&gt;M3AAWG's best common practices&lt;/a&gt; and most operators land on every 6 to 12 months, or quarterly in regulated environments. Rotation is safe if you do it in the right order: publish the new selector, sign with the new key while the old record is still live, confirm passes in your DMARC aggregate reports, then remove the old record.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Understand DKIM replay.&lt;/strong&gt; In April 2025 a phishing campaign abused a legitimately signed Google message, re-sending it verbatim to new victims so it arrived with a valid &lt;code&gt;dkim=pass&lt;/code&gt; from google.com (&lt;a href="https://blog.redsift.com/email/what-is-a-dkim-replay-attack/" rel="noopener noreferrer"&gt;Red Sift analysis&lt;/a&gt;). Nothing about the signature was forged. The attack works because a DKIM signature says nothing about who sent the message or to whom. Two practical mitigations: &lt;strong&gt;oversign&lt;/strong&gt; the headers that matter by listing them in the &lt;code&gt;h=&lt;/code&gt; tag more times than they appear, which blocks an attacker from appending a second &lt;code&gt;To:&lt;/code&gt; or &lt;code&gt;Subject:&lt;/code&gt; header, and set a short signature expiry with the &lt;code&gt;x=&lt;/code&gt; tag to shrink the replay window.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common DKIM failures and what causes them
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Symptom&lt;/th&gt;
&lt;th&gt;Likely cause&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;dkim=none&lt;/code&gt; in headers&lt;/td&gt;
&lt;td&gt;Signing not enabled at the sender&lt;/td&gt;
&lt;td&gt;Turn on DKIM in the platform, not just DNS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dkim=permerror&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Record missing, or &lt;code&gt;p=&lt;/code&gt; mis-chunked&lt;/td&gt;
&lt;td&gt;Re-publish as split quoted strings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;dkim=fail&lt;/code&gt; on forwarded mail only&lt;/td&gt;
&lt;td&gt;A list or gateway rewrote the body or a signed header&lt;/td&gt;
&lt;td&gt;Ask the forwarder to use ARC, or rely on SPF alignment for that path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Passes for one system, fails for another&lt;/td&gt;
&lt;td&gt;A sending source has no selector of its own&lt;/td&gt;
&lt;td&gt;Add a dedicated key per source&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DMARC fails despite &lt;code&gt;dkim=pass&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;The &lt;code&gt;d=&lt;/code&gt; domain does not align with the From domain&lt;/td&gt;
&lt;td&gt;Sign with your own domain, not the provider's&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Does DKIM encrypt my email?&lt;/strong&gt;&lt;br&gt;
No. DKIM signs, it does not encrypt. Anyone who intercepts the message can still read it. Transport encryption is TLS, and content encryption is S/MIME or PGP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I have more than one DKIM record?&lt;/strong&gt;&lt;br&gt;
Yes, and you usually should. Each selector is a separate record, so one domain can carry a key for every sending platform you use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does DKIM alone stop spoofing?&lt;/strong&gt;&lt;br&gt;
No. A valid signature proves a message was signed by some domain, but receivers only act on that if a DMARC policy tells them to. DKIM plus DMARC at &lt;code&gt;p=quarantine&lt;/code&gt; or &lt;code&gt;p=reject&lt;/code&gt; is what actually blocks spoofed mail.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happens when I delete a DKIM key?&lt;/strong&gt;&lt;br&gt;
Any message still in flight that was signed with it will fail verification. To revoke deliberately, publish the record with an empty &lt;code&gt;p=&lt;/code&gt; rather than deleting it outright, so receivers see an explicit revocation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is Ed25519 ready to use?&lt;/strong&gt;&lt;br&gt;
Ed25519 signing is standardised in RFC 8463 and produces far shorter DNS records, but verifier support is still uneven. Dual-sign with RSA-2048 alongside it rather than switching outright.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related guides
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fortifynet.com/blog/how-to-set-up-dmarc" rel="noopener noreferrer"&gt;How to Set Up DMARC, Step by Step&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fortifynet.com/blog/spf-record-checker" rel="noopener noreferrer"&gt;SPF Record Checker: How to Test, Read, and Fix Your SPF Record&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fortifynet.com/blog/dns-security-configuration" rel="noopener noreferrer"&gt;DNS Security Configuration: SPF, DMARC, DNSSEC and CAA Explained&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Check your DKIM in 60 seconds
&lt;/h2&gt;

&lt;p&gt;Most broken DKIM setups look fine from the admin console and only reveal themselves in the headers of delivered mail. FortifyNet's free scan reads your live DNS and reports on SPF, DKIM and DMARC together, alongside your SSL/TLS configuration, security headers and dark-web exposure. No signup required. &lt;a href="https://fortifynet.com" rel="noopener noreferrer"&gt;Run a free scan of your domain&lt;/a&gt; and see what receivers actually see.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://fortifynet.com/blog/what-is-dkim" rel="noopener noreferrer"&gt;fortifynet.com/blog/what-is-dkim&lt;/a&gt;. I'm the founder of FortifyNet, a website security scanner; this article comes from our blog, so factor in that founder bias when you read any tool recommendations here.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>dkim</category>
      <category>emailauthentication</category>
      <category>dmarc</category>
      <category>spf</category>
    </item>
    <item>
      <title>Mozilla Observatory Alternative 2026 | FortifyNet</title>
      <dc:creator>Håkan Fägnell</dc:creator>
      <pubDate>Thu, 06 Aug 2026 04:45:29 +0000</pubDate>
      <link>https://dev.to/hkan_fgnell_322b4aba3d6/mozilla-observatory-alternative-2026-fortifynet-3431</link>
      <guid>https://dev.to/hkan_fgnell_322b4aba3d6/mozilla-observatory-alternative-2026-fortifynet-3431</guid>
      <description>&lt;h1&gt;
  
  
  Mozilla Observatory Alternative: The Best Replacements in 2026
&lt;/h1&gt;

&lt;p&gt;For almost a decade, Observatory by Mozilla was the default free answer to the question "how secure is my website's configuration?". Then it was retired. The HTTP scanning half found a new home on MDN in July 2024, while the rest of the toolkit, including the TLS Observatory and the SSH Observatory, was shut down for good in September 2024, as documented in &lt;a href="https://developer.mozilla.org/en-US/blog/mdn-http-observatory-launch/" rel="noopener noreferrer"&gt;MDN's launch announcement&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you still have observatory.mozilla.org bookmarked, or your security checklist references tests that no longer exist, you need a replacement. This guide compares the best Mozilla Observatory alternatives in 2026, explains exactly what each one covers, and shows how to rebuild your old scanning workflow without losing coverage.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happened to Mozilla Observatory?
&lt;/h2&gt;

&lt;p&gt;Observatory started in 2016 as an internal Mozilla tool, built by security engineer April King to push Mozilla's own websites toward modern security practices. Once opened to the public it became a fixture of the web security community: by the time of the migration it had scanned 6.9 million websites across 47 million scans, according to &lt;a href="https://developer.mozilla.org/en-US/blog/mdn-http-observatory-launch/" rel="noopener noreferrer"&gt;MDN&lt;/a&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2016&lt;/td&gt;
&lt;td&gt;Observatory by Mozilla launches publicly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2016 to 2024&lt;/td&gt;
&lt;td&gt;6.9 million websites scanned, 47 million total scans&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;July 2, 2024&lt;/td&gt;
&lt;td&gt;HTTP Observatory relaunches on MDN with an updated test suite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;September 2024&lt;/td&gt;
&lt;td&gt;observatory.mozilla.org is sunset; the TLS and SSH Observatories retire with it&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The migration was not a simple rebrand. The MDN team modernized the tests:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The outdated X-XSS-Protection test was removed.&lt;/li&gt;
&lt;li&gt;Legacy Flash and Silverlight cross-domain policy tests were removed.&lt;/li&gt;
&lt;li&gt;A new Cross-Origin-Resource-Policy (CORP) test was added.&lt;/li&gt;
&lt;li&gt;Referrer-Policy scoring was updated.&lt;/li&gt;
&lt;li&gt;Scans are now rate-limited to one per site every 60 seconds.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One change matters more than all the others: the new MDN HTTP Observatory analyzes HTTP response security only. Mozilla states there are no plans to bring back the TLS and certificate analysis tabs. If your old routine was "run Observatory, fix the headers, then check the TLS tab", the second half of that workflow now needs a different tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to look for in a replacement
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1484417894907-623942c8ee29%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1200%26q%3D80" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1484417894907-623942c8ee29%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1200%26q%3D80" alt="Developer comparing website security scan reports on a laptop" width="1200" height="675"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Three questions separate the candidates quickly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Coverage.&lt;/strong&gt; Headers are one layer. A realistic external audit also covers TLS configuration and certificate expiry, DNS records, email authentication (SPF, DKIM, DMARC), and ideally whether your credentials already circulate on the dark web.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Actionability.&lt;/strong&gt; A letter grade is motivating, but the report should tell you which header to change and what value to set, not just that something failed. Observatory's gamified hunt for the A+ worked precisely because it paired grades with documentation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workflow fit.&lt;/strong&gt; Rate limits, scan speed, whether you can monitor continuously or only scan manually, and price.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With those criteria in mind, here are the tools worth your time in 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  The best Mozilla Observatory alternatives in 2026
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. FortifyNet: the closest thing to a full Observatory successor
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://fortifynet.com" rel="noopener noreferrer"&gt;FortifyNet&lt;/a&gt; runs a free scan in about 60 seconds and covers the six areas most external audits care about: security headers, SSL/TLS configuration and certificate expiry, DNS health, email authentication (SPF, DKIM and DMARC), dark web exposure of your domain's credentials, and performance basics. Results come back as a graded report with concrete fixes written in plain language.&lt;/p&gt;

&lt;p&gt;That breadth is the point. The old Mozilla Observatory bundled HTTP and TLS testing in one place; FortifyNet restores that single-dashboard experience and extends it to email authentication and breach exposure, which Mozilla never covered. The scan itself is free with no signup, while continuous monitoring and alerting sit in the paid plans, so the model is freemium rather than purely free.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; teams that want the whole external security picture in one scan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limitations:&lt;/strong&gt; it is a breadth-first audit, not a deep penetration test.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. MDN HTTP Observatory: the official successor
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://developer.mozilla.org/en-US/observatory" rel="noopener noreferrer"&gt;MDN HTTP Observatory&lt;/a&gt; is the direct descendant and remains excellent at its narrower job. It runs roughly ten tests against your HTTP responses: Content-Security-Policy, cookie configuration, CORS, Strict-Transport-Security, redirection behavior, Referrer-Policy, Subresource Integrity, X-Content-Type-Options, clickjacking protection via frame-ancestors and X-Frame-Options, and CORP. Every failed test links straight into MDN's security guides, which are among the best free documentation on the subject, and historic scan data from the old Observatory was preserved.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; deep, well-documented header and policy analysis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limitations:&lt;/strong&gt; no TLS, certificate, DNS or email checks; one scan per minute per site.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. securityheaders.com: the fastest header grade
&lt;/h3&gt;

&lt;p&gt;Scott Helme's &lt;a href="https://securityheaders.com" rel="noopener noreferrer"&gt;securityheaders.com&lt;/a&gt;, which now operates under Snyk, is the quickest way to get an A+ to F grade on your response headers, and it had already passed &lt;a href="https://scotthelme.co.uk/celebrating-250-000-000-scans-on-security-headers/" rel="noopener noreferrer"&gt;250 million scans in 2023&lt;/a&gt;. It checks the presence and sanity of the headers that matter most: Content-Security-Policy, Strict-Transport-Security, X-Frame-Options, X-Content-Type-Options, Referrer-Policy and Permissions-Policy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; instant spot checks and shareable grades.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limitations:&lt;/strong&gt; headers only, and the remediation guidance is thinner than MDN's.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Qualys SSL Labs: the TLS deep dive
&lt;/h3&gt;

&lt;p&gt;The retired TLS Observatory has an obvious replacement: the &lt;a href="https://www.ssllabs.com/ssltest/" rel="noopener noreferrer"&gt;SSL Labs Server Test&lt;/a&gt; has been the reference TLS analyzer for years. It grades protocol support, cipher suites, key exchange, certificate chain correctness and known vulnerabilities, and it is free.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; TLS and certificate configuration in depth.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limitations:&lt;/strong&gt; TLS only, and a full scan can take a few minutes per host. Our guide to &lt;a href="https://fortifynet.com/blog/ssl-tls-certificate-security" rel="noopener noreferrer"&gt;earning an A+ TLS rating&lt;/a&gt; pairs well with it.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Internet.nl: the standards compliance angle
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://internet.nl" rel="noopener noreferrer"&gt;Internet.nl&lt;/a&gt;, run by the Dutch Internet Standards Platform, tests websites and mail domains against modern open standards: IPv6, DNSSEC, HTTPS and TLS settings, security headers, and on the email side SPF, DKIM, DMARC, STARTTLS and DANE, plus RPKI and security.txt. It produces a percentage score rather than a letter grade.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; checking standards adoption across web and email in one pass.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limitations:&lt;/strong&gt; reports read more like a compliance checklist than a fix-it guide.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Also worth knowing:&lt;/strong&gt; Hardenize, the configuration monitor created by SSL Labs author Ivan Ristić, was acquired and now lives inside Red Sift's commercial attack surface management product, so it is no longer the free quick-scan it once was. For the retired SSH Observatory, the open source ssh-audit project remains the practical community replacement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Side-by-side comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Focus&lt;/th&gt;
&lt;th&gt;Grading&lt;/th&gt;
&lt;th&gt;TLS analysis&lt;/th&gt;
&lt;th&gt;Email auth&lt;/th&gt;
&lt;th&gt;Dark web&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;FortifyNet&lt;/td&gt;
&lt;td&gt;Full external audit&lt;/td&gt;
&lt;td&gt;A+ to F&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Freemium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MDN HTTP Observatory&lt;/td&gt;
&lt;td&gt;HTTP headers and policies&lt;/td&gt;
&lt;td&gt;A+ to F&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;securityheaders.com&lt;/td&gt;
&lt;td&gt;HTTP headers&lt;/td&gt;
&lt;td&gt;A+ to F&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qualys SSL Labs&lt;/td&gt;
&lt;td&gt;TLS and certificates&lt;/td&gt;
&lt;td&gt;A+ to F&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Internet.nl&lt;/td&gt;
&lt;td&gt;Open standards, web and email&lt;/td&gt;
&lt;td&gt;Percentage&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Counting six common audit areas (security headers, TLS, DNS, email authentication, dark web exposure, performance), coverage compares like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fquickchart.io%2Fchart%3Fw%3D700%26h%3D380%26bkg%3Dwhite%26c%3D%257B%2522type%2522%253A%2522horizontalBar%2522%252C%2522data%2522%253A%257B%2522labels%2522%253A%255B%2522FortifyNet%2522%252C%2522Internet.nl%2522%252C%2522MDN%2520HTTP%2520Observatory%2522%252C%2522securityheaders.com%2522%252C%2522SSL%2520Labs%2522%255D%252C%2522datasets%2522%253A%255B%257B%2522label%2522%253A%2522Areas%2520covered%2520%2528of%25206%2529%2522%252C%2522data%2522%253A%255B6%252C4%252C1%252C1%252C1%255D%252C%2522backgroundColor%2522%253A%255B%2522%25232563eb%2522%252C%2522%252394a3b8%2522%252C%2522%252394a3b8%2522%252C%2522%252394a3b8%2522%252C%2522%252394a3b8%2522%255D%257D%255D%257D%252C%2522options%2522%253A%257B%2522title%2522%253A%257B%2522display%2522%253Atrue%252C%2522text%2522%253A%2522Security%2520coverage%2520by%2520tool%2520%2528six%2520check%2520areas%2529%2522%257D%252C%2522legend%2522%253A%257B%2522display%2522%253Afalse%257D%252C%2522scales%2522%253A%257B%2522xAxes%2522%253A%255B%257B%2522ticks%2522%253A%257B%2522beginAtZero%2522%253Atrue%252C%2522max%2522%253A6%252C%2522stepSize%2522%253A1%257D%257D%255D%257D%257D%257D" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fquickchart.io%2Fchart%3Fw%3D700%26h%3D380%26bkg%3Dwhite%26c%3D%257B%2522type%2522%253A%2522horizontalBar%2522%252C%2522data%2522%253A%257B%2522labels%2522%253A%255B%2522FortifyNet%2522%252C%2522Internet.nl%2522%252C%2522MDN%2520HTTP%2520Observatory%2522%252C%2522securityheaders.com%2522%252C%2522SSL%2520Labs%2522%255D%252C%2522datasets%2522%253A%255B%257B%2522label%2522%253A%2522Areas%2520covered%2520%2528of%25206%2529%2522%252C%2522data%2522%253A%255B6%252C4%252C1%252C1%252C1%255D%252C%2522backgroundColor%2522%253A%255B%2522%25232563eb%2522%252C%2522%252394a3b8%2522%252C%2522%252394a3b8%2522%252C%2522%252394a3b8%2522%252C%2522%252394a3b8%2522%255D%257D%255D%257D%252C%2522options%2522%253A%257B%2522title%2522%253A%257B%2522display%2522%253Atrue%252C%2522text%2522%253A%2522Security%2520coverage%2520by%2520tool%2520%2528six%2520check%2520areas%2529%2522%257D%252C%2522legend%2522%253A%257B%2522display%2522%253Afalse%257D%252C%2522scales%2522%253A%257B%2522xAxes%2522%253A%255B%257B%2522ticks%2522%253A%257B%2522beginAtZero%2522%253Atrue%252C%2522max%2522%253A6%252C%2522stepSize%2522%253A1%257D%257D%255D%257D%257D%257D" alt="Bar chart comparing security check coverage: FortifyNet covers six areas, Internet.nl four, while MDN HTTP Observatory, securityheaders.com and SSL Labs each cover one" width="1400" height="760"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Number of the six audit areas each tool covers. The specialized tools go deeper within their single area; the chart shows breadth, not depth.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Rebuilding your old Observatory workflow
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;If you used&lt;/th&gt;
&lt;th&gt;For&lt;/th&gt;
&lt;th&gt;Use this now&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;HTTP Observatory&lt;/td&gt;
&lt;td&gt;Header grading and docs&lt;/td&gt;
&lt;td&gt;MDN HTTP Observatory, or FortifyNet for headers plus everything else&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TLS Observatory&lt;/td&gt;
&lt;td&gt;Protocol and certificate analysis&lt;/td&gt;
&lt;td&gt;Qualys SSL Labs or FortifyNet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Third-party tests tab&lt;/td&gt;
&lt;td&gt;Aggregated multi-tool view&lt;/td&gt;
&lt;td&gt;FortifyNet's single dashboard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSH Observatory&lt;/td&gt;
&lt;td&gt;SSH configuration&lt;/td&gt;
&lt;td&gt;The open source ssh-audit tool&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Whichever combination you choose, header fundamentals still decide most of the grade. Our guides to &lt;a href="https://fortifynet.com/blog/http-security-headers-guide" rel="noopener noreferrer"&gt;HTTP security headers&lt;/a&gt; and &lt;a href="https://fortifynet.com/blog/what-is-hsts" rel="noopener noreferrer"&gt;HSTS&lt;/a&gt; cover the exact values scanners reward.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is Mozilla Observatory still available?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The HTTP scanning part lives on as the MDN HTTP Observatory and remains free. The original observatory.mozilla.org, including the TLS and SSH Observatories, was sunset in September 2024. Old scan history was preserved on MDN.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does the MDN HTTP Observatory check TLS or certificates?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. Mozilla's FAQ states the new tool focuses on HTTP data and that there are no plans to restore TLS or certificate analysis. Pair it with SSL Labs or a FortifyNet scan for that layer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is an A+ grade proof that a site is secure?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. Mozilla itself is explicit on this point: header scanners test preventative configuration, not vulnerabilities such as outdated software, injectable forms or weak passwords. Treat an A+ as a strong baseline, not a certificate of security.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the best free Mozilla Observatory alternative?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For headers only, the MDN HTTP Observatory. For TLS, SSL Labs. If you want one scan that covers headers, TLS, DNS, email authentication and dark web exposure together, FortifyNet's free 60-second scan is the shortest path.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check all six areas in one minute
&lt;/h2&gt;

&lt;p&gt;The old Observatory taught the web that grades drive fixes. If you would rather not juggle three single-purpose scanners to rebuild it, &lt;a href="https://fortifynet.com" rel="noopener noreferrer"&gt;run a free FortifyNet scan&lt;/a&gt;: headers, TLS, DNS, email authentication, dark web exposure and performance in about 60 seconds, no signup required.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://fortifynet.com/blog/mozilla-observatory-alternative" rel="noopener noreferrer"&gt;fortifynet.com/blog/mozilla-observatory-alternative&lt;/a&gt;. I'm the founder of FortifyNet, a website security scanner; this article comes from our blog, so factor in that founder bias when you read any tool recommendations here.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mozillaobservatory</category>
      <category>securityheaders</category>
      <category>securitytools</category>
      <category>websitesecurity</category>
    </item>
    <item>
      <title>HTTP Security Headers: The Complete 2026 Guide with nginx &amp; Apache Examples</title>
      <dc:creator>Håkan Fägnell</dc:creator>
      <pubDate>Wed, 05 Aug 2026 09:22:30 +0000</pubDate>
      <link>https://dev.to/hkan_fgnell_322b4aba3d6/http-security-headers-the-complete-2026-guide-with-nginx-apache-examples-4j86</link>
      <guid>https://dev.to/hkan_fgnell_322b4aba3d6/http-security-headers-the-complete-2026-guide-with-nginx-apache-examples-4j86</guid>
      <description>&lt;h2&gt;
  
  
  Why Security Headers Matter
&lt;/h2&gt;

&lt;p&gt;HTTP security headers are directives sent by your web server that instruct browsers on how to behave when displaying your website. Adding them requires no changes to your application code - only web server configuration - yet they are one of the most effective defenses against a wide range of common web attacks, including Cross-Site Scripting (XSS), clickjacking, and content injection.&lt;/p&gt;

&lt;p&gt;Many websites neglect security headers entirely. A scan of the top million websites consistently shows that the majority are missing at least some critical headers. This is a missed opportunity because these headers are free and easy to add.&lt;/p&gt;

&lt;h2&gt;
  
  
  HSTS - HTTP Strict Transport Security
&lt;/h2&gt;

&lt;p&gt;HSTS is a header that tells browsers: never connect to this website over plain HTTP, no matter what. Once a browser has seen an HSTS header from your site, it will automatically upgrade any future HTTP requests to HTTPS - even if the user types "http://" in the address bar or clicks an HTTP link. This is one of the most important security headers you can add.&lt;/p&gt;

&lt;p&gt;The header has three important parameters. The "max-age" value tells the browser how long (in seconds) to remember this policy - you should set this to at least one year (31536000 seconds). The "includeSubDomains" flag extends this protection to all your subdomains. The "preload" flag tells browsers that you want to be included in the HSTS preload list - a list baked directly into Chrome, Firefox, and other browsers so that even the very first visit to your site is protected.&lt;/p&gt;

&lt;p&gt;On nginx, you add this header with the add_header directive inside your server block. On Apache, you use the Header directive inside a VirtualHost block. Always include the "always" keyword to ensure the header is sent even with error responses.&lt;/p&gt;

&lt;p&gt;Before setting a long max-age, make absolutely certain that your entire site - including all subdomains - is working correctly over HTTPS. Setting HSTS with a long max-age and then discovering that a subdomain does not support HTTPS can lock users out for months.&lt;/p&gt;

&lt;h2&gt;
  
  
  CSP - Content Security Policy
&lt;/h2&gt;

&lt;p&gt;Content Security Policy is the most powerful security header available, and also the most complex to configure correctly. It tells browsers exactly which sources of content are permitted to load on your page - scripts, stylesheets, images, fonts, and more. This is your primary defense against Cross-Site Scripting (XSS) attacks, where an attacker manages to inject malicious JavaScript into your page.&lt;/p&gt;

&lt;p&gt;A CSP works by whitelisting trusted sources. For example, you might specify that scripts can only be loaded from your own domain and from Google Analytics, that stylesheets can only come from your own domain, and that images can come from anywhere over HTTPS. Any content that does not match these rules is blocked by the browser before it can execute.&lt;/p&gt;

&lt;p&gt;The most effective way to implement CSP is gradually. Start by adding a "Content-Security-Policy-Report-Only" header rather than "Content-Security-Policy." This means the policy is not enforced - violations are reported to you but the content still loads. This lets you collect violation reports, identify all the legitimate third-party resources your site actually loads, and build your policy without breaking anything. After a week or two of collecting data, switch to the enforcing version.&lt;/p&gt;

&lt;p&gt;One common pitfall is "unsafe-inline" - a directive that allows inline scripts and styles. While this makes it easy to implement CSP without breaking your site, it dramatically reduces the protection it offers, because most XSS attacks rely on injecting inline scripts. A better approach is to use "nonces" or "hashes" to allow specific inline scripts while blocking injected ones.&lt;/p&gt;

&lt;h2&gt;
  
  
  X-Frame-Options
&lt;/h2&gt;

&lt;p&gt;The X-Frame-Options header controls whether your website can be embedded inside an iframe on another domain. This protects against clickjacking attacks, where an attacker puts your website in an invisible iframe overlaid on top of their own page. The visitor thinks they are clicking something on the attacker's page but is actually clicking on your site - potentially authorizing a transaction, clicking an "accept" button, or performing some other action without realizing it.&lt;/p&gt;

&lt;p&gt;The recommended value is "SAMEORIGIN," which allows your site to be embedded in iframes only from pages on your own domain. "DENY" prevents embedding entirely. The older "ALLOW-FROM" option is deprecated and not supported by modern browsers.&lt;/p&gt;

&lt;p&gt;Note that if you have a modern CSP configured, you can use the "frame-ancestors" CSP directive instead of X-Frame-Options - it offers more fine-grained control. However, for maximum compatibility across all browsers, it is a good practice to include both.&lt;/p&gt;

&lt;h2&gt;
  
  
  X-Content-Type-Options
&lt;/h2&gt;

&lt;p&gt;This simple but important header has a single value: "nosniff." It prevents browsers from "MIME sniffing" - guessing what type of content a file contains based on its actual content rather than the declared Content-Type header.&lt;/p&gt;

&lt;p&gt;MIME sniffing sounds harmless but can be exploited. If an attacker can get you to host a file that looks like HTML or JavaScript to a browser's content sniffer - even if you think it is an image or text file - the browser might execute it as a script. Adding "nosniff" tells browsers to always respect the declared content type and never guess.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referrer-Policy
&lt;/h2&gt;

&lt;p&gt;When a user clicks a link from your website to another site, browsers automatically include a "Referer" header (note the misspelling - it is historical) telling the destination site where the user came from. This can inadvertently leak sensitive information if your URLs contain session tokens, search queries, or other private data in the query string.&lt;/p&gt;

&lt;p&gt;The Referrer-Policy header controls what information is sent. The recommended value "strict-origin-when-cross-origin" sends the full URL for same-origin requests (useful for your own analytics) but only sends the domain (not the full URL) for cross-origin requests. This protects sensitive URL parameters while preserving useful referrer information for your own site.&lt;/p&gt;

&lt;h2&gt;
  
  
  Permissions-Policy
&lt;/h2&gt;

&lt;p&gt;Permissions-Policy (formerly called Feature-Policy) controls which browser features and APIs your page is allowed to use. This includes potentially sensitive capabilities like the camera, microphone, geolocation, payment request API, and more. By explicitly disabling features you do not use, you prevent third-party scripts (advertising networks, analytics, embedded content) from accessing those features even if they try.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Will adding a CSP break my website?&lt;/strong&gt; It might, initially. CSP blocks anything not explicitly allowed. If you have inline scripts, inline styles, or third-party resources you have not whitelisted, they will be blocked. The solution is to use Report-Only mode first and spend time collecting violation reports before switching to enforcement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the Server header and should I hide it?&lt;/strong&gt; The Server header reveals your web server software and version - for example, "nginx/1.24.0." This information is useful to attackers who want to target known vulnerabilities in specific software versions. You should suppress or genericize this header. In nginx, set "server_tokens off." In Apache, use "ServerTokens Prod."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do these headers affect site performance?&lt;/strong&gt; Negligibly. The headers add a few bytes to each HTTP response but have no meaningful impact on load time. The security benefits far outweigh any marginal overhead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Should I add security headers to HTTP responses as well as HTTPS?&lt;/strong&gt; Yes - configure them on both, but remember that HSTS should only be sent over HTTPS. Sending HSTS over HTTP is ignored and could cause confusion.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check Your Headers in 60 Seconds
&lt;/h2&gt;

&lt;p&gt;You can verify every header in this guide by hand with curl, or let a scanner do the first pass. The free &lt;a href="https://fortifynet.com" rel="noopener noreferrer"&gt;FortifyNet scan&lt;/a&gt; checks your security headers, SSL/TLS setup, DNS configuration, email authentication and dark-web exposure in about a minute, and tells you exactly what to fix first. No signup required.&lt;/p&gt;

&lt;h3&gt;
  
  
  Related guides
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fortifynet.com/blog/website-security-checklist" rel="noopener noreferrer"&gt;Website Security Checklist: 12 Essential Steps for 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fortifynet.com/blog/what-is-hsts" rel="noopener noreferrer"&gt;What Is HSTS? HTTP Strict Transport Security Explained&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fortifynet.com/blog/ssl-tls-certificate-security" rel="noopener noreferrer"&gt;SSL/TLS Certificate Security: The Complete Guide to an A+ Rating&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://fortifynet.com/blog/http-security-headers-guide" rel="noopener noreferrer"&gt;fortifynet.com/blog/http-security-headers-guide&lt;/a&gt;. I'm the founder of FortifyNet, a website security scanner; this article comes from our blog, so factor in that founder bias when you read any tool recommendations here. Happy to answer questions in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>webdev</category>
      <category>nginx</category>
      <category>devops</category>
    </item>
    <item>
      <title>Core Web Vitals 2026: Complete Google Ranking Guide</title>
      <dc:creator>Håkan Fägnell</dc:creator>
      <pubDate>Tue, 04 Aug 2026 16:38:50 +0000</pubDate>
      <link>https://dev.to/hkan_fgnell_322b4aba3d6/core-web-vitals-2026-complete-google-ranking-guide-1mbc</link>
      <guid>https://dev.to/hkan_fgnell_322b4aba3d6/core-web-vitals-2026-complete-google-ranking-guide-1mbc</guid>
      <description>&lt;h2&gt;
  
  
  What Are Core Web Vitals?
&lt;/h2&gt;

&lt;p&gt;Core Web Vitals are a set of specific metrics that Google uses to measure the real-world user experience of a web page. They focus on three aspects of the loading and interaction experience that research has shown are most important to users: how fast the main content loads, how quickly the page responds to user interactions, and how visually stable the page is during loading.&lt;/p&gt;

&lt;p&gt;Google made Core Web Vitals an official ranking signal in 2021. What makes this significant is that the data comes from real Chrome users - not controlled laboratory conditions. Google collects field data through the Chrome User Experience Report (CrUX) and uses a 28-day rolling window. This means improvements you make today may take up to a month to fully show up in your ranking signals.&lt;/p&gt;

&lt;p&gt;In March 2024, Google replaced First Input Delay (FID) with Interaction to Next Paint (INP) as the interactivity metric. FID only measured the delay for the very first interaction a user made with a page. INP measures all interactions throughout the entire page lifecycle - every click, tap, and key press, and how quickly the page visually responds to each one. This makes INP a much more representative measure of how responsive your page feels.&lt;/p&gt;

&lt;h2&gt;
  
  
  LCP - Largest Contentful Paint
&lt;/h2&gt;

&lt;p&gt;LCP measures how long it takes for the largest visible content element on the page to fully load. This is typically a hero image, a large heading, or a banner. Google considers an LCP under 2.5 seconds to be good, 2.5-4.0 seconds to need improvement, and above 4.0 seconds to be poor.&lt;/p&gt;

&lt;p&gt;Why does this matter? Research consistently shows that users abandon pages that take too long to load. A one-second improvement in load time can increase conversions by 7-12%. The LCP metric tries to capture the moment when the user feels the page has "arrived" - when the main content is visible.&lt;/p&gt;

&lt;p&gt;The most common causes of poor LCP are slow server response times, large uncompressed images, render-blocking JavaScript and CSS loaded in the document head, and lack of a content delivery network (CDN) to serve assets closer to users.&lt;/p&gt;

&lt;p&gt;To improve LCP, the most impactful steps are usually: using modern image formats like WebP or AVIF instead of JPEG or PNG (typically 30-50% smaller files), adding explicit preload hints for your LCP element so the browser fetches it as early as possible, reducing server response time (TTFB) by enabling caching and using a CDN, and deferring any JavaScript that does not need to run before the page becomes visible.&lt;/p&gt;

&lt;h2&gt;
  
  
  INP - Interaction to Next Paint
&lt;/h2&gt;

&lt;p&gt;INP measures the responsiveness of a page to user interactions. Specifically, it measures the time from when a user performs an input (click, tap, or key press) to when the browser next paints to the screen to show the visual result of that interaction. Google considers INP under 200 milliseconds to be good, 200-500ms to need improvement, and above 500ms to be poor.&lt;/p&gt;

&lt;p&gt;High INP values feel like a sluggish, unresponsive page. When you click a button and nothing seems to happen for half a second, that is poor INP. This is particularly problematic for interactive applications - things like dropdown menus, filter controls, accordions, form validation, and any JavaScript-heavy interface.&lt;/p&gt;

&lt;p&gt;The primary cause of high INP is long tasks on the browser's main thread. JavaScript is single-threaded, which means if one task takes a long time to execute, the browser cannot handle any user input or render any updates until it finishes. Tasks that take longer than 50 milliseconds are considered "long tasks" and are the biggest culprits.&lt;/p&gt;

&lt;p&gt;To improve INP, focus on identifying and breaking up long JavaScript tasks. Use browser developer tools to find tasks that block the main thread. Defer non-critical work using techniques like setTimeout or requestIdleCallback. Minimize the impact of third-party scripts - every analytics tool, chat widget, and ad network you add runs JavaScript that competes for main thread time. Consider lazy-loading these scripts until after the page is interactive.&lt;/p&gt;

&lt;h2&gt;
  
  
  CLS - Cumulative Layout Shift
&lt;/h2&gt;

&lt;p&gt;CLS measures visual stability - how much the page layout unexpectedly shifts while loading. If you have ever been about to click something and suddenly the page jumps and you accidentally click something else, that is a high-CLS experience. Google considers CLS under 0.1 to be good, 0.1-0.25 to need improvement, and above 0.25 to be poor.&lt;/p&gt;

&lt;p&gt;The most common causes of layout shift are images and video embeds without declared dimensions (the browser does not know how much space to reserve until the file loads), ads and embeds that expand after loading, and dynamically injected content that pushes other content down.&lt;/p&gt;

&lt;p&gt;The fix is usually straightforward: always declare width and height attributes on images and video elements. For responsive images, use CSS aspect-ratio instead. For ads and embeds, reserve their minimum expected size using CSS before they load. For web fonts, use font-display: swap to prevent invisible text, but pair it with font preloading to minimize the layout shift that occurs when the custom font replaces the fallback.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Field Data Differs From Lab Data
&lt;/h2&gt;

&lt;p&gt;A common source of confusion is why Lighthouse scores and Search Console data show very different results. Lighthouse is a lab tool - it runs in a controlled environment on a simulated device with simulated network conditions. Search Console field data comes from real Chrome users with all their browser extensions, varying device capabilities, and real network conditions.&lt;/p&gt;

&lt;p&gt;Your target users may be mostly on mobile devices with slower processors and cellular connections. Your Lighthouse score measured on a high-speed desktop connection does not reflect their experience. Always look at Search Console Core Web Vitals data - filtered by device type - to understand what real users are experiencing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;How much does Core Web Vitals affect my Google ranking?&lt;/strong&gt; Google describes it as a "tiebreaker" signal. When content quality and relevance are otherwise equal, better Core Web Vitals can give you an edge. For competitive keywords, it can make a meaningful difference.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My Lighthouse score is 90+ but Search Console shows poor field data. What is happening?&lt;/strong&gt; Real users have slower devices, extensions that consume processing power, and real network conditions. Your lab score measures a best-case scenario. Prioritize fixing the field data issues that real users experience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does my JavaScript framework affect Core Web Vitals?&lt;/strong&gt; Yes, significantly. Single-page applications built with frameworks like React or Angular often do all their rendering in JavaScript, which delays LCP (the page is blank until JS loads and executes). Server-side rendering (SSR) or static site generation (SSG) typically produces much better LCP scores.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How long do improvements take to show up in rankings?&lt;/strong&gt; Google collects field data over a 28-day rolling window. Improvements may start appearing in Search Console within 2-4 weeks. Ranking changes typically lag behind by another 2-4 weeks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is it worth optimizing Core Web Vitals for my small website?&lt;/strong&gt; Yes - not just for rankings but for user experience. Faster, more responsive websites have higher conversion rates, lower bounce rates, and better user satisfaction regardless of the SEO implications.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://fortifynet.com/blog/core-web-vitals-2026" rel="noopener noreferrer"&gt;fortifynet.com/blog/core-web-vitals-2026&lt;/a&gt;. I'm the founder of FortifyNet, a website security scanner; this article comes from our blog, so factor in that founder bias when you read any tool recommendations here.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>corewebvitals</category>
      <category>performance</category>
      <category>seo</category>
      <category>webperf</category>
    </item>
    <item>
      <title>DNS Security Configuration: SPF, DMARC, DNSSEC &amp; CAA Explained</title>
      <dc:creator>Håkan Fägnell</dc:creator>
      <pubDate>Sat, 25 Jul 2026 04:39:26 +0000</pubDate>
      <link>https://dev.to/hkan_fgnell_322b4aba3d6/dns-security-configuration-spf-dmarc-dnssec-caa-explained-5gl4</link>
      <guid>https://dev.to/hkan_fgnell_322b4aba3d6/dns-security-configuration-spf-dmarc-dnssec-caa-explained-5gl4</guid>
      <description>&lt;h2&gt;
  
  
  Why DNS Security is Critical
&lt;/h2&gt;

&lt;p&gt;Your domain's DNS records are the foundation of your online presence. They tell the world where your website lives, where to deliver your email, and who is authorized to issue security certificates for your domain. When these records are poorly configured, attackers can exploit them in several devastating ways.&lt;/p&gt;

&lt;p&gt;Email spoofing is one of the most common threats. Without proper DNS security, anyone in the world can send emails that appear to come from your domain. Your customers could receive phishing emails that look exactly like they are from you - requesting payment, asking them to click malicious links, or harvesting their credentials. This damages your reputation and exposes your customers to fraud.&lt;/p&gt;

&lt;p&gt;DNS hijacking is another serious threat. An attacker who can modify your DNS records can redirect your visitors to a fake version of your website - capturing their logins and payment details before passing them on to the real site. The visitor may never notice anything is wrong.&lt;/p&gt;

&lt;p&gt;The four pillars of DNS security - SPF, DKIM, DMARC, and DNSSEC - each address different aspects of these threats. Implementing all four gives you comprehensive protection.&lt;/p&gt;

&lt;h2&gt;
  
  
  SPF (Sender Policy Framework)
&lt;/h2&gt;

&lt;p&gt;SPF is a DNS record that specifies which mail servers are authorized to send email on behalf of your domain. When a receiving mail server gets an email claiming to be from your domain, it checks your SPF record to see if the sending server is on the approved list. If it is not, the email can be marked as suspicious or rejected outright.&lt;/p&gt;

&lt;p&gt;Setting up SPF means adding a TXT record to your domain's DNS. The record starts with "v=spf1" followed by a list of authorized sending sources, and ends with a policy for what to do with unauthorized senders. Using "-all" means reject any email from a server not listed. Using "~all" means treat it as suspicious (soft fail). Never use "+all" which would allow anyone to send as your domain.&lt;/p&gt;

&lt;p&gt;If you use Google Workspace for email, your SPF record should include Google's sending servers. If you use Microsoft 365, you include Microsoft's servers. If you use both plus a third-party service like Mailchimp for newsletters, you need to include all three. Keep in mind that SPF has a limit of 10 DNS lookups - if you use many services, this can become a challenge and you may need to optimize your record.&lt;/p&gt;

&lt;h2&gt;
  
  
  DKIM (DomainKeys Identified Mail)
&lt;/h2&gt;

&lt;p&gt;DKIM takes email authentication a step further by adding a cryptographic digital signature to every outgoing email from your domain. Here is how it works: your email server signs each message using a private key that only you control. A corresponding public key is published in your DNS records. When a receiving mail server gets your email, it retrieves the public key from DNS and uses it to verify the signature. If the signature matches, the email is authentic and has not been tampered with. If it does not match, the email is likely a forgery.&lt;/p&gt;

&lt;p&gt;DKIM is typically configured through your email provider's admin console - Google Workspace, Microsoft 365, and most email hosting providers have DKIM setup wizards. Once you enable DKIM in your provider's settings, they give you a DNS record to add. The record looks cryptic (it contains a long public key string) but you just need to add it to your DNS as directed.&lt;/p&gt;

&lt;p&gt;The key benefit of DKIM beyond authentication is that it also protects email content integrity. A message signed with DKIM cannot be altered after signing without the signature becoming invalid. This means that even if someone intercepts your email in transit, they cannot modify its contents without detection.&lt;/p&gt;

&lt;h2&gt;
  
  
  DMARC (Domain-based Message Authentication, Reporting &amp;amp; Conformance)
&lt;/h2&gt;

&lt;p&gt;DMARC is the policy layer that sits on top of SPF and DKIM. It answers the question: "What should receiving mail servers do when an email claims to be from my domain but fails SPF or DKIM checks?" And equally importantly: "Can you please send me reports about what is happening with email sent from my domain?"&lt;/p&gt;

&lt;p&gt;There are three DMARC policies. The first, "p=none," is monitoring-only mode. It does not block or flag any emails but instructs receiving servers to send you reports about what they see. This is where you should start - you may discover that legitimate senders (like your CRM, newsletter platform, or e-commerce system) are sending emails on your behalf that are not covered by your SPF or DKIM setup. Starting with monitoring gives you 2-4 weeks to identify and fix these before moving to enforcement.&lt;/p&gt;

&lt;p&gt;The second policy, "p=quarantine," tells receiving servers to send emails that fail DMARC checks to the spam folder rather than the inbox. This is a good intermediate step - it reduces the impact of spoofed emails without risking that legitimate emails get rejected.&lt;/p&gt;

&lt;p&gt;The third policy, "p=reject," is the gold standard. Emails that fail DMARC checks are rejected outright - they never reach the recipient's inbox. This is the most effective protection against email spoofing from your domain.&lt;/p&gt;

&lt;p&gt;DMARC reports are XML files sent to the email address you specify in the record. They can be difficult to read in raw form, but free and paid tools exist to parse and visualize them in a human-readable way. These reports show you every IP address that is sending email claiming to be from your domain, whether those emails pass SPF and DKIM, and how many there are.&lt;/p&gt;

&lt;h2&gt;
  
  
  DNSSEC (DNS Security Extensions)
&lt;/h2&gt;

&lt;p&gt;DNSSEC addresses a different attack vector: the DNS system itself. When your browser looks up the IP address of a website, it sends queries to DNS servers. Normally there is no way to verify that the answer you receive is legitimate - an attacker positioned between you and the DNS server could return a fake IP address pointing to a malicious site. This is called DNS cache poisoning.&lt;/p&gt;

&lt;p&gt;DNSSEC solves this by adding cryptographic signatures to DNS records. When a DNS resolver returns an answer, it includes a signature that can be verified using a chain of trust anchored at the root DNS zone. If the signature does not match, the resolver knows the answer has been tampered with and rejects it.&lt;/p&gt;

&lt;p&gt;DNSSEC is enabled at your domain registrar - the company where you registered your domain. Most major registrars support DNSSEC. The process typically involves going to your domain settings, finding the DNSSEC option, and enabling it. The registrar handles the cryptographic key generation. After enabling, allow 24-72 hours for propagation and verify it is working using an online DNSSEC testing tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  CAA (Certification Authority Authorization)
&lt;/h2&gt;

&lt;p&gt;CAA records are a simple but powerful protection against unauthorized SSL certificate issuance. Without CAA records, any of the hundreds of Certificate Authorities in the world could potentially issue a certificate for your domain - either through an error or as a result of being compromised. A fake certificate issued for your domain could be used in a man-in-the-middle attack against your visitors.&lt;/p&gt;

&lt;p&gt;CAA records let you specify exactly which CAs are authorized to issue certificates for your domain. For example, if you use Let's Encrypt for all your certificates, you can add a CAA record that only permits Let's Encrypt to issue certificates. Any other CA that receives a certificate signing request for your domain will see this record and refuse.&lt;/p&gt;

&lt;p&gt;You can also include an iodef record that specifies an email address where CAs should send notifications if they receive an unauthorized certificate request for your domain - giving you early warning of potential attacks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Do I need all four: SPF, DKIM, DMARC, and DNSSEC?&lt;/strong&gt; Yes, because they protect against different threats. SPF and DKIM authenticate your email. DMARC enforces that authentication and provides visibility through reporting. DNSSEC protects the integrity of your DNS records themselves. Each layer adds protection the others do not provide.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My DMARC is set to p=none. Am I protected?&lt;/strong&gt; No. p=none is monitoring mode only. It does not block or flag any spoofed emails. It just tells receiving servers to send you reports. You need p=quarantine or p=reject to actually prevent spoofed emails from reaching inboxes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I have multiple SPF records?&lt;/strong&gt; No - only one SPF TXT record is allowed per domain. If you have multiple, most email servers will fail the SPF check entirely. Combine all your sending sources into a single record.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How long does DNS propagation take?&lt;/strong&gt; DNS changes typically propagate within 1-48 hours globally. The exact time depends on your DNS record's Time To Live (TTL) setting. If you set a low TTL before making changes, propagation can happen within minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is a dangling DNS record and why is it dangerous?&lt;/strong&gt; A dangling record is one that points to a resource that no longer exists - for example, a subdomain pointing to a cloud service you have cancelled. Attackers can register or take over that orphaned resource and use it to serve malicious content that appears to come from your legitimate domain.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://fortifynet.com/blog/dns-security-configuration" rel="noopener noreferrer"&gt;fortifynet.com/blog/dns-security-configuration&lt;/a&gt;. I'm the founder of FortifyNet, a website security scanner; this guide comes from our blog, and every DNS check described here can be done by hand with dig or nslookup, no tool required.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>dns</category>
      <category>spf</category>
      <category>dmarc</category>
      <category>dkim</category>
    </item>
  </channel>
</rss>
