Secure Consul communication.

Generate encryption key

Generate encryption key that will be used to encrypt gossip protocol.

$ consul keygen
wZHOCKakzCeAesu7HK07tqmc3PwJojN/jNfbXEDqplI=

Generate certificates

Create ssl directory.

$ sudo install --directory --group consul --owner consul --mode 700 /opt/consul/ssl

Create CA.

$ consul tls ca create
==> Saved consul-agent-ca.pem
==> Saved consul-agent-ca-key.pem
$ cat consul-agent-ca.pem 
-----BEGIN CERTIFICATE-----
MIIC7DCCApOgAwIBAgIQb+uO2QIbIaeohiZetp1DhTAKBggqhkjOPQQDAjCBuTEL
MAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1TYW4gRnJhbmNpc2Nv
MRowGAYDVQQJExExMDEgU2Vjb25kIFN0cmVldDEOMAwGA1UEERMFOTQxMDUxFzAV
BgNVBAoTDkhhc2hpQ29ycCBJbmMuMUAwPgYDVQQDEzdDb25zdWwgQWdlbnQgQ0Eg
MTQ4NzY3Mzk0NTg5MjA4MTAwNDY1MjA0NjI0NDAzNjQyMjcwNTk3MB4XDTIyMDcx
NDIwNTY0N1oXDTI3MDcxMzIwNTY0N1owgbkxCzAJBgNVBAYTAlVTMQswCQYDVQQI
EwJDQTEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzEaMBgGA1UECRMRMTAxIFNlY29u
ZCBTdHJlZXQxDjAMBgNVBBETBTk0MTA1MRcwFQYDVQQKEw5IYXNoaUNvcnAgSW5j
LjFAMD4GA1UEAxM3Q29uc3VsIEFnZW50IENBIDE0ODc2NzM5NDU4OTIwODEwMDQ2
NTIwNDYyNDQwMzY0MjI3MDU5NzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABKJe
6FzEXbOGS4HoNOlEj8WhytPdkILGjRNPk7B5jsB/dpO9JgL2RFI5SJJBwXHug2kI
gEzh5NEjcVmtsJhAEy6jezB5MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD
AQH/MCkGA1UdDgQiBCD+9xE/gAdmCws+5CUq5595mEeBLFIsS2WFr5UniPGIUjAr
BgNVHSMEJDAigCD+9xE/gAdmCws+5CUq5595mEeBLFIsS2WFr5UniPGIUjAKBggq
hkjOPQQDAgNHADBEAiB6zHbLgTWX5elXaua65zOHclb5FUTqDsPtVjLd1F7+lgIg
WhGwFk9pnBhreN+joMdVf3aWw3zSlrbm0qDKinDryHs=
-----END CERTIFICATE-----
$ cat consul-agent-ca-key.pem
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIGQgp/j+mtKaly1sSHv4MsKwWbJ8wa5npuhy4RFmszTIoAoGCCqGSM49
AwEHoUQDQgAEol7oXMRds4ZLgeg06USPxaHK092QgsaNE0+TsHmOwH92k70mAvZE
UjlIkkHBce6DaQiATOHk0SNxWa2wmEATLg==
-----END EC PRIVATE KEY-----

Create server certificate.

$ consul tls cert create -server -dc dc-lab-1
==> WARNING: Server Certificates grants authority to become a
    server and access all state in the cluster including root keys
    and all ACL tokens. Do not distribute them to production hosts
    that are not server nodes. Store them as securely as CA keys.
