Sample certificates for testing

Test certificates, chains and CSRs to download, each built to show one problem, with checksums

Test certificates, chains and signing requests to download, each built to show one thing: a valid server certificate, a wildcard, an EC key, an expired certificate, a chain in the wrong order, a CSR without SAN. Every sample opens in the Certificate and CSR decoder with one click, so you can see exactly what a strict client will complain about before you test your own system with it.

All samples come from a small test PKI built for this page. Its root is named NOT TRUSTED, every name is a reserved example name, and no private key is published: the keys were deleted when the set was built.

Download everything: zaur-it-sample-certificates.zip (36.4 KB, every sample plus a README) and the checksum file SHA256SUMS.

Valid certificates

Everything here is well formed. Use them to test that a system accepts what it should: an import, a binding, a trust store, a monitoring check that must stay green.

SampleWhat the decoder showsDownloadOpen
Server certificate
server-leaf
www.example.com and example.com, RSA 2048. The decoder adds two notes: the issuer is not in the file (normal for a single certificate) and the private-CA lifetime.server-leaf.pem (1.7 KB)
server-leaf.cer (1.2 KB)
Open in the decoder
Server certificate with its chain
server-fullchain
Leaf first, then the issuing CA: the chain order check passes. The .p7b is the same chain as PKCS #7, the format Windows exports.server-fullchain.pem (3.4 KB)
server-fullchain.p7b (2.5 KB)
Open in the decoder
Wildcard
wildcard
*.example.com plus example.com in the SAN.wildcard.pem (1.7 KB)Open in the decoder
Several names
multi-san
Four DNS names, an IPv4 and an IPv6 address in one certificate.multi-san.pem (1.7 KB)Open in the decoder
EC P-256 key
ec-p256
Elliptic curve key on P-256, signed by the RSA issuing CA.ec-p256.pem (1.4 KB)Open in the decoder
EC P-384 key
ec-p384
Elliptic curve key on P-384.ec-p384.pem (1.4 KB)Open in the decoder
Ed25519 key
ed25519
Edwards-curve key. Public CAs do not issue these; useful to test what your software does with one.ed25519.pem (1.3 KB)Open in the decoder
Client certificate
client-auth
Client Authentication purpose and an email address, no host names.client-auth.pem (1.6 KB)Open in the decoder
Code signing certificate
code-signing
Code Signing purpose, RSA 3072.code-signing.pem (1.8 KB)Open in the decoder
Root CA
root-ca
CA:TRUE, path length 1, RSA 4096. The decoder shows it as a CA certificate pasted on its own.root-ca.pem (1.9 KB)
root-ca.cer (1.3 KB)
Open in the decoder
Issuing CA
intermediate-ca
CA:TRUE, path length 0, RSA 3072.intermediate-ca.pem (1.7 KB)Open in the decoder

Certificates with problems

Each one is broken in exactly one way. Use them to test that a system rejects or warns: an expiry alert, a strict client, a validation step in a pipeline.

SampleWhat the decoder showsDownloadOpen
Expired
expired-leaf
Expired on 1 March 2025. The decoder reports it as an error.expired-leaf.pem (1.6 KB)Open in the decoder
Not yet valid
not-yet-valid
Starts on 1 January 2035.not-yet-valid.pem (1.6 KB)Open in the decoder
No SAN
no-san
Common name only: browsers match no host name at all.no-san.pem (1.6 KB)Open in the decoder
SHA-1 signature
sha1-signed
Signed with SHA-1, rejected by browsers.sha1-signed.pem (1.6 KB)Open in the decoder
RSA 1024 key
rsa-1024
A key too small for any public CA.rsa-1024.pem (1.4 KB)Open in the decoder
Self-signed server certificate
self-signed-server
As appliances ship them: trusted by nobody until someone installs it.self-signed-server.pem (1.2 KB)Open in the decoder
Chain in the wrong order
chain-wrong-order
Intermediate first, then the leaf. The decoder shows where the order breaks.chain-wrong-order.pem (3.4 KB)Open in the decoder
Missing intermediate
chain-missing-intermediate
What a misconfigured server sends: the leaf without its issuing CA.chain-missing-intermediate.pem (1.6 KB)Open in the decoder

Certificate signing requests

Requests as they go to a CA. Use them to practise the check before submission, or to test a CSR intake form.

SampleWhat the decoder showsDownloadOpen
CSR with SAN
csr-with-san
RSA 2048, SHA-256, two DNS names requested.csr-with-san.csr (1.1 KB)Open in the decoder
CSR without SAN
csr-no-san
Common name only: the decoder notes that no SAN is requested.csr-no-san.csr (0.9 KB)Open in the decoder
EC CSR
csr-ec-p256
Elliptic curve request with one SAN name.csr-ec-p256.csr (0.5 KB)Open in the decoder

About the test PKI

  • Root: zaur.it Test Root CA – NOT TRUSTED (RSA 4096). Issuing CA: zaur.it Test Issuing CA – NOT TRUSTED (RSA 3072). Every sample except the self-signed one chains to them.
  • Names: only example.com, example.net, example.org and .test names, and the documentation addresses 192.0.2.0/24 and 2001:db8::/32. None of them belongs to anyone.
  • Dates: the valid samples run from 2026 to 2036, so they stay valid for years. Because that is longer than a public CA may issue, the decoder shows a lifetime line on them as information; for a private CA it is not an error. The expired and not-yet-valid samples have fixed dates.
  • Keys: generated for the build and deleted at the end. No private key is in any file or in the ZIP, so nobody, including us, can sign anything with this PKI.
  • Built with: OpenSSL 3.5.7, 30 September 2026. A rebuild makes new keys, so the checksums below would change.

Verify the downloads

