Marc Richter created ZOOKEEPER-4403:
---------------------------------------

             Summary: Quorum TLS certificate validation uses wrong name
                 Key: ZOOKEEPER-4403
                 URL: https://issues.apache.org/jira/browse/ZOOKEEPER-4403
             Project: ZooKeeper
          Issue Type: Bug
          Components: quorum, security
    Affects Versions: 3.5.9
            Reporter: Marc Richter


When using SSL certificates for public IPv6 DNS endpoints as received from some 
public Service like "Let's Encrypt" for Quorum Encryption, Zookeeper validates 
the SNAs of that certificate for the IP Address instead of the DNS name, as 
configured.

As a Result, these certificates can't be used, since no certificates for IPv6 
IPs issued.

This has been observed with Zookeeper Version 3.5.9, which is the one bundled 
in the most recent release of Kafka (2.8.1).

In the affected environment, there is a 3-node-Zookeeper-Cluster, which is 
configured as this in {{zookeeper.properties}} (mind the DNS name!):
{code}
server.1=zookeeper1.ourdomain.cloud:2888:3888
server.2=zookeeper2.ourdomain.cloud:2888:3888
server.3=zookeeper3.ourdomain.cloud:2888:3888
{code}
All these records do have a public IPv6 entry only.

The SSL certificates from Let's Encrypt are requested and added to the 
Quorum-Keystores like this:

# Using https://github.com/acmesh-official/acme.sh
# Requesting the cert from Let's Encrypt using:
   {code}./acme.sh --issue --dns dns_nsupdate -d 
zookeeper1.ourdomain.cloud{code}
   for each system.
# Merge fullchain- and certificate-file to a single PKCS12 file using:
   {code}openssl pkcs12 -export -in <certfile> -inkey <keyfile> -out 
<pkcs12_file> -name zookeeper1.ourdomain.cloud \
    -CAfile <fullchainfile> -password <JKS_password>{code}
# Adding the resulting PKCS12 file to the Quorum Keystore:
   {code}keytool -importkeystore -deststorepass <JKS_password> -destkeypass 
<JKS_password> -deststoretype pkcs12 \
    -srckeystore <pkcs12_file> -srcstoretype PKCS12 -srcstorepass 
<JKS_password> -destkeystore <quorum_jks> \
    -alias zookeeper1.ourdomain.cloud{code}

When any of the systems tries to initiate the quorum-connect, their logs state 
that the remote's Certificates could not be verified, since the SNA-List does 
not contain the IPv6 address.
For example: This is the log from {{zookeeper2.ourdomain.cloud}} when 
connecting {{zookeeper3.ourdomain.cloud}}:

{code}
[2021-10-13 15:13:49,960] INFO Received connection request from 
/2a01:--CUT--:750:47566 (org.apache.zookeeper.server.quorum.QuorumCnxManager)
[2021-10-13 15:13:50,094] ERROR Failed to verify host address: 2a01:--CUT--:750 
(org.apache.zookeeper.common.ZKTrustManager)
javax.net.ssl.SSLPeerUnverifiedException: Certificate for <2a01:--CUT--:750> 
doesn't match any of the subject alternative names: [zookeeper3.ourdomain.cloud]
{code}

I think the log lines cited clearly show:
# Zookeeper is picking up the correct certificate from the quorum Keystore, 
since it states that the request does not match  any SNA and lists 
{{zookeeper3.ourdomain.cloud}} only, which it can only know from the 
certificate itself.
# Zookeeper is validating the wrong thing here: Even though the config clearly 
states to use a DNS name, the  certificates SNAs alre validated against the 
IPv6 address that record belongs to instead of the DNS name configured ({{ERROR 
Failed to verify host address: 2a01:--CUT--:750}})



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to