==> Using consul-agent-ca.pem and consul-agent-ca-key.pem
==> Saved dc-lab-1-server-consul-0.pem
==> Saved dc-lab-1-server-consul-0-key.pem
$ cat dc-lab-1-server-consul-0.pem 
-----BEGIN CERTIFICATE-----
MIICpzCCAkygAwIBAgIQBDwlHs1ohymMKvFSs1ORpjAKBggqhkjOPQQDAjCBuTEL
MAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1TYW4gRnJhbmNpc2Nv
MRowGAYDVQQJExExMDEgU2Vjb25kIFN0cmVldDEOMAwGA1UEERMFOTQxMDUxFzAV
BgNVBAoTDkhhc2hpQ29ycCBJbmMuMUAwPgYDVQQDEzdDb25zdWwgQWdlbnQgQ0Eg
MTQ4NzY3Mzk0NTg5MjA4MTAwNDY1MjA0NjI0NDAzNjQyMjcwNTk3MB4XDTIyMDcx
NDIxMDIxN1oXDTIzMDcxNDIxMDIxN1owITEfMB0GA1UEAxMWc2VydmVyLmRjLWxh
Yi0xLmNvbnN1bDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOlJiHyw7RfMD4Ov
hFZxKlpdQdCawAyL41BBiukjKqi7bG1t1bYUX4ltBlA0j2XpBlKps6wg9gPFi0jg
ywfnQkGjgcwwgckwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMB
BggrBgEFBQcDAjAMBgNVHRMBAf8EAjAAMCkGA1UdDgQiBCAhVpOfcmtkv726+NmJ
yY9LUSczBdlNR/TxDxoXeJOTSzArBgNVHSMEJDAigCD+9xE/gAdmCws+5CUq5595
mEeBLFIsS2WFr5UniPGIUjAyBgNVHREEKzApghZzZXJ2ZXIuZGMtbGFiLTEuY29u
c3Vsgglsb2NhbGhvc3SHBH8AAAEwCgYIKoZIzj0EAwIDSQAwRgIhAOJ4TK1ljy/x
4FIe7TnpgHwxQ58C/NWdwXANhmfyFYwYAiEA+8U57t2UsN7RwYwKIDj4MaNgedcN
CCXW9/oP9wSAW0Y=
-----END CERTIFICATE-----
$ cat dc-lab-1-server-consul-0-key.pem 
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIO8Cxt63TIL2SFUpVuq+eQkedX2uXkPorJrEtBm9Z/YJoAoGCCqGSM49
AwEHoUQDQgAE6UmIfLDtF8wPg6+EVnEqWl1B0JrADIvjUEGK6SMqqLtsbW3VthRf
iW0GUDSPZekGUqmzrCD2A8WLSODLB+dCQQ==
-----END EC PRIVATE KEY-----

Create client certificate.

$ consul tls cert create -client -dc dc-lab-1
==> Using consul-agent-ca.pem and consul-agent-ca-key.pem
==> Saved dc-lab-1-client-consul-0.pem
==> Saved dc-lab-1-client-consul-0-key.pem
$ cat dc-lab-1-client-consul-0.pem 
-----BEGIN CERTIFICATE-----
MIICpjCCAkygAwIBAgIQK+uPhvt9xtpiPopnwx6yWjAKBggqhkjOPQQDAjCBuTEL
MAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1TYW4gRnJhbmNpc2Nv
MRowGAYDVQQJExExMDEgU2Vjb25kIFN0cmVldDEOMAwGA1UEERMFOTQxMDUxFzAV
BgNVBAoTDkhhc2hpQ29ycCBJbmMuMUAwPgYDVQQDEzdDb25zdWwgQWdlbnQgQ0Eg
MTQ4NzY3Mzk0NTg5MjA4MTAwNDY1MjA0NjI0NDAzNjQyMjcwNTk3MB4XDTIyMDcx
NDIxMDIzOVoXDTIzMDcxNDIxMDIzOVowITEfMB0GA1UEAxMWY2xpZW50LmRjLWxh
Yi0xLmNvbnN1bDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABMjDA/gRuyqJTTkJ
fg09JorVQYxRWUCfK3nrv5eeo0HmY/QjsFDwQhD38XGyJ1mqsaDOOjfZRe1HZMIH
JZ/g7O6jgcwwgckwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMC
BggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMCkGA1UdDgQiBCDOSYswbdIIcconfobw
SyT8dpIaTfi6fQcG3vSe3XrYfDArBgNVHSMEJDAigCD+9xE/gAdmCws+5CUq5595
mEeBLFIsS2WFr5UniPGIUjAyBgNVHREEKzApghZjbGllbnQuZGMtbGFiLTEuY29u
c3Vsgglsb2NhbGhvc3SHBH8AAAEwCgYIKoZIzj0EAwIDSAAwRQIhALGk2J5al51i
gcWll0QqESuai19Tq2U24ZxQmjOMA5TfAiAeSaiqX37uSrGbZaPKUVrGvX7P74Hx
37XXD/9WqUU0qg==
-----END CERTIFICATE-----
$ cat dc-lab-1-client-consul-0-key.pem 
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEII3kkrtfjELw5sdtaQSuxR29xCkKdH43XFRbpCeKZZVwoAoGCCqGSM49
AwEHoUQDQgAEyMMD+BG7KolNOQl+DT0mitVBjFFZQJ8reeu/l56jQeZj9COwUPBC
EPfxcbInWaqxoM46N9lF7Udkwgcln+Ds7g==
-----END EC PRIVATE KEY-----

