SSL Certificates and HTTPS Explained: DV vs OV vs EV and When You Need Each

Mangesh Supe, Hosting Performance Analyst

By

Founder, ThatMy.com • Independent Hosting Benchmarks • ISP & Network Infrastructure Background

X LinkedIn How we test →

SSL Certificates and HTTPS Explained: DV vs OV vs EV and When You Need Each

Most people get HTTPS backwards. They install a certificate, see the padlock, and think "my site is secure." But the certificate is not the encryption — it is the credential that makes encryption possible. The encryption itself comes from TLS, the protocol that uses the certificate during a 50-millisecond handshake to establish a session key that never leaves either end. Get this distinction wrong and you end up making decisions that cost real money for zero security benefit, or missing the actual attack surfaces that HTTPS does nothing about.

This guide covers the mechanics honestly: how the TLS handshake works step by step, why the EV green bar disappeared and what that means for certificate purchasing decisions, why Let's Encrypt changed everything (and where it fails), how to install free SSL on WordPress using Cloudflare in under 10 minutes, why mixed content errors appear even after a "correct" HTTPS migration, and the exact list of attacks HTTPS does not prevent — which is longer than most guides admit.

What HTTPS Protects

Data encrypted in transit. Server identity verified by CA. MITM eavesdropping blocked. Session integrity guaranteed.

What HTTPS Does NOT Protect

Server-side hacks. Malware. Phishing. Plugin vulnerabilities. Bad passwords. Social engineering. SQL injection.

Free SSL in 2026

Let's Encrypt or Cloudflare. Free DV equals paid DV in encryption strength. No reason to pay for standard WordPress sites.

HTTP vs HTTPS: What Actually Changes When You Add That S

HTTP is a plaintext protocol. When your browser sends a request over HTTP, every piece of data — the URL, your cookies, form inputs, the page content itself — travels as readable text across every router between you and the server. Anyone with packet capture capability on that path can read it. On a public WiFi network, that means the coffee shop's router, the ISP's infrastructure, and every hop in between.

HTTPS puts TLS underneath HTTP. Before any HTTP data moves, your browser and the server run a handshake to establish an encrypted channel. From that point forward, every byte is ciphertext. An attacker capturing packets sees scrambled data that is computationally impossible to decrypt without the session key that was never transmitted over the network.

But the encryption story is only part of what changes. Here are the four properties HTTPS provides that HTTP does not:

Confidentiality

Data is encrypted using symmetric ciphers (AES-128-GCM or AES-256-GCM in TLS 1.3). No one on the path between browser and server can read the content, including form submissions, passwords, and cookie values.

Integrity

Every TLS record includes a MAC (Message Authentication Code). If an attacker modifies even one byte of the ciphertext in transit, the MAC verification fails and the record is rejected. You cannot silently tamper with HTTPS traffic.

Authentication

The server's certificate — signed by a trusted CA — proves the server is who it claims to be. A man-in-the-middle cannot present a fake certificate without a CA signature your browser trusts. This is what stops MITM attacks.

Forward Secrecy

TLS 1.3 uses ephemeral Diffie-Hellman key exchange. Session keys are generated fresh for each connection and never stored. Even if the server's private key is stolen later, past sessions cannot be decrypted.

What a Man-in-the-Middle Attack Actually Looks Like

A MITM attack on HTTP is straightforward: an attacker positions themselves between you and the server, forwards traffic in both directions, and reads or modifies everything. You see the page. The server responds normally. Neither party knows there is a third participant reading every byte.

HTTPS breaks this in a specific way. For a MITM to work, the attacker must present a certificate your browser trusts for the target domain. There are only two ways to do that: compromise a Certificate Authority and issue a fake cert (extremely rare, catastrophic when it happens), or install a custom root CA on your device (what enterprise security proxies and parental controls do with your knowledge). On the public internet without device-level manipulation, HTTPS makes MITM attacks against certificate validation computationally infeasible.

Attack TypeWhat It DoesHow HTTPS Mitigates ItReal-World Scenario
EavesdroppingAttacker reads traffic in transitTLS encrypts all data — eavesdropping produces only ciphertextHTTPS on public WiFi
MITM Certificate SpoofingAttacker presents fake certificateBrowser certificate validation rejects unknown CA signaturesRogue WiFi hotspot
Downgrade AttackForce connection to weak TLS versionTLS 1.3 removes downgrade negotiation; HSTS prevents HTTP fallbackTLS Stripping tools
Session HijackingSteal session cookie after authenticationSecure + HttpOnly flags; HSTS prevents non-HTTPS cookie transmissionCookie theft on HTTP page
Certificate Pinning BypassMITM using CA-issued rogue certCertificate Transparency logs expose mis-issued certs publiclyEnterprise MITM proxies

The Trust Chain: Why Your Browser Trusts Any Certificate at All

Your browser does not trust your certificate directly. It trusts the Certificate Authority that signed it. This is a chain of trust: a root CA you already trust (embedded in your OS/browser) signs an intermediate CA, which signs your certificate. When your browser encounters your certificate, it walks up the chain until it reaches a root it recognizes.

For Let's Encrypt, the chain is: Your Cert → Let's Encrypt R10/R11 (Intermediate) → ISRG Root X1 (Root). Your browser trusts ISRG Root X1 because it is in the root store that shipped with your OS. This is why self-signed certificates fail — they have no CA signature your browser recognizes. And it is why Let's Encrypt certs are trusted by every major browser — ISRG Root X1 is in every major root store.

Verify the complete trust chain for any domain
# See the full certificate chain:
openssl s_client -connect yourdomain.com:443 -showcerts 2>/dev/null | grep -E "subject|issuer"

# Example output for a Let's Encrypt cert:
# subject=CN = yourdomain.com
# issuer=C = US, O = Let's Encrypt, CN = R10
# subject=C = US, O = Let's Encrypt, CN = R10
# issuer=C = US, O = Internet Security Research Group, CN = ISRG Root X1

