Standard File System Locations for SSL Certificates and Private Keys in UNIX/Linux Systems


2 views

While there's no single mandatory standard, several well-established conventions exist for storing SSL/TLS certificates and keys in UNIX/Linux systems:

/etc/ssl/certs/      # Public certificates
/etc/ssl/private/     # Private keys (usually restricted to root)
/etc/pki/tls/certs/   # Common on RHEL/CentOS
/etc/pki/tls/private/ # RHEL/CentOS private key location
/usr/local/ssl/certs/ # Alternative location

When implementing SSL/TLS on your server, consider these guidelines:

  • Keep private keys in /etc/ssl/private/ with 600 permissions
  • Use /etc/ssl/certs/ for public certificates
  • Maintain consistent naming conventions (e.g., domain.crt, domain.key)
  • Consider symbolic links for certificate chains

Here are configuration examples for popular web servers:

Apache HTTPD

SSLCertificateFile /etc/ssl/certs/example.com.crt
SSLCertificateKeyFile /etc/ssl/private/example.com.key
SSLCertificateChainFile /etc/ssl/certs/example.com.ca-bundle

Nginx

ssl_certificate /etc/ssl/certs/example.com.crt;
ssl_certificate_key /etc/ssl/private/example.com.key;
ssl_trusted_certificate /etc/ssl/certs/example.com.ca-bundle;

Here's a sample bash script for certificate deployment:

#!/bin/bash
# Deploy new SSL certificate
CERT_NAME="example.com"
CERT_DIR="/etc/ssl/certs"
PRIVATE_DIR="/etc/ssl/private"

# Backup existing certs
cp "$CERT_DIR/$CERT_NAME.crt" "$CERT_DIR/$CERT_NAME.crt.bak"
cp "$PRIVATE_DIR/$CERT_NAME.key" "$PRIVATE_DIR/$CERT_NAME.key.bak"

# Deploy new files
install -m 644 new_cert.crt "$CERT_DIR/$CERT_NAME.crt"
install -m 600 new_key.key "$PRIVATE_DIR/$CERT_NAME.key"

# Verify permissions
chown root:root "$PRIVATE_DIR/$CERT_NAME.key"
chmod 600 "$PRIVATE_DIR/$CERT_NAME.key"

Always remember these critical security practices:

  • Never store private keys in web-accessible directories
  • Use appropriate file permissions (400 or 600 for keys)
  • Consider using encrypted partitions for private keys
  • Regularly audit certificate locations and permissions

Different Linux distributions may have slightly different conventions:

  • Debian/Ubuntu: Primarily uses /etc/ssl/ structure
  • RHEL/CentOS: Favors /etc/pki/tls/ hierarchy
  • OpenSUSE: May use /usr/share/pki/trust/anchors/

On UNIX/Linux systems, there are several conventional locations where SSL certificates and private keys are typically stored:

/etc/ssl/certs/      # For public certificates
/etc/ssl/private/     # For private keys (restricted access)
/usr/local/ssl/certs/ # Alternative location
/etc/pki/tls/certs/   # Common on RedHat-based systems
/etc/apache2/ssl/     # Apache-specific location on Debian/Ubuntu

Proper file permissions are crucial for security:

# Certificate files (readable by all)
chmod 644 /etc/ssl/certs/example.crt

# Private keys (readable only by owner)
chmod 600 /etc/ssl/private/example.key

# Set appropriate ownership
chown root:root /etc/ssl/private/example.key

Here's how these paths are typically referenced in common services:

Apache Configuration

<VirtualHost *:443>
    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/server.crt
    SSLCertificateKeyFile /etc/ssl/private/server.key
    SSLCertificateChainFile /etc/ssl/certs/ca-bundle.crt
</VirtualHost>

Nginx Configuration

server {
    listen 443 ssl;
    ssl_certificate /etc/ssl/certs/nginx.crt;
    ssl_certificate_key /etc/ssl/private/nginx.key;
    ssl_trusted_certificate /etc/ssl/certs/ca-bundle.crt;
}

Different distributions may have slight variations:

  • Debian/Ubuntu: Typically uses /etc/ssl/certs/ and /etc/ssl/private/
  • RedHat/CentOS: Often uses /etc/pki/tls/certs/ and /etc/pki/tls/private/
  • FreeBSD: Commonly uses /usr/local/etc/ssl/certs/

For automated deployments, consider this bash script example:

#!/bin/bash
# Deploy new SSL certificate
CERT_DIR="/etc/ssl/certs"
KEY_DIR="/etc/ssl/private"

cp new_cert.crt "$CERT_DIR/server.crt"
cp new_key.key "$KEY_DIR/server.key"
chmod 644 "$CERT_DIR/server.crt"
chmod 600 "$KEY_DIR/server.key"
systemctl reload apache2

For intermediate certificates, the common practice is:

cat intermediate1.crt intermediate2.crt > /etc/ssl/certs/ca-bundle.crt