Create cli certificate.

$ consul tls cert create -cli -dc dc-lab-1
==> Using consul-agent-ca.pem and consul-agent-ca-key.pem
==> Saved dc-lab-1-cli-consul-0.pem
==> Saved dc-lab-1-cli-consul-0-key.pem
$ cat dc-lab-1-cli-consul-0.pem 
-----BEGIN CERTIFICATE-----
MIICezCCAiKgAwIBAgIRAJfUJJ3leA+cbGF4cyTJ7mkwCgYIKoZIzj0EAwIwgbkx
CzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UEBxMNU2FuIEZyYW5jaXNj
bzEaMBgGA1UECRMRMTAxIFNlY29uZCBTdHJlZXQxDjAMBgNVBBETBTk0MTA1MRcw
FQYDVQQKEw5IYXNoaUNvcnAgSW5jLjFAMD4GA1UEAxM3Q29uc3VsIEFnZW50IENB
IDE0ODc2NzM5NDU4OTIwODEwMDQ2NTIwNDYyNDQwMzY0MjI3MDU5NzAeFw0yMjA3
MTQyMTAyNTNaFw0yMzA3MTQyMTAyNTNaMB4xHDAaBgNVBAMTE2NsaS5kYy1sYWIt
MS5jb25zdWwwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASx9wfCxaxBCO/K6a4Y
jUQW7pl/glh9Q+JjXSlwTjQpfFCJtZoAjz0nDf3/t4riTUwtpGZ4rbM7t4/wHQL+
Z3X9o4GkMIGhMA4GA1UdDwEB/wQEAwIFoDAMBgNVHRMBAf8EAjAAMCkGA1UdDgQi
BCD+YTdU5WCcAz3CweglR+Xdr7r5je3TAsTHlhqLnNE7ljArBgNVHSMEJDAigCD+
9xE/gAdmCws+5CUq5595mEeBLFIsS2WFr5UniPGIUjApBgNVHREEIjAgghNjbGku
ZGMtbGFiLTEuY29uc3Vsgglsb2NhbGhvc3QwCgYIKoZIzj0EAwIDRwAwRAIgU0cP
GySvDg+h8G98m3rou4XX00iiF1cRGkth9CCiGtMCIFfOA/sy4dzep54hvPCQpuFK
sBN5KPQODsE0fb4ibCW6
-----END CERTIFICATE-----
$ cat dc-lab-1-cli-consul-0-key.pem 
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIJ3f1fNQhs9PsjWderqNmYDch4BuMGLPCSuhB+YX+LfroAoGCCqGSM49
AwEHoUQDQgAEsfcHwsWsQQjvyumuGI1EFu6Zf4JYfUPiY10pcE40KXxQibWaAI89
Jw39/7eK4k1MLaRmeK2zO7eP8B0C/md1/Q==
-----END EC PRIVATE KEY-----

Enable encryption on server

Store CA and server certificate.