The TLS Handshake: What Happens in Those 50 Milliseconds Before Your Page Loads

Every HTTPS connection starts with a handshake — a brief back-and-forth between your browser and the server that negotiates which cipher to use, exchanges keys, validates the certificate, and establishes the encrypted channel. The handshake happens before any HTTP data moves. It is the reason HTTPS has any overhead at all, and understanding it explains why TLS 1.3 is faster, why CDNs reduce HTTPS latency, and why session resumption matters.

TLS 1.3 handshake: ClientHello, ServerHello, certificate transmission, key exchange, Finished messages, and encrypted application data flow

Here is what happens in a TLS 1.3 handshake, message by message:

1

ClientHello

Your browser sends its supported TLS versions, a list of cipher suites it accepts, and a key share — its half of the Elliptic Curve Diffie-Hellman (ECDH) key exchange. This is sent speculatively before knowing what the server supports. In TLS 1.3, this is the first and only outbound message before the server responds.

2

ServerHello + Certificate + Finished (One Flight)

The server responds with the selected cipher suite, its own ECDH key share, and its certificate chain. In TLS 1.3 this all happens in a single server flight — one network round-trip. In TLS 1.2 the certificate and key exchange required separate messages across two round-trips. This is the main reason TLS 1.3 handshakes are faster: one less round-trip.

3

Certificate Validation (Browser Side)

Your browser validates the server's certificate: checks the CA signature against its root store, confirms the certificate has not expired, verifies the domain in the certificate matches the domain you connected to (SAN field check), and checks the certificate has not been revoked (via OCSP or CRL). If any check fails, the handshake aborts with an error. This is the trust chain verification step.

4

Key Derivation (Both Sides Independently)

Both sides use their ECDH key shares to independently derive the identical session keys. This is forward secrecy: the session key is never transmitted — both sides compute the same value from their inputs. Even if the server's long-term private key is stolen in the future, these session keys cannot be reconstructed. The attacker cannot decrypt past recorded sessions.

5

Finished Messages

Both sides send a "Finished" message encrypted with the derived session keys. If the counterpart can decrypt and verify this message, the handshake is authenticated. Simultaneous proof that both sides derived the same keys and that the handshake messages were not tampered with in transit.

6

Encrypted Application Data

The browser now sends the actual HTTP request. Everything from this point — URL path, headers, cookies, request body, response body — is AES-GCM ciphertext. An attacker who captures this traffic cannot read anything other than the server's IP address and SNI (the domain name, sent in plaintext during ClientHello for routing purposes).

TLS 1.2 vs TLS 1.3: The Speed Difference

TLS 1.2 requires two round-trips before the first byte of HTTP can be sent. For a server 50ms away (100ms round-trip time), that means 200ms of handshake overhead before anything useful happens. TLS 1.3 requires one round-trip — 100ms in the same scenario. On a CDN edge server 5ms away, the difference is smaller in absolute terms but still significant at scale across millions of connections.

TLS 1.3 also removed the cipher negotiation flexibility that made TLS 1.2 vulnerable to downgrade attacks. TLS 1.3 supports only five cipher suites, all of them strong. There is no option for an attacker to negotiate a weaker cipher by claiming the client doesn't support the good ones.

Check which TLS version your server negotiates — and test both
# Test TLS 1.3 support:
openssl s_client -connect yourdomain.com:443 -tls1_3 2>&1 | grep -E "Protocol|Cipher"

# Test that TLS 1.0 and 1.1 are disabled:
openssl s_client -connect yourdomain.com:443 -tls1 2>&1 | grep "alert"
# Should see: SSL alert number 70 (protocol_version) — means disabled correctly

# Full protocol and cipher audit:
testssl.sh --protocols --ciphers yourdomain.com

SSL Certificate Types: DV, OV, EV, Wildcard, SAN, and Self-Signed Explained

There are six certificate types you will encounter. Most websites need exactly one of them. Getting this decision right saves you money and avoids the embarrassment of paying for validation that your visitors can no longer see.

DV vs OV vs EV certificate comparison table: validation depth, issuance time, cost range, browser padlock difference, and recommended use case for each type

Domain Validation (DV) — The Right Choice for 95% of Websites

DV certificates verify only one thing: that you control the domain. The CA sends an automated challenge — either a specific file to place at /.well-known/acme-challenge/ on your server (HTTP-01 challenge) or a specific TXT record to add to your DNS (DNS-01 challenge). When you complete the challenge, the certificate is issued. The entire process is automated. Let's Encrypt completes it in under 60 seconds.

DV certs contain your domain name. They contain nothing about your organization, your location, your phone number, or your legal status. Anyone who controls a domain — including the person who just registered phishing-bank.com — can get a DV cert immediately. This is why the padlock is not a safety signal.

When DV is the right choice: blogs, portfolios, business informational sites, WordPress sites, WooCommerce stores, affiliate sites, SaaS products, APIs. If you are asking whether you need DV, the answer is yes.

Organization Validation (OV) — For When the Cert Metadata Matters

OV requires the CA to verify your organization's legal existence. They check government business registries, call your listed phone number, and confirm the domain belongs to your organization. The process takes 1–3 business days. The certificate contains your organization's legal name alongside the domain.

Before 2019, Chrome showed the organization name prominently in the address bar for OV certificates. Chrome removed this in 2019. Firefox followed. Today, OV certificates show the same padlock as DV to the vast majority of users — no visible difference in the address bar. The organization name is visible only when a user clicks on the certificate details, which almost no one does.

When OV makes sense: when the certificate metadata itself carries compliance or contractual significance — procurement processes that require verified org identity in the cert, B2B trust requirements, or internal policies that mandate OV regardless of browser display. Not for traffic-facing trust signals to general visitors.

Extended Validation (EV) — The Green Bar That No Longer Exists

EV involves the most rigorous vetting: legal existence, physical address, operational status, and right-to-act verification. Takes 1–5 days. Costs $100–$400/year. The famous "green bar" with the organization name in the browser address bar was the EV distinctive visual — it was the reason banks paid for EV certs for years.

