Private & internal SSL

Self-Signed vs CA-Signed SSL: Private, Internal and Local Certificates

Self-signed certificates encrypt traffic but no browser trusts them, so they suit labs and closed systems only. For anything people visit, a CA-signed certificate or your own private CA is the better choice.

Self signed SSL certificates are certificates signed by their own private key instead of by a certificate authority (CA). They encrypt traffic just as well as CA-signed certificates, but browsers and operating systems do not trust them, so every visitor sees a security warning. Use them for testing and closed systems; use a CA-signed certificate for anything public.

The choice is rarely “self-signed or nothing.” You have three realistic options: a self-signed certificate, a private CA you control, or a publicly trusted certificate from a CA.

OptionTrusted by default?Works for internal names / private IPs?Best for
Self-signed certificateNo – warning everywhereYesQuick tests, one-off lab devices
Private CA (your own root)Only on devices where you install the rootYesIntranets, homelabs, managed company devices
Public CA-signed certificateYes – all browsersNo (public domains and, with some products, public IPs only)Websites, APIs, anything outside your control

Need trust without warnings?

A domain validated certificate is issued in minutes once you prove domain control, and every browser trusts it.

Compare DV SSL certificates

What is a self-signed SSL certificate?

A self-signed SSL certificate is an X.509 certificate whose issuer and subject are the same, signed with its own private key. No third party has checked who created it, so clients have no reason to trust it.

A CA-signed certificate works differently. A public CA verifies that you control the domain (and, for OV/EV, your organization), then signs your certificate with a key that chains to a root already in every browser’s trust store. That chain of signatures is what removes the warning.

Self-signed SSL certificate vulnerability: why warnings matter

The encryption of a self-signed certificate is not weaker. The risk is that clients cannot tell your certificate from an attacker’s. When users learn to click through warnings, a man-in-the-middle (an attacker who intercepts traffic between client and server) can present their own self-signed certificate and nobody notices. The same risk appears in code that skips validation – read about the risks of disabling SSL verification before you add an “ignore certificate” flag.

Should I use a self-signed certificate for an internal server?

Only if very few people use it and you can install the certificate on their devices. For anything wider, run a private CA or use a public certificate for an internal hostname under a domain you own.

  • Self-signed: fine for a single admin panel, a test VM or a device only you open.
  • Private CA: create one root, install it once on managed devices (for example via group policy or MDM), then issue as many internal certificates as you need without warnings.
  • Public certificate for an internal FQDN: if the server uses a name such as intranet.example.com on a public domain you own, a public CA can issue for it, even if the server is reachable only inside your network. A domain validated (DV) SSL certificate with DNS-based validation is enough.
Tip: For intranet SSL certificates, the third option is often the simplest. Use a real subdomain of your public domain, resolve it internally with split DNS, and validate it with a DNS TXT record – no root to distribute.

Can I get an SSL certificate for an internal hostname like server.local?

No. Since 2015, publicly trusted CAs do not issue certificates for internal names such as server.local, intranet or mail.corp, because nobody can prove unique ownership of them. You need a private CA, a self-signed certificate or a rename to a public domain.

SSL certificates for internal server names therefore come down to these choices:

  1. Rename the host to a subdomain of a domain you own (for example nas.home.example.com) and buy a public certificate.
  2. Keep the internal name and issue from your own private CA.
  3. Keep the internal name and use a self-signed certificate on a handful of trusted devices.

For local SSL certificates in your homelab, the reserved name home.arpa (RFC 8375) is a cleaner choice than .local, which is reserved for multicast DNS and can cause name-resolution conflicts.

Can I get a publicly trusted SSL certificate for an IP address?

For a public IP address, yes – some CAs issue certificates that list a public IP, usually as OV products. For a private IP address such as 192.168.1.10 or 10.0.0.5, no public CA will issue one.

Address typePublic CA certificate?What to use
Public IPv4/IPv6 you controlYes, with selected productsAn OV product that supports IP addresses – check the product page
Private IP (RFC 1918 ranges)NoPrivate CA or self-signed, with the IP in the SAN
Reserved / loopback (127.0.0.1)NoSelf-signed or a local development CA

An SSL certificate for a private IP address must carry the address in the Subject Alternative Name (SAN) field as an IP entry. Modern browsers ignore the Common Name, so a certificate without a matching SAN fails even if you trust the root.

How to create a self-signed SSL certificate

  1. Install OpenSSL 1.1.1 or newer

    Run <code>openssl version</code>. Version 1.1.1 or later supports the <code>-addext</code> option used below.

  2. Run the one-liner with a SAN

    Create the key and certificate in one command (see code below). Replace the hostname and IP with your own.

  3. Install on the server

    Point your web server to <code>server.crt</code> and <code>server.key</code>, then reload it.

  4. Trust it on your devices

    Import <code>server.crt</code> into the trust store of each device that connects, or accept the warning only on a test machine.

Create a self-signed SSL certificate with OpenSSL

This command creates a 2048-bit RSA key and a self-signed certificate valid for one year, with both a hostname and a private IP in the SAN:

openssl req -x509 -newkey rsa:2048 -nodes -sha256 -days 365 \
  -keyout server.key -out server.crt \
  -subj "/CN=nas.home.arpa" \
  -addext "subjectAltName=DNS:nas.home.arpa,IP:192.168.1.10"

-x509 outputs a certificate instead of a request, and -nodes leaves the key unencrypted so the server can start unattended (OpenSSL 3 also accepts -noenc). Check the result with:

openssl x509 -in server.crt -noout -text | grep -A1 "Subject Alternative Name"

This works the same way to create a self-signed SSL certificate for a home server, a NAS or a Raspberry Pi.

Private SSL certificates from your own CA

If you have more than two or three internal services, a small private CA saves work: you trust one root on each device, and every certificate it signs is accepted. In bash, the three steps look like this:

# 1. Create the private root CA (keep ca.key offline)
openssl req -x509 -newkey rsa:3072 -nodes -sha256 -days 3650 \
  -keyout ca.key -out ca.crt -subj "/CN=Home Lab Root CA"

# 2. Create a key and CSR for the server
openssl req -new -newkey rsa:2048 -nodes \
  -keyout nas.key -out nas.csr -subj "/CN=nas.home.arpa"

# 3. Sign the CSR with your CA, adding the SAN
openssl x509 -req -in nas.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
  -out nas.crt -days 365 -sha256 \
  -extfile <(printf "subjectAltName=DNS:nas.home.arpa,IP:192.168.1.10")

Then import ca.crt – never ca.key – into the trust store of each device. Anyone who gets ca.key can issue certificates your devices will trust, so protect it like a password vault.

How to generate a private key for an SSL certificate

Generate the key on the server that will use it, and never send it to anyone – including your CA. Use RSA 2048 or ECC P-256:

# RSA 2048
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out private.key

# ECC P-256
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out private.key

chmod 600 private.key

For a CA-signed certificate, you create a certificate signing request (CSR) from this key and send only the CSR. Our CSR generator builds the matching OpenSSL command for you.

“SSL certificate private key missing” – what now?

A certificate is useless without the private key that matches it. If the key is lost, you cannot recover it: generate a new key and CSR, then reissue the certificate (free during your plan term). On Windows, the error usually means the certificate was imported on a different machine than the one that created the request.

Private key for a wildcard SSL certificate

A wildcard certificate is often installed on several servers, so its private key is copied too. Each copy is a place it can leak. Limit the servers that hold it, store it with strict permissions and reissue with a new key if any server is compromised.

Trusted DV certificates for public hostnames

Replace browser warnings with real trust

If your server has a public name, a domain validated certificate removes warnings on every device with no root to install.

Compare DV SSL certificates

Products

Categories

  • DV SSL Certificates

    Fast domain validation for websites that primarily need HTTPS and do not require organization-level…

    from $8.99
  • OV SSL Certificates

    Organization Validation SSL for businesses that want the organization behind a website to be…

    from $41.99

Related articles

Frequently asked questions

Should I use a self-signed certificate for an internal server?

Only for small, closed setups where you can install the certificate on every client. Otherwise users see warnings and learn to ignore them, which invites man-in-the-middle attacks. Better options are a private CA whose root you deploy to managed devices, or a publicly trusted certificate for an internal hostname under a public domain you own, validated through a DNS TXT record.

Can I get a publicly trusted SSL certificate for an IP address?

Yes for public IP addresses, with selected products – usually OV certificates from CAs that support IP validation. Check the product page before ordering. No public CA issues certificates for private IP addresses such as 192.168.x.x or 10.x.x.x, or for loopback addresses. For those, use a private CA or a self-signed certificate with the IP listed in the Subject Alternative Name.

Can I get an SSL certificate for an internal hostname like server.local?

Not from a public CA. Since 2015, publicly trusted CAs do not issue certificates for internal names such as server.local or intranet, because ownership cannot be verified. Your options are to rename the host to a subdomain of a public domain you own and buy a public certificate, to issue from your own private CA, or to use a self-signed certificate on a few trusted devices.

What is a self-signed SSL certificate?

A self-signed SSL certificate is a certificate signed with its own private key rather than by a certificate authority. Its issuer and subject are identical, so no independent party has verified it. The encryption is as strong as a CA-signed certificate, but browsers and operating systems do not trust it by default and show a security warning unless you manually install it as trusted.

How do I create a self-signed SSL certificate?

With OpenSSL 1.1.1 or newer, run one command: openssl req -x509 -newkey rsa:2048 -nodes -sha256 -days 365 -keyout server.key -out server.crt -subj "/CN=host" -addext "subjectAltName=DNS:host,IP:192.168.1.10". Replace the hostname and IP with your own. Browsers require the SAN entry, so do not rely on the Common Name. Then configure your server with both files and trust the certificate on clients.

How do I generate a private key for an SSL certificate?

Generate it on the server that will use it with OpenSSL: "openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out private.key" for RSA, or use "-algorithm EC -pkeyopt ec_paramgen_curve:P-256" for ECC. Restrict access with chmod 600. Never send the private key to anyone; for a CA-signed certificate you send only the CSR created from it.