$ sudo -u consul tee /opt/consul/ssl/consul-agent-ca.pem << EOF
-----BEGIN CERTIFICATE-----
MIIC7DCCApOgAwIBAgIQb+uO2QIbIaeohiZetp1DhTAKBggqhkjOPQQDAjCBuTEL
MAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1TYW4gRnJhbmNpc2Nv
MRowGAYDVQQJExExMDEgU2Vjb25kIFN0cmVldDEOMAwGA1UEERMFOTQxMDUxFzAV
BgNVBAoTDkhhc2hpQ29ycCBJbmMuMUAwPgYDVQQDEzdDb25zdWwgQWdlbnQgQ0Eg
MTQ4NzY3Mzk0NTg5MjA4MTAwNDY1MjA0NjI0NDAzNjQyMjcwNTk3MB4XDTIyMDcx
NDIwNTY0N1oXDTI3MDcxMzIwNTY0N1owgbkxCzAJBgNVBAYTAlVTMQswCQYDVQQI
EwJDQTEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzEaMBgGA1UECRMRMTAxIFNlY29u
ZCBTdHJlZXQxDjAMBgNVBBETBTk0MTA1MRcwFQYDVQQKEw5IYXNoaUNvcnAgSW5j
LjFAMD4GA1UEAxM3Q29uc3VsIEFnZW50IENBIDE0ODc2NzM5NDU4OTIwODEwMDQ2
NTIwNDYyNDQwMzY0MjI3MDU5NzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABKJe
6FzEXbOGS4HoNOlEj8WhytPdkILGjRNPk7B5jsB/dpO9JgL2RFI5SJJBwXHug2kI
gEzh5NEjcVmtsJhAEy6jezB5MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD
AQH/MCkGA1UdDgQiBCD+9xE/gAdmCws+5CUq5595mEeBLFIsS2WFr5UniPGIUjAr
BgNVHSMEJDAigCD+9xE/gAdmCws+5CUq5595mEeBLFIsS2WFr5UniPGIUjAKBggq
hkjOPQQDAgNHADBEAiB6zHbLgTWX5elXaua65zOHclb5FUTqDsPtVjLd1F7+lgIg
WhGwFk9pnBhreN+joMdVf3aWw3zSlrbm0qDKinDryHs=
-----END CERTIFICATE-----
EOF
$ sudo -u consul tee /opt/consul/ssl/dc-lab-1-server-consul-0.pem << EOF
-----BEGIN CERTIFICATE-----
MIICpzCCAkygAwIBAgIQBDwlHs1ohymMKvFSs1ORpjAKBggqhkjOPQQDAjCBuTEL
MAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1TYW4gRnJhbmNpc2Nv
MRowGAYDVQQJExExMDEgU2Vjb25kIFN0cmVldDEOMAwGA1UEERMFOTQxMDUxFzAV
BgNVBAoTDkhhc2hpQ29ycCBJbmMuMUAwPgYDVQQDEzdDb25zdWwgQWdlbnQgQ0Eg
MTQ4NzY3Mzk0NTg5MjA4MTAwNDY1MjA0NjI0NDAzNjQyMjcwNTk3MB4XDTIyMDcx
NDIxMDIxN1oXDTIzMDcxNDIxMDIxN1owITEfMB0GA1UEAxMWc2VydmVyLmRjLWxh
Yi0xLmNvbnN1bDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOlJiHyw7RfMD4Ov
hFZxKlpdQdCawAyL41BBiukjKqi7bG1t1bYUX4ltBlA0j2XpBlKps6wg9gPFi0jg
ywfnQkGjgcwwgckwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMB
BggrBgEFBQcDAjAMBgNVHRMBAf8EAjAAMCkGA1UdDgQiBCAhVpOfcmtkv726+NmJ
yY9LUSczBdlNR/TxDxoXeJOTSzArBgNVHSMEJDAigCD+9xE/gAdmCws+5CUq5595
mEeBLFIsS2WFr5UniPGIUjAyBgNVHREEKzApghZzZXJ2ZXIuZGMtbGFiLTEuY29u
c3Vsgglsb2NhbGhvc3SHBH8AAAEwCgYIKoZIzj0EAwIDSQAwRgIhAOJ4TK1ljy/x
4FIe7TnpgHwxQ58C/NWdwXANhmfyFYwYAiEA+8U57t2UsN7RwYwKIDj4MaNgedcN
CCXW9/oP9wSAW0Y=
-----END CERTIFICATE-----
EOF
$ sudo -u consul tee /opt/consul/ssl/dc-lab-1-server-consul-0-key.pem << EOF
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIO8Cxt63TIL2SFUpVuq+eQkedX2uXkPorJrEtBm9Z/YJoAoGCCqGSM49
AwEHoUQDQgAE6UmIfLDtF8wPg6+EVnEqWl1B0JrADIvjUEGK6SMqqLtsbW3VthRf
iW0GUDSPZekGUqmzrCD2A8WLSODLB+dCQQ==
-----END EC PRIVATE KEY-----
EOF

Try to not store certificates in /etc/consul.d as it will create unnecessary noise.