Chrome removed the green bar in September 2019. Mozilla followed in Firefox 70. Safari still shows the organization name in a secondary location that most users never see. In 2026, EV certificates are visually indistinguishable from DV certificates to Chrome and Firefox users — same padlock, no green, no org name in the address bar.

When EV still makes sense: large financial institutions where compliance frameworks specifically require EV, payment processors with contractual EV requirements, and enterprises where the rigorous validation provides internal audit value independent of browser display. Not for general business sites trying to signal trust to visitors.

Wildcard Certificates — One Cert for All Your Subdomains

A wildcard certificate uses an asterisk: *.example.com. It covers every first-level subdomain — shop, api, blog, staging, anything — but not the base domain itself (add example.com as a SAN) and not second-level subdomains like sub.shop.example.com. Use a wildcard when you have many subdomains that change frequently.

Free wildcard certificates from Let's Encrypt require DNS-01 validation — your DNS provider must support API-based record creation so your ACME client can automate renewal. If your DNS has no API, you will be adding TXT records manually every 60 days, which is not sustainable.

SAN (Subject Alternative Names) Certificates — Multiple Unrelated Domains on One Cert

A SAN certificate lists multiple domains in the Subject Alternative Names field of the certificate. A single cert can cover example.com, www.example.com, otherdomain.net, and staging.thirddomain.com — unrelated domains on a single certificate. Let's Encrypt allows up to 100 SANs at no cost. Commercial CAs charge per-SAN pricing.

Every modern certificate is actually a SAN certificate — even a "single domain" cert should list both example.com and www.example.com in the SAN field, since browsers check SAN, not the deprecated CN (Common Name) field, for domain matching.

Self-Signed Certificates — For Internal Use Only

A self-signed certificate is one the server signs itself. There is no CA in the chain. Browsers show a hard error — NET::ERR_CERT_AUTHORITY_INVALID — because there is no trusted CA signature. Anyone could create a self-signed cert for any domain, which is why browsers refuse to trust them.

Legitimate uses: local development environments, internal admin interfaces where you configure every client to trust the cert explicitly, machine-to-machine systems with out-of-band trust, and Docker container inter-service communication. Never on a public-facing website. Not even temporarily.

TypeValidation MethodIssuance TimeCost (2026)Browser DisplayBest For
Domain Validation (DV)Automated DNS or HTTP checkMinutes to hours$0 via Let's EncryptPadlock only — identical to OV/EV in ChromeBlogs, portfolios, business sites, WordPress, WooCommerce
Organization Validation (OV)CA verifies legal entity exists1–3 business days$50–$200/yrPadlock only (org name visible in cert details, not address bar)Business sites that want org identity in cert metadata
Extended Validation (EV)Full legal + operational vetting1–5 business days$100–$400/yrPadlock only in Chrome/Firefox since 2019 (green bar gone)Banks, payment processors, compliance-driven enterprises
Certificate TypeCoverageKey ConstraintExample Domains Covered
Single-domainOne exact domain or subdomainCheapest for a single siteexample.com (does NOT cover www.example.com without SAN)
Wildcard (*.example.com)All first-level subdomainsDoes not cover example.com itself or sub.shop.example.comshop.example.com, api.example.com, blog.example.com
Multi-domain SANUp to 100+ listed domainsOne cert for completely unrelated domainsexample.com, otherdomain.net, staging.example.com
Wildcard + SANBase domain + subdomains + extra SANsMost flexible — some CAs charge per additional SANexample.com, *.example.com, partnersite.net

Let's Encrypt Reality: What It Does Well, Where It Fails, and How Not to Get Burned

Let's Encrypt is the most consequential development in the certificate market since HTTPS existed. It took a $100/year certificate purchase and turned it into a zero-cost automated service. In 2016, roughly 40% of web traffic was HTTPS. In 2026, it is over 95%. Let's Encrypt caused most of that shift.

Let's Encrypt vs paid commercial CA comparison: certificate trust level, validity period, wildcard support, OV and EV availability, cost, and auto-renewal method

But Let's Encrypt is not magic. It has specific operational constraints that cause real-world problems when people do not understand them. Here is the unfiltered reality:

What Let's Encrypt Does Well

Free DV certificates with identical trust to paid CAs. ISRG Root X1 is in every major browser root store. A Let's Encrypt cert is trusted by Chrome, Firefox, Safari, Edge, iOS, Android, and every major OS. There is no trust difference between a Let's Encrypt cert and a $200/year Sectigo cert for DV use cases.

ACME protocol automation. The ACME protocol (RFC 8555) is the standardized API Let's Encrypt built the market around. Certbot, Caddy, Traefik, NGINX's native certbot integration, cPanel AutoSSL, Cloudflare, and thousands of other tools implement ACME. This means certificate issuance and renewal can be completely automated — no human touch required.

90-day validity as a security feature. The 90-day validity is intentional. If a private key is compromised, the attacker's window is at most 90 days. Shorter validity periods reduce the blast radius of CA mis-issuance events (like DigiCert's August 2024 mass revocation). And they force automation — you cannot ignore a 90-day renewal cycle the way teams ignore annual ones.

Where Let's Encrypt Creates Operational Problems

Rate limits. Let's Encrypt enforces rate limits to prevent abuse. The key limits in 2026: 50 certificates per registered domain per week, 5 duplicate certificates per week, 5 failed validation attempts per account per hostname per hour. If you are running large-scale certificate automation across hundreds of subdomains, rate limits become a real operational constraint. Use a staging environment for testing.

Renewal failures that go unnoticed. The most common Let's Encrypt operational failure: automated renewal breaks silently. Common causes include DNS propagation delays during DNS-01 validation, HTTP-01 challenges failing because a plugin intercepts the /.well-known/ path, firewall rules blocking Let's Encrypt's validation servers, or a cron job that stopped running after a server migration. The failure is silent until 30 days before expiry when certbot starts logging warnings — and completely silent if nobody is checking logs.