Every file except the ZIP’s own checksum file is listed in SHA256SUMS in the sha256sum format. After downloading, check them on Linux or macOS with coreutils:

sha256sum -c --ignore-missing SHA256SUMS

On Windows, the same check in PowerShell. Get-FileHash uses SHA-256 by default and prints uppercase hex; -eq compares without case, so the lowercase values in the file still match:

Get-Content .\SHA256SUMS | ForEach-Object {
    $hash, $file = $_ -split '\s+\*?', 2
    if (Test-Path $file) {
        '{0}  {1}' -f $(if ((Get-FileHash $file).Hash -eq $hash) { 'OK' } else { 'FAILED' }), $file
    }
}

Why the comparison operator matters is covered in Get-FileHash: the comparison that reports a good file as bad. For a single value, the Hash generator works too.

What to test with them

  • Expiry monitoring: point the check at expired-leaf.pem and confirm it alerts; point it at server-leaf.pem and confirm it stays quiet.
  • Import on Windows: server-leaf.cer and server-fullchain.p7b are the formats the Certificate Import Wizard and certutil -addstore expect.
  • Chain handling: feed chain-wrong-order.pem and chain-missing-intermediate.pem to a load balancer or a Java trust store test and see which of them it accepts.
  • Strict clients: sha1-signed.pem, rsa-1024.pem and no-san.pem should all be rejected by a modern TLS client; if one is accepted, you have found a problem.
  • CSR intake: a form or a script that accepts CSRs should flag csr-no-san.csr.
  • Parsers and pipelines: stable URLs and checksums make the set usable as fixtures in automated tests.

FAQ

Frequently asked questions

Only in a lab or a throwaway VM, and remove it afterwards. A root in a trust store makes that machine trust everything the root signs. Nobody can sign with this one, because its private key no longer exists, but a test root has no place on a production machine all the same.

All files and SHA-256 checksums

FileSizeSHA-256
chain-missing-intermediate.pem1655 bytes925597b43763d2a9838d1bd709f0c4b0f5ea853ffe0a0f7b434da4187d4d40f9
chain-wrong-order.pem3493 bytes1f4a0b642281aa78b872ccb222fe6942acbcd3b7cea31b2cdddfa3e1357d7af9
client-auth.pem1679 bytes2c364bb469d3438e6d52bbfb97ac1d33543c249a9adc86cd13eda175719b9991
code-signing.pem1854 bytesd51dfcbfd00cad60ebe6e0e0e80bfa6524913c6a4e41c92eef5fa3f2c4d263b8
csr-ec-p256.csr481 bytes30cd123dcb850c389d0c7edffed9290d63d1a3002c10883284c9294a37bbdd07
csr-no-san.csr936 bytes35f49a1c937468aaf31c710a600f180c3e750e7768bd30908f655d0abbafee0a
csr-with-san.csr1155 bytesf0d574de9423c90743fc7f24a826a91365f04bf21b1405f2f9cd61227371d647
ec-p256.pem1383 bytes507ac0a4a92142c8fc194305d456abf10120c70f1bc83c68c4fb82a96eb8f528
ec-p384.pem1419 bytesd1cb5b0d19437ce1f15901c28ed684fefdfe4db45a0cd7ae856c6941295f7f73
ed25519.pem1322 bytesc14d6a7bf259741d35d3f823916c86ae7fbe9cd6a5a581a9f5664efb512c7b38
expired-leaf.pem1663 bytes52ded56f1acb88cfbae7ee26007423c757ed6b9eca84d04daa7eab3e76ef1c5e
intermediate-ca.pem1777 bytes439d6e520c557ca64a2b74973509fa8539457bbfcaf6896f20f8ed31b2b901db
multi-san.pem1777 bytes7022e7b77a9136c987146a2955dac4b27555f316643f58bbc53930119a35fb74
no-san.pem1614 bytes2d675bfbef06a1d0d4a2c8af47c1dcc343312d99b918affc3e562f63e1cb7c31
not-yet-valid.pem1659 bytes605261c7acde6e761f055259fecc43b479169d94f63f1af743e2f6070379591e
root-ca.cer1364 bytesf2406cd0f364d6f4c3e10fb866bd91263a012356e1d5b41bee8e9f1fb7d9f0a1
root-ca.pem1903 bytes0581a434da95c52ba98b883699a35bc70a948af883dc4eb8be4c324b46a494d6
rsa-1024.pem1484 bytese84efd289e54aae183e35161a75997eff95e3198c0dfde66538f4310e8017673
self-signed-server.pem1224 bytes80d3cedc6a73cceb6aa83d3751f909674c5c4e306cca29b00123b5040a80691b
server-fullchain.p7b2546 bytesac93940f3828e4d6aa75213ba531741bd4f301d98998377062ff1ec481b68ff1
server-fullchain.pem3493 bytes9de9b649240fe976c687cc752f6a06c00f8004951ed3ba86f2e773044c5ae03f
server-leaf.cer1227 bytesfd06d287d02a22d8cbb73f1a47120928e308f07c0ed4f4974ff0d67535198821
server-leaf.pem1716 bytesdc322a4b0a3766dc4535f5b5a3a0fe9ad3ab576289f3faed02dedc61eb25ba6b
sha1-signed.pem1655 bytes74586099470b00c916ea3f3f4622ae731a2680f09a508ef296acb5cafd8ef3b0
SHA256SUMS2161 bytes12655702150146567cbd9ac361db9b9820069f5b682b901b07436f684166b613
wildcard.pem1696 bytesd0a3577880a8bd2d8b5a3ace2b73a122dea1c9d7721dfba3aaccef3985bb57dd
zaur-it-sample-certificates.zip37231 bytes16c2b97a0344976b1cdaf3e9dc36a2796ecf13786b95092760f198fc052d6495

Related