[...]
skipping file /etc/consul.d/consul-agent-ca.pem, extension must be .hcl or .json, or config format must be set
skipping file /etc/consul.d/consul.env, extension must be .hcl or .json, or config format must be set
skipping file /etc/consul.d/dc-lab-1-server-consul-0-key.pem, extension must be .hcl or .json, or config format must be set
skipping file /etc/consul.d/dc-lab-1-server-consul-0.pem, extension must be .hcl or .json, or config format must be set
[...]

Update server configuration to include encryption.

$ sudo -u consul tee /etc/consul.d/encryption.hcl << EOF
# encrypt gossip protocol
encrypt = "AcHUV+z4kLDJiQeVqLAh2sG25SH4K4WYU6oIru29lSM="

# tls encryption
tls {
  defaults{
    verify_incoming = true
    verify_outgoing = true
    ca_file = "/opt/consul/ssl/consul-agent-ca.pem"
    cert_file = "/opt/consul/ssl/dc-lab-1-server-consul-0.pem"
    key_file = "/opt/consul/ssl/dc-lab-1-server-consul-0-key.pem"
  }
}
EOF

Validate configuration.

$ sudo -u consul consul validate /etc/consul.d
skipping file /etc/consul.d/consul.env, extension must be .hcl or .json, or config format must be set
bootstrap = true: do not enable unless necessary
Configuration is valid!

Restart service.

$ sudo systemctl restart consul

You can later use consul reload command, but you cannot enable or disable TLS with reloading.

Enable encryption on agent

Store CA and client certificate.

$ sudo -u consul tee /opt/consul/ssl/consul-agent-ca.pem << EOF
-----BEGIN CERTIFICATE-----
MIIC7DCCApOgAwIBAgIQb+uO2QIbIaeohiZetp1DhTAKBggqhkjOPQQDAjCBuTEL
MAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1TYW4gRnJhbmNpc2Nv
MRowGAYDVQQJExExMDEgU2Vjb25kIFN0cmVldDEOMAwGA1UEERMFOTQxMDUxFzAV
BgNVBAoTDkhhc2hpQ29ycCBJbmMuMUAwPgYDVQQDEzdDb25zdWwgQWdlbnQgQ0Eg
MTQ4NzY3Mzk0NTg5MjA4MTAwNDY1MjA0NjI0NDAzNjQyMjcwNTk3MB4XDTIyMDcx
NDIwNTY0N1oXDTI3MDcxMzIwNTY0N1owgbkxCzAJBgNVBAYTAlVTMQswCQYDVQQI
EwJDQTEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzEaMBgGA1UECRMRMTAxIFNlY29u
ZCBTdHJlZXQxDjAMBgNVBBETBTk0MTA1MRcwFQYDVQQKEw5IYXNoaUNvcnAgSW5j
LjFAMD4GA1UEAxM3Q29uc3VsIEFnZW50IENBIDE0ODc2NzM5NDU4OTIwODEwMDQ2
NTIwNDYyNDQwMzY0MjI3MDU5NzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABKJe
6FzEXbOGS4HoNOlEj8WhytPdkILGjRNPk7B5jsB/dpO9JgL2RFI5SJJBwXHug2kI
gEzh5NEjcVmtsJhAEy6jezB5MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD
AQH/MCkGA1UdDgQiBCD+9xE/gAdmCws+5CUq5595mEeBLFIsS2WFr5UniPGIUjAr
BgNVHSMEJDAigCD+9xE/gAdmCws+5CUq5595mEeBLFIsS2WFr5UniPGIUjAKBggq
hkjOPQQDAgNHADBEAiB6zHbLgTWX5elXaua65zOHclb5FUTqDsPtVjLd1F7+lgIg
WhGwFk9pnBhreN+joMdVf3aWw3zSlrbm0qDKinDryHs=
-----END CERTIFICATE-----
EOF
$ sudo -u consul tee /opt/consul/ssl/dc-lab-1-client-consul-0.pem << EOF
-----BEGIN CERTIFICATE-----
MIICpjCCAkygAwIBAgIQK+uPhvt9xtpiPopnwx6yWjAKBggqhkjOPQQDAjCBuTEL
MAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1TYW4gRnJhbmNpc2Nv
MRowGAYDVQQJExExMDEgU2Vjb25kIFN0cmVldDEOMAwGA1UEERMFOTQxMDUxFzAV
BgNVBAoTDkhhc2hpQ29ycCBJbmMuMUAwPgYDVQQDEzdDb25zdWwgQWdlbnQgQ0Eg
MTQ4NzY3Mzk0NTg5MjA4MTAwNDY1MjA0NjI0NDAzNjQyMjcwNTk3MB4XDTIyMDcx
NDIxMDIzOVoXDTIzMDcxNDIxMDIzOVowITEfMB0GA1UEAxMWY2xpZW50LmRjLWxh
Yi0xLmNvbnN1bDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABMjDA/gRuyqJTTkJ
fg09JorVQYxRWUCfK3nrv5eeo0HmY/QjsFDwQhD38XGyJ1mqsaDOOjfZRe1HZMIH
JZ/g7O6jgcwwgckwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMC
BggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMCkGA1UdDgQiBCDOSYswbdIIcconfobw
SyT8dpIaTfi6fQcG3vSe3XrYfDArBgNVHSMEJDAigCD+9xE/gAdmCws+5CUq5595
mEeBLFIsS2WFr5UniPGIUjAyBgNVHREEKzApghZjbGllbnQuZGMtbGFiLTEuY29u
c3Vsgglsb2NhbGhvc3SHBH8AAAEwCgYIKoZIzj0EAwIDSAAwRQIhALGk2J5al51i
gcWll0QqESuai19Tq2U24ZxQmjOMA5TfAiAeSaiqX37uSrGbZaPKUVrGvX7P74Hx
37XXD/9WqUU0qg==
-----END CERTIFICATE-----
EOF
$ sudo -u consul tee /opt/consul/ssl/dc-lab-1-client-consul-0-key.pem << EOF
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEII3kkrtfjELw5sdtaQSuxR29xCkKdH43XFRbpCeKZZVwoAoGCCqGSM49
AwEHoUQDQgAEyMMD+BG7KolNOQl+DT0mitVBjFFZQJ8reeu/l56jQeZj9COwUPBC
EPfxcbInWaqxoM46N9lF7Udkwgcln+Ds7g==
-----END EC PRIVATE KEY-----
EOF

Update agent configuration.

$ sudo -u consul tee /etc/consul.d/encryption.hcl << EOF
# encrypt gossip protocol
encrypt = "AcHUV+z4kLDJiQeVqLAh2sG25SH4K4WYU6oIru29lSM="

# tls encryption
tls {
  defaults{
    verify_incoming = true
    verify_outgoing = true
    ca_file = "/opt/consul/ssl/consul-agent-ca.pem"
    cert_file = "/opt/consul/ssl/dc-lab-1-client-consul-0.pem"
    key_file = "/opt/consul/ssl/dc-lab-1-client-consul-0-key.pem"    
  }
}
EOF

Validate configuration.

$ sudo -u consul consul validate /etc/consul.d
skipping file /etc/consul.d/consul.env, extension must be .hcl or .json, or config format must be set
Configuration is valid!

Restart service.

$ sudo systemctl restart consul
Configuration reload triggered

List cluster members.

$ consul members
Node   Address              Status  Type    Build   Protocol  DC        Partition  Segment
jammy  172.16.151.111:8301  alive   server  1.12.3  2         dc-lab-1  default    <all>
mgmt   172.16.151.120:8301  alive   client  1.12.3  2         dc-lab-1  default    <default>

Use auto-encryption to simplify certificate provisioning

Use auto-encryption to automatically distribute client certificates to agents.

Update server configuration.

$ sudo -u consul tee /etc/consul.d/encryption.hcl << EOF
# encrypt gossip protocol
encrypt = "AcHUV+z4kLDJiQeVqLAh2sG25SH4K4WYU6oIru29lSM="

# tls encryption
tls {
  defaults{
    verify_incoming = true
    verify_outgoing = true
    ca_file = "/opt/consul/ssl/consul-agent-ca.pem"
    cert_file = "/opt/consul/ssl/dc-lab-1-server-consul-0.pem"
    key_file = "/opt/consul/ssl/dc-lab-1-server-consul-0-key.pem"
  }
}

# Auto-Encrypt-TLS
auto_encrypt {
  allow_tls = true
}
EOF

Update agent configuration.