Wildcard certs require DNS-01 and working API access. You cannot issue wildcard certs via HTTP-01 challenge. DNS-01 requires your DNS provider to support automated record creation via API. If your DNS is at a registrar with no API (many budget registrars), wildcard auto-renewal requires manual DNS edits. That breaks the automation model and makes wildcards impractical at 90-day cycles.

No OV or EV. Let's Encrypt only issues DV certificates. This is by design — automated domain control verification is incompatible with the human-verified organization checks required for OV and EV. If your use case requires OV or EV (compliance, contractual requirements, internal policy), you must use a paid commercial CA regardless of what Let's Encrypt costs.

Period / StandardMax ValidityWhat Drove the Change
Before 2020Up to 825 daysApple/Google forced reduction by updating root store policies
2020 onward398 days maxAll major browser vendors enforced this via CA/B Forum ballot
Let's Encrypt default90 daysDesigned for automation — shorter window limits compromise exposure
CA/B Forum Ballot SC-08147 days (proposed 2029)Short lifetimes force automation and reduce stale cert exposure
Practical realityAutomate or expireManual renewal at 90-day intervals fails routinely in production

Hosting Integration: How Most WordPress Sites Get Let's Encrypt

For shared hosting on cPanel, Let's Encrypt integration works through AutoSSL. AutoSSL runs on a schedule (typically daily), scans all domains on the server, issues Let's Encrypt certificates for any that don't have a valid cert, and renews certificates approaching expiry. You can check AutoSSL status in cPanel under Security → SSL/TLS Status. A green checkmark means the cert is valid and auto-renewal is active.

On VPS hosting without a control panel, the standard setup is certbot with a systemd timer:

Install certbot on Ubuntu/Debian and set up automated renewal
# Install certbot for Nginx:
sudo apt update && sudo apt install certbot python3-certbot-nginx

# Issue certificate (certbot edits your nginx config automatically):
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com

# Verify the renewal timer is active:
sudo systemctl status certbot.timer

# Test renewal without actually renewing (dry run):
sudo certbot renew --dry-run

# Manual renewal check (safe to run daily via cron):
0 3 * * * /usr/bin/certbot renew --quiet

How to Install Free SSL with Cloudflare on WordPress (The Practical Way)

Cloudflare's free plan is the fastest path to HTTPS for WordPress sites, especially if your host doesn't provide AutoSSL or you want edge-level HTTPS without touching your server configuration. The setup takes under 10 minutes and gives you HTTPS, HTTP/2, HSTS, automatic HTTPS rewrites, and Cloudflare's WAF — all at zero cost.

Cloudflare free SSL setup dashboard showing SSL/TLS encryption mode set to Full Strict with Edge Certificate status active

Here is the complete setup, including the mode setting that most guides get wrong:

1

Add Your Domain to Cloudflare

Go to cloudflare.com, create a free account, click "Add a Site", enter your domain, and select the Free plan. Cloudflare scans your existing DNS records and imports them. Review the imported records before continuing — check that your A records, MX records, and any CNAME records are present and correct.

2

Update Your Nameservers

Cloudflare provides two nameservers (e.g. anna.ns.cloudflare.com). Log into your domain registrar and replace the current nameservers with Cloudflare's. Propagation takes 5 minutes to 48 hours depending on your registrar's TTL. Most modern registrars complete this within 30 minutes. Cloudflare sends an email when the nameserver change is detected.

3

Set SSL Mode to "Full (Strict)" — Not Just "Full"

This is where most guides send you wrong. In Cloudflare dashboard → SSL/TLS → Overview, you see four modes:

  • Off — HTTP only. Never use this.
  • Flexible — Visitor-to-Cloudflare is HTTPS, Cloudflare-to-origin is HTTP. Looks like HTTPS to visitors but your server never gets encrypted traffic. Avoid.
  • Full — Cloudflare-to-origin is HTTPS but accepts any certificate, including expired or self-signed. Protects the channel but not identity.
  • Full (Strict) — Cloudflare-to-origin requires a valid certificate. Use this. It encrypts the entire path and validates your origin cert.

Set it to Full (Strict). Then get a free Cloudflare Origin Certificate (under SSL/TLS → Origin Server) for the Cloudflare-to-origin connection — it is valid for 15 years and is free.

4

Enable Always Use HTTPS and Automatic HTTPS Rewrites

