Docker Certificates

Protecting the Docker daemon socket with OpenSSL. Make sure you replace $HOST in the following examples with the DNS name of the target Docker host.

Credit: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl

Generate Private and Public Keys for a CA (Certificate Authority)

Create a directory for certificate files:

mkdir /home/ubuntu/certs
cd /home/ubuntu/certs

Generate a private key:

openssl genrsa -aes256 -out ca-key.pem 4096

Generate a certificate request using the pass phrase for ca-key.pem:

openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem

Fill out the fields.

Make sure you set Common Name to the DNS name of the Docker host: $HOST

Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:CA
Locality Name (eg, city) []:Cupertino
Organization Name (eg, company) [Internet Widgits Pty Ltd]:MyCompany
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:$HOST
Email Address []:

Create a Server Key and Certificate Signing Request (CSR)

openssl genrsa -out server-key.pem 4096
openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr

Sign the Public Key with our CA

TLS connections need to be specified when creating the certificate, as they can be made via the IP address as well as the DNS name. For example, to allow connections using 10.10.10.20 and 127.0.0.1:

echo subjectAltName = IP:10.10.10.20,IP:127.0.0.1 > extfile.cnf
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \
      -CAcreateserial -out server-cert.pem -extfile extfile.cnf

Create a Client Key and Certificate Signing Request for Client Authentication

openssl genrsa -out key.pem 4096
openssl req -subj '/CN=client' -new -key key.pem -out client.csr

To make the key suitable for client authentication, create an extensions config file:

echo extendedKeyUsage = clientAuth > extfile.cnf

Sign the public key:

openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \
      -CAcreateserial -out cert.pem -extfile extfile.cnf

After generating cert.pem and server-cert.pem, you can safely remove the two certificate signing requests:

rm -v client.csr server.csr

Set Permissions to Private Keys

With a default umask of 022, your secret keys will be world-readable and writable for you and your group.

In order to protect your keys from accidental damage, you will want to remove their write permissions. To make them only readable by you, change file modes as follows:

chmod -v 0400 ca-key.pem key.pem server-key.pem

Certificates can be world-readable, but you might want to remove write access to prevent accidental damage:

chmod -v 0444 ca.pem server-cert.pem cert.pem

Now you can make the Docker daemon only accept connections from clients providing a certificate trusted by our CA.