$ sudo -u consul tee /etc/consul.d/encryption.hcl << EOF
# encrypt gossip protocol
encrypt = "AcHUV+z4kLDJiQeVqLAh2sG25SH4K4WYU6oIru29lSM="

# tls encryption
tls {
  defaults{
    verify_incoming = true
    verify_outgoing = true
    ca_file = "/opt/consul/ssl/consul-agent-ca.pem"
  }
}

# Auto-Encrypt-TLS
auto_encrypt = {
  tls = true
}
EOF

CLI over encrypted connection

You can enable HTTPS protocol inside consul configuration file.

[...]

ports {
  http = -1
  https = 8501
}

[...]

Use additional command-line parameters to specify ca, certificates and address.

$ consul members -ca-file /opt/consul/ssl/consul-agent-ca.pem \
                 -client-cert /opt/consul/ssl/dc-lab-1-cli-consul-0.pem \
                 -client-key /opt/consul/ssl/dc-lab-1-cli-consul-0-key.pem \
                 -http-addr https://127.0.0.1:8501
Node   Address              Status  Type    Build   Protocol  DC        Partition  Segment
jammy  172.16.151.111:8301  alive   server  1.12.3  2         dc-lab-1  default    <all>
mgmt   172.16.151.120:8301  alive   client  1.12.3  2         dc-lab-1  default    <default>
$ export CONSUL_HTTP_SSL=true
$ export CONSUL_HTTP_ADDR=https://127.0.0.1:8501
$ export CONSUL_CACERT=/opt/ssl/consul-agent-ca.pem 
$ export CONSUL_CLIENT_CERT=/opt/ssl/dc-lab-1-cli-consul-0.pem
$ export CONSUL_CLIENT_KEY=/opt/ssl/dc-lab-1-cli-consul-0-key.pem
$ consul rtt mgmt
Estimated mgmt <-> jammy rtt: 0.632 ms (using LAN coordinates)

Additional notes

Inspect to determine if encryption is enabled or not.

Jul 16 22:59:53 vault-1 consul[1788]: ==> Starting Consul agent...
Jul 16 22:59:53 vault-1 consul[1788]:            Version: '1.12.3'
Jul 16 22:59:53 vault-1 consul[1788]:            Node ID: '806c8cef-77b0-585e-9d6b-0d7e120e7f76'
Jul 16 22:59:53 vault-1 consul[1788]:          Node name: 'vault-1'
Jul 16 22:59:53 vault-1 consul[1788]:         Datacenter: 'dc-lab-1' (Segment: '')
Jul 16 22:59:53 vault-1 consul[1788]:             Server: false (Bootstrap: false)
Jul 16 22:59:53 vault-1 consul[1788]:        Client Addr: [127.0.0.1] (HTTP: 8500, HTTPS: -1, gRPC: -1, DNS: 8600)
Jul 16 22:59:53 vault-1 consul[1788]:       Cluster Addr: 172.16.148.3 (LAN: 8301, WAN: 8302)
Jul 16 22:59:53 vault-1 consul[1788]:            Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false, Auto-Encrypt-TLS: false
Jul 16 23:02:40 vault-1 consul[1910]: ==> Starting Consul agent...
Jul 16 23:02:40 vault-1 consul[1910]:            Version: '1.12.3'
Jul 16 23:02:40 vault-1 consul[1910]:            Node ID: '806c8cef-77b0-585e-9d6b-0d7e120e7f76'
Jul 16 23:02:40 vault-1 consul[1910]:          Node name: 'vault-1'
Jul 16 23:02:40 vault-1 consul[1910]:         Datacenter: 'dc-lab-1' (Segment: '')
Jul 16 23:02:40 vault-1 consul[1910]:             Server: false (Bootstrap: false)
Jul 16 23:02:40 vault-1 consul[1910]:        Client Addr: [127.0.0.1] (HTTP: 8500, HTTPS: -1, gRPC: -1, DNS: 8600)
Jul 16 23:02:40 vault-1 consul[1910]:       Cluster Addr: 172.16.148.3 (LAN: 8301, WAN: 8302)
Jul 16 23:02:40 vault-1 consul[1910]:            Encrypt: Gossip: true, TLS-Outgoing: true, TLS-Incoming: true, Auto-Encrypt-TLS: true