In SSL/TLS → Edge Certificates, enable both: Always Use HTTPS (redirects all HTTP requests to HTTPS at Cloudflare's edge, before the request reaches your server) and Automatic HTTPS Rewrites (fixes most mixed content issues by rewriting HTTP asset URLs to HTTPS in the page HTML). These two settings solve the redirect and mixed content problems in one click.

5

Enable HSTS (Optional but Recommended)

Also in Edge Certificates, enable HTTP Strict Transport Security (HSTS). Set max-age to at least 6 months (15768000 seconds). Enable "Include subdomains" if all your subdomains are also HTTPS. HSTS tells browsers to always use HTTPS for your domain — no redirect needed, no HTTP fallback possible. Note: once enabled, it is difficult to undo quickly (browsers cache the HSTS directive). Only enable if you are committed to HTTPS permanently, which you should be.

6

Update WordPress Site URL to HTTPS

In WordPress, go to Settings → General and update both WordPress Address and Site Address from http:// to https://. Then fix existing database content with WP-CLI or the Better Search Replace plugin. Without this step, your WordPress-generated URLs will continue outputting HTTP, causing mixed content warnings despite Cloudflare's HTTPS.

wp search-replace 'http://yourdomain.com' 'https://yourdomain.com' \
  --all-tables --report-changed-only --skip-columns=guid

Cloudflare Free SSL vs Your Host's AutoSSL: Which to Use

Both work. The practical difference is what the certificate secures. Cloudflare's edge certificate secures the visitor-to-Cloudflare connection. Your host's AutoSSL certificate secures the Cloudflare-to-origin connection. For Full (Strict) mode, you need both. If your host provides AutoSSL, use it for the origin — it is automatically managed and free. The Cloudflare edge certificate is automatically managed by Cloudflare and also free. With this setup, the entire path is encrypted with valid, automatically-renewed certificates at zero cost.

Mixed Content Errors: Why Your Padlock Breaks After Migrating to HTTPS

You installed the certificate. You set up the redirect. Chrome still shows "Not Secure." This is the most common post-migration headache in web security, and it has one cause in nearly every case: there is at least one resource on your HTTPS page loading over HTTP.

Browser Not Secure warning: HTTPS page loading an HTTP image resource, breaking the secure connection indicator with mixed content

A "secure" HTTPS page is defined by everything on it being served over HTTPS. One HTTP image, one HTTP script, one HTTP iframe — and the page is no longer considered fully secure. Chrome distinguishes between two types:

Active Mixed Content — Blocked

Scripts (<script src="http://...">), stylesheets (<link href="http://...">), iframes (<iframe src="http://...">), and XMLHttpRequests over HTTP. Chrome silently blocks these without displaying them. Your page may break functionality without any visible error. The Security tab in DevTools shows what was blocked.

Passive Mixed Content — Warned

Images (<img src="http://...">), audio (<audio src="http://...">), and video over HTTP. Chrome displays these but shows the "Not Secure" badge in the address bar. The connection indicator changes from a padlock to a warning icon. Visitors see the degraded security indicator.

Where Mixed Content Comes From in WordPress

After an HTTP-to-HTTPS migration, mixed content almost always originates from one of these sources:

  • WordPress database: Your site URL was stored as http://yourdomain.com in the database before migration. WordPress uses this as the base for every generated URL. Even after you update Settings → General, old content stored in posts, pages, and theme options still contains the old HTTP URLs.
  • Theme hardcoded URLs: Some themes hardcode asset paths as http:// instead of protocol-relative // or HTTPS. This requires editing the theme files or child theme.
  • Third-party embeds: YouTube embeds, Google Maps, social media widgets, and advertising scripts that use HTTP URLs in their embed code.
  • Plugin-generated content: Page builders, gallery plugins, and backup plugins sometimes store full URLs with the HTTP scheme in their own database tables.
  • CSS background images: background-image: url('http://...') in stylesheets is easy to miss because it doesn't appear in HTML source.

How to Find and Fix Every Mixed Content Source

Fix WordPress mixed content — the complete sequence
# Step 1: Search-replace in database (use WP-CLI):
wp search-replace 'http://yourdomain.com' 'https://yourdomain.com' \
  --all-tables \
  --report-changed-only \
  --skip-columns=guid

# Step 2: Check for remaining HTTP references in theme files:
grep -r "http://" wp-content/themes/your-theme/ \
  --include="*.css" \
  --include="*.php" \
  --include="*.js"

# Step 3: Find HTTP assets on a live page (using curl):
curl -s https://yourdomain.com | grep -o 'src="http://[^"]*"'

# Step 4: Check with online tool:
# https://www.whynopadlock.com — paste your URL, see every HTTP resource

After fixing the sources, clear all caches — WordPress page cache, object cache, CDN cache, and browser cache. Mixed content that was cached before the fix will persist until the cache expires or is purged.

The SEO Impact of Mixed Content

Mixed content itself is not a direct Google ranking factor. But it causes two indirect SEO problems. First, the "Not Secure" browser warning increases bounce rate — visitors who see a security warning on an HTTP page leave faster. Second, if active mixed content causes JavaScript to fail silently, interactive features break (forms, shopping carts, JavaScript-rendered content), which signals poor user experience to Google's crawlers. Fix mixed content for user experience first. SEO benefits follow from the improved user metrics.

HTTPS Performance Myths: Why the "SSL Slows You Down" Argument Is Ten Years Outdated

In 2010, this was true. TLS 1.0 handshakes were expensive. Asymmetric cryptography was CPU-intensive. HTTP/1.1 opened a new TCP connection per request, so every connection paid the full handshake cost. "HTTPS slows your site" was real advice then.

It is 2026. Every one of those performance problems has a solution. Here is where the "HTTPS adds overhead" myth breaks down:

Myth: TLS Adds Significant CPU Overhead

Reality: AES-NI hardware acceleration is present in every server CPU made after 2010. AES encryption and decryption on modern hardware is essentially free at the CPU level. The computational overhead of TLS 1.3 symmetric encryption is less than 1% of server CPU load on any modern hosting infrastructure. TLS offloading to hardware accelerators (or CDN edge servers) makes this a non-issue at scale.

Myth: Every HTTPS Request Pays the Handshake Cost

Reality: HTTP/2 multiplexes many requests over a single TLS connection. Once the handshake is complete, every subsequent request on that connection reuses the session — no new handshake, no additional latency. HTTP/2 is supported by all modern browsers and every major host. The one-time handshake cost is amortized across dozens of requests on a single page load.

Myth: HTTP/2 Doesn't Require HTTPS

Reality: HTTP/2 is technically defined without requiring HTTPS (h2c, cleartext mode exists in the spec). But every major browser — Chrome, Firefox, Safari, Edge — only implements HTTP/2 over TLS. In practice, HTTP/2 requires HTTPS. You cannot use HTTP/2 on an HTTP page in any major browser. This means running HTTP means you are limited to HTTP/1.1's one-request-per-connection model — which is actually a performance argument FOR HTTPS, not against it.

Myth: TLS Adds 200ms+ to Every Request

Reality: TLS 1.3 requires one round-trip for the handshake. On a CDN edge server 5ms away, the TLS overhead is approximately 10ms for the first connection — paid once, not per request. Session resumption (0-RTT) can reduce this to near-zero for repeat visitors. On well-configured servers, TTFB measurements show no meaningful difference between HTTP and HTTPS in controlled tests — the server processing time dominates.

HTTP/3 and QUIC: HTTPS Gets Faster, HTTP Gets Left Behind

Reality: HTTP/3 uses QUIC (Quick UDP Internet Connections) as its transport, replacing TCP entirely. QUIC has TLS 1.3 built into the protocol at the connection layer — there is no "QUIC without TLS." HTTP/3 is faster than HTTP/1.1 in nearly every real-world scenario (fewer round-trips, better loss recovery, connection migration). HTTP/3 is HTTPS by definition. The performance trajectory from HTTP/1.1 → HTTP/2 → HTTP/3 is a story of HTTPS getting progressively faster relative to unencrypted HTTP.

The Real HTTPS Performance Win: HSTS Removes One Redirect

Reality: Without HSTS, a user who types your domain without https:// gets an HTTP response with a 301 redirect to HTTPS — adding one round-trip before the page even starts loading. With HSTS, the browser remembers to always use HTTPS and skips the initial HTTP request entirely. HSTS + HSTS preloading removes this redirect overhead permanently for returning visitors. HTTPS with HSTS is actually faster than a site without HTTPS configured properly.

What HTTPS Does NOT Protect Against: The Honest List

This section makes a lot of people uncomfortable because it contradicts the way HTTPS is marketed. But understanding the limits of HTTPS is what separates a site owner with a security strategy from one with a false sense of security.

HTTPS padlock misconception: legitimate bank site and phishing site both displaying the padlock icon, annotated to explain what the lock does and does not guarantee

Malware Served Over HTTPS

A website can serve drive-by malware downloads over a perfectly valid HTTPS connection. The certificate authenticates the server's identity and encrypts the connection. It says nothing about whether the files being delivered are malicious. Ransomware distribution sites, exploit kits, and malvertising all run HTTPS. The encrypted channel makes the malware harder to detect by in-transit filtering systems — HTTPS actually benefits malware distribution over unencrypted HTTP in some scenarios.

Hacked WordPress Plugins

The most common WordPress compromise vector is a vulnerable plugin — a backdoor in an abandoned plugin, an SQL injection in a contact form, a remote code execution in an outdated page builder. HTTPS encrypts the traffic to and from your server. It does nothing about what runs on your server. A site with perfect HTTPS and an unpatched Elementor 3.5.0 is a compromised site. HTTPS and plugin security are orthogonal concerns. You need both.

Phishing Attacks

As established earlier in this guide: DV certificates are free and can be obtained in minutes for any domain. Phishing sites routinely use HTTPS. The FBI's Internet Crime Complaint Center has been warning about this since 2018. Consumers trained to "look for the padlock" are being misled. Phishing is a domain-name problem and a social engineering problem, not a certificate problem. HTTPS cannot help.

Weak Passwords and Credential Stuffing

HTTPS encrypts your password as it travels from browser to server. It does not protect the password from being guessed, brute-forced, or reused from another breached site. Credential stuffing attacks — trying username/password combinations from leaked databases against your login page — work just fine over HTTPS. Protect against this with rate limiting, two-factor authentication, and strong password policies. None of those involve the certificate.

Server-Side SQL Injection and XSS

SQL injection exploits unsanitized database queries in your application code. Cross-site scripting exploits unsanitized output in your HTML. Both attacks happen at the application layer — after HTTPS has done its job of delivering the request to your server. HTTPS delivers the attacker's malicious payload to your application encrypted, just as it delivers legitimate requests. Input validation, prepared statements, and output encoding are the defenses here. The certificate is irrelevant.

Server Misconfigurations

Directory listing enabled, .env files accessible over HTTP, database ports open to the internet, weak SSH keys, default WordPress admin paths with no brute force protection — HTTPS does not address any of these. Security researchers regularly find production sites with valid HTTPS certificates that expose /wp-content/debug.log or have phpMyAdmin accessible from public IPs. The certificate secures the channel. Server hardening secures what that channel connects to.

DNS Hijacking (Before the TLS Handshake)

If an attacker gains control of your DNS records and redirects your domain to their server, HTTPS protects you only if they cannot obtain a valid certificate for your domain. Certificate Transparency logs (public, append-only records of every certificate issued) and CAA DNS records (specifying which CAs can issue for your domain) are the defenses here. Set example.com. IN CAA 0 issue "letsencrypt.org" in your DNS to restrict certificate issuance to specific CAs. HTTPS alone does not protect against DNS-level attacks.

Common HTTPS Errors: What They Mean and How to Fix Each One

HTTPS errors are usually diagnostic rather than catastrophic. Most have clear causes and straightforward fixes once you understand what the browser is actually telling you. Here is the full set with root causes and resolution paths:

ErrorRoot CauseFix
NET::ERR_CERT_AUTHORITY_INVALIDSelf-signed cert or untrusted CA rootReplace with a cert from a trusted CA — never use self-signed in production
NET::ERR_CERT_DATE_INVALIDCertificate expiredRenew immediately. Set up automated renewal to prevent recurrence.
NET::ERR_CERT_COMMON_NAME_INVALIDDomain in cert doesn't match URL (CN/SAN mismatch)Issue a cert that includes the correct domain in its SAN field
Mixed content warning / Not Secure badgeHTTPS page loading one or more HTTP assetsFind all http:// asset URLs and rewrite to https:// or protocol-relative //
SSL_ERROR_RX_RECORD_TOO_LONGServer not configured for SSL on port 443 (sending HTTP on HTTPS port)Verify SSL is bound to port 443 in your web server config
HSTS error — cannot click throughSite in HSTS preload list; cert is invalid or expiredFix the certificate. No browser bypass exists for HSTS preloaded domains.
ERR_SSL_VERSION_OR_CIPHER_MISMATCHServer only offers deprecated TLS versions or ciphersDisable TLS 1.0/1.1 and weak ciphers; enable TLS 1.2 and 1.3 only

The Incomplete Certificate Chain (The Invisible One)

This error is subtle: your certificate is valid, your domain matches, the cert is not expired — but some clients (especially older Android versions and certain curl configurations) show a trust error. The cause is your server not sending the intermediate CA certificate alongside the leaf certificate.

Your cert chain is: Your Cert → Intermediate CA → Root CA. The browser trusts the Root CA. The Intermediate CA bridges the gap. If your server only sends the leaf cert without the intermediate, browsers that have the intermediate cached will work fine. Clients without the intermediate cached will fail.

Test for incomplete certificate chain and fix it in Nginx
# Test for chain completeness (openssl should show no errors):
openssl s_client -connect yourdomain.com:443 -verify 5 2>&1 | grep -E "Verify|depth"

# For Nginx: combine your cert and the intermediate into one file:
cat yourdomain.crt intermediate.crt > yourdomain_chained.crt

# In nginx.conf:
ssl_certificate /etc/nginx/ssl/yourdomain_chained.crt;
ssl_certificate_key /etc/nginx/ssl/yourdomain.key;

# For Let's Encrypt, certbot already creates fullchain.pem which includes intermediates:
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;

HSTS Errors: The One You Cannot Click Through

If your site sent an HSTS header previously and a visitor's browser cached it, that browser will refuse any non-HTTPS connection for the duration of the max-age — and will refuse an HTTPS connection with an invalid certificate with no override option. There is no "Advanced — proceed anyway" for HSTS-enforced connections.

This is the correct behavior — HSTS is designed to prevent exactly this kind of click-through bypass. But it means: if you deploy HSTS and then your certificate expires, your site is completely inaccessible to all users who received the HSTS header, with no workaround until the certificate is valid again. Fix the certificate first. HSTS enforcement is not a bug, but it makes expired certificates much more severe.

Check your HSTS configuration and test SSL grade
# Check if your site sends HSTS:
curl -sI https://yourdomain.com | grep -i "strict-transport"

# Good HSTS header output:
# strict-transport-security: max-age=31536000; includeSubDomains; preload

# Full SSL Labs-equivalent audit (free, open source):
# https://www.ssllabs.com/ssltest/analyze.html?d=yourdomain.com
# Target: A+ grade (requires TLS 1.3, HSTS, no weak ciphers)

TLS Version History: What to Enable, What to Disable

ProtocolYearStatus (2026)Known VulnerabilitiesNotes
SSL 2.01995DeadAllDisabled everywhere. Do not reference this as a current standard.
SSL 3.01996Dead (POODLE)AllRFC 7568 prohibited in 2015. POODLE attack decrypts sessions.
TLS 1.01999RemovedBEASTChrome/Firefox/Safari dropped support in 2020.
TLS 1.12006RemovedBEAST (partial)Removed from all major browsers in 2020.
TLS 1.22008SupportedNone (if configured correctly)Still widely deployed. Secure with correct cipher suite selection.
TLS 1.32018RecommendedNoneOne round-trip handshake, forward secrecy mandatory, fewer cipher options.

Run testssl.sh --protocols yourdomain.com to see exactly what your server accepts. Any server still accepting TLS 1.0 or TLS 1.1 will fail PCI-DSS scans, score below A on SSL Labs, and be flagged by security auditing tools. Disable them explicitly in your server configuration — most servers have a directive for minimum protocol version.

Disable TLS 1.0 and 1.1 in Nginx — enforce TLS 1.2 and 1.3 only
# In your Nginx server block or http block:
ssl_protocols TLSv1.2 TLSv1.3;

# Strong cipher suites for TLS 1.2 (TLS 1.3 handles its own ciphers):
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on;

# Enable OCSP stapling (prevents extra round-trip for revocation check):
ssl_stapling on;
ssl_stapling_verify on;

Related Guides

SSL certificates are one layer of the security stack. The certificate encrypts transit — it does nothing about the threats that operate at the application layer, server configuration layer, or DNS layer. Related guides worth reading alongside this one:

  • Web Hosting Security Threats — DDoS, brute force, SQL injection, XSS: which attacks your host mitigates and which ones you own.
  • DNS Records Explained — CAA records restrict which CAs can issue certs for your domain. DNSSEC authenticates DNS responses. Both are SSL-adjacent security layers worth understanding.
  • TTFB Explained — How the TLS handshake fits into the full HTTP request lifecycle and how CDNs minimize its contribution to total load time.
  • Best WordPress Hosting — Which hosts include AutoSSL and managed certificate provisioning vs which ones require manual setup.
  • cPanel Guide — How AutoSSL works inside cPanel, where to verify cert status, and how to handle domains excluded from auto-provisioning.

SSL and HTTPS FAQ

Is SSL the same as HTTPS?

No — and knowing the difference prevents bad decisions. SSL (Secure Sockets Layer) is the old protocol name, deprecated since 2015. The protocol actually running your HTTPS connection today is TLS 1.2 or TLS 1.3. HTTPS is HTTP running over a TLS-encrypted connection. The 'SSL certificate' is the credential the server presents during the TLS handshake — it is technically a TLS certificate, but the industry never renamed it. When someone says 'install an SSL certificate' they mean a TLS certificate that enables HTTPS. The protocol is TLS. The credential is the certificate. HTTPS is the result.

Does the HTTPS padlock mean a website is safe?

No — and this is the most exploited misconception in web security. The padlock means the connection between your browser and the server is encrypted. It says nothing about whether the site is legitimate, safe, or honest. A phishing site can get a free DV certificate from Let's Encrypt in under five minutes. That phishing site gets the padlock. The victim enters their credentials. Everything is encrypted perfectly all the way to the attacker. HTTPS is a floor condition — any legitimate site must have it. But a padlock is not a safety certification. Check the domain name itself, not just the lock icon.

What is the difference between DV, OV, and EV certificates?

All three types produce identical encryption strength. The difference is only what the Certificate Authority verified about the person or organization requesting the certificate. DV (Domain Validation) confirms you control the domain — automated, takes minutes, free via Let's Encrypt. OV (Organization Validation) confirms your organization legally exists — manual CA verification, takes 1–3 days, costs $50–$200/yr. EV (Extended Validation) involves full legal and operational vetting — takes 1–5 days, costs $100–$400/yr. The critical 2026 caveat: Chrome and Firefox removed the visible EV organization name from the address bar in 2019. Today, DV, OV, and EV all look identical to most visitors — the same padlock, no visible difference. For most websites, free DV from Let's Encrypt is the right choice.

Is Let's Encrypt trustworthy?

Completely. Let's Encrypt is operated by the Internet Security Research Group (ISRG), a nonprofit. Their root certificate (ISRG Root X1) has been in every major browser and operating system root store since 2021. They have issued over 3 billion certificates since 2016. Chrome, Firefox, Safari, Edge, and every major mobile browser trust Let's Encrypt certificates natively. The 'free' part does not mean lower trust — trust comes from being included in browser root stores, not from price. What Let's Encrypt cannot provide is OV or EV validation (those require human verification). For DV certificates, Let's Encrypt is technically equal to Sectigo, DigiCert, or any paid commercial CA.

How do I install a free SSL certificate using Cloudflare?

Add your domain to Cloudflare (free plan works), update your nameservers to Cloudflare's, then go to SSL/TLS > Overview and set the mode to 'Full (strict)'. Cloudflare automatically provisions an edge certificate — this covers the visitor-to-Cloudflare connection. For the Cloudflare-to-origin connection under Full Strict mode, your origin server also needs a certificate. Use the Cloudflare Origin Certificate (free, 15-year validity) under SSL/TLS > Origin Server, or enable your host's Let's Encrypt AutoSSL. Enable 'Always Use HTTPS' and 'Automatic HTTPS Rewrites' in SSL/TLS settings. This setup gives you HTTPS, HSTS, HTTP/2, and Cloudflare's WAF all in one step at zero cost.

What happens when my SSL certificate expires?

Your site becomes unreachable to most visitors. Chrome, Firefox, Safari, and Edge all show a full-page blocking warning — 'Your connection is not private' with error code NET::ERR_CERT_DATE_INVALID. Sites in the HSTS preload list cannot be bypassed even with 'Advanced — proceed anyway.' Most users leave immediately. Google crawlers may flag and de-index the page. Affiliate programs and ad networks may suspend accounts. The fix is renewing the certificate — but if your process was manual and you missed notification emails, you may have hours of effective downtime. Automate renewal via certbot, cPanel AutoSSL, or Cloudflare before expiry becomes a crisis.

What is a wildcard SSL certificate?

A wildcard certificate covers all first-level subdomains under a single domain using an asterisk: *.example.com covers shop.example.com, api.example.com, blog.example.com — but NOT example.com itself (add it as a SAN) and NOT sub.shop.example.com (only one level deep). Wildcards are useful when you have many subdomains that change frequently. Free wildcard certificates are available from Let's Encrypt using DNS-01 challenge — you need a DNS provider with API access so your ACME client can automatically add and remove TXT records. If your DNS provider has no API, wildcard auto-renewal requires manual DNS editing every 60 days, which defeats the purpose.

What is mixed content and how do I fix it?

Mixed content happens when an HTTPS page loads one or more resources — images, scripts, stylesheets, iframes — over HTTP. Browsers block active mixed content (scripts, iframes) silently and warn on passive mixed content (images). Even a single HTTP image URL on an HTTPS page can produce a 'Not Secure' warning. The cause after a WordPress HTTP-to-HTTPS migration is almost always database entries still containing http:// URLs. Fix it by running WP-CLI: wp search-replace 'http://yourdomain.com' 'https://yourdomain.com' --all-tables. Then check for hardcoded URLs in themes and plugins. Use Chrome DevTools Security tab or the free Why No Padlock tool to identify every remaining HTTP resource.

Does HTTPS slow down my website?

Not meaningfully in 2026. TLS 1.3 reduced the handshake from two round-trips to one. HTTP/2 multiplexes multiple requests over a single TLS connection, meaning the handshake overhead is paid once, not per request. On a CDN like Cloudflare, TLS is terminated at the edge server close to the visitor, so handshake latency is typically under 5ms. The claim that HTTPS adds significant overhead was true in 2010 with TLS 1.0 and no HTTP/2. Today, a correctly configured server on TLS 1.3 with HTTP/2 and session resumption has HTTPS overhead measured in single-digit milliseconds. The performance argument against HTTPS is obsolete.

Can I get SSL for free on WordPress?

Yes, in multiple ways. The easiest is through your host: most cPanel hosts include AutoSSL which automatically provisions and renews Let's Encrypt certificates for every domain on your account at no cost. If your host does not provide it, use Cloudflare's free plan — add your domain, update nameservers, enable SSL mode to Full (strict), and your site gets HTTPS from Cloudflare's edge. If you manage your own VPS, install certbot (sudo apt install certbot python3-certbot-nginx) and run sudo certbot --nginx -d yourdomain.com. Certbot sets up automated renewal via a systemd timer. Free DV SSL is universally available in 2026 — there is no reason to pay for a certificate for a standard WordPress site.

What is a self-signed certificate?

A self-signed certificate is one where the server signs its own certificate rather than using a trusted Certificate Authority. There is no trusted third party in the chain. Browsers display a hard blocking error for self-signed certs in production — 'Your connection is not private' with NET::ERR_CERT_AUTHORITY_INVALID — because anyone could create a self-signed cert for any domain. Self-signed certificates are legitimate only for internal services, local development environments, and machine-to-machine systems where both parties explicitly trust the certificate through out-of-band configuration. Never use a self-signed certificate on a public-facing production website.

Does HTTPS protect against hacking?

Only against one specific type of attack: interception of data in transit between your visitor's browser and your server. HTTPS does not protect against hacked WordPress plugins, SQL injection into your database, malware uploaded through a file upload vulnerability, brute force login attempts, phishing using a legitimate-looking certificate, server misconfigurations, or any attack that happens on the server side. Most WordPress site compromises happen through vulnerable plugins, weak passwords, or outdated core — none of which HTTPS touches. HTTPS is necessary but not sufficient for a secure website. The full security stack includes strong passwords, updated software, WAF, malware scanning, and regular backups.