b2KIT

SSL/TLS Config Generator

Generate secure SSL/TLS configuration for Apache, Nginx, and HAProxy with modern cipher suite recommendations.

Tested tool guide Tested browser tools Checked August 16, 2026

What SSL/TLS Config Generator does, with a checked example

Server software ships with TLS defaults tuned for compatibility, not security: old protocols stay enabled and cipher lists are full of suites a modern client will never negotiate. This tool turns a few choices - the server platform and a minimum TLS version among them - into a ready-to-paste block of directives: protocol settings plus a cipher list restricted to forward-secret, AEAD-only suites. The thing people most often get wrong is scope. The output is a fragment to merge into an existing server or virtual-host configuration. It does not include certificate paths, listen directives, or any other settings, and it replaces any TLS directives you already set.

Worked example

A concrete input and expected output from the current implementation.

Input

Server: Nginx. Minimum TLS version: 1.2

Expected output

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA256;

A TLS 1.2 floor removes SSLv3 and TLS 1.0/1.1, and the list admits only suites that are both forward-secret and AEAD - ECDHE or DHE exchange with AES-GCM or CHACHA20-POLY1305 - ordered with ECDHE first. This is the Mozilla intermediate cipher list, the de facto baseline for modern TLS configuration, which generators of this kind emit.

How the result is produced

1

Platform-specific syntax

The same policy is rendered in each platform's own directive language: ssl_protocols and ssl_ciphers inside an Nginx server block, SSLProtocol and SSLCipherSuite under an Apache mod_ssl VirtualHost, or ssl-default-bind-options and ssl-default-bind-ciphersuites in HAProxy's global section. The cipher names themselves stay identical across all three because Nginx, Apache, and HAProxy all accept OpenSSL cipher names.

2

Cipher list construction

The cipher list is the subset of OpenSSL's cipher space that combines forward-secret key exchange (ECDHE or DHE) with an AEAD construction (AES-GCM or CHACHA20-POLY1305), with ECDHE ordered ahead of DHE. Choosing a higher minimum TLS version tightens the result further; at TLS 1.3 it collapses to the few suites the protocol itself defines, because TLS 1.3 fixed its suite list instead of letting servers enumerate one.

Good uses

  • Standing up a new site or service and wanting a defensible TLS baseline without hand-writing a cipher list from memory.
  • Fixing a compliance finding: a scanner flagged SSLv3 or TLS 1.0/1.1 on a vhost, and the protocol and cipher directives this tool emits are the fix.
  • Rolling one consistent TLS policy across many frontends or backends, so every server block ends up with the same directives instead of drifting apart.

Limits and checks

  • The output is a fragment, not a server config. It leaves out ssl_certificate paths, listen directives, and proxy settings, so pasting it as a whole config file yields a server that refuses to start or serves nothing.
  • Cipher names assume a recent OpenSSL. The CHACHA20-POLY1305 suite names require OpenSSL 1.1.0 or newer and the TLS 1.3 suite names require 1.1.1 or newer; on older builds the server rejects unknown names at startup or reload. Apache and HAProxy packages are sometimes linked against an older OpenSSL than the system one.
  • The strictest profile has a compatibility cost. A TLS 1.3-only policy drops every client that predates TLS 1.3 support, including Android 9 and earlier and Java 8 without the 8u261 update, so 'secure' settings can produce real connection failures rather than warnings.

Common questions

Why does TLS 1.3 list only three cipher suites, and do I need all of them?

TLS 1.3 fixed its cipher suites in the protocol itself (RFC 8446): TLS_AES_128_GCM_SHA256, TLS_AES_256_GCM_SHA384, and TLS_CHACHA20_POLY1305_SHA256. There is no long ordered list to tune because negotiation happens in one round and the server picks from what the client offers. Listing all three is the standard recommendation; CHACHA20-POLY1305 matters mostly on devices without AES hardware acceleration.

If I paste this into my existing server block, will it break anything?

Usually not, with two cautions. The block replaces, rather than merges: Nginx refuses to start on duplicate ssl_protocols or ssl_ciphers lines, and Apache silently uses only the last occurrence of a repeated directive, so remove any existing TLS lines first. It also never includes your certificate paths, so keep your ssl_certificate and ssl_certificate_key lines. After pasting, reload and verify with an external TLS test rather than assuming.

References and verification

The example and behavioral notes were checked against the browser implementation. Standards and primary references below define the relevant format, formula, or platform behavior.

Related Tools