Jira (PUP-9500) Puppet assumes client cert issuer is in the ca bundle downloaded from the server

3 views
Skip to first unread message

Josh Cooper (JIRA)

unread,
Feb 15, 2019, 12:50:04 AM2/15/19
to puppe...@googlegroups.com
Josh Cooper created an issue
 
Puppet / Improvement PUP-9500
Puppet assumes client cert issuer is in the ca bundle downloaded from the server
Issue Type: Improvement Improvement
Assignee: Unassigned
Created: 2019/02/14 9:49 PM
Priority: Normal Normal
Reporter: Josh Cooper

If you're using different intermediate CAs to issue client and server certificates, then the intermediate CA for agent certs may not be in the CA bundle that agents download from the server. In that situation, the agent won't be able to send a complete certificate chain in its Certificate message to the server. The SSL connection will fail if the server cannot lookup the intermediate cert locally, or worse, some connections may fail depending on which server terminates the SSL connection, eg load balancer, puppetserver, report server, file server.

The agent should always send a complete chain in its client Certificate message. We could provide an "extra" chain file from which the client can load additional certs to complete its chain. That would be similar to how apache's SSLCertificateChainFile completes the server's chain.

Alternatively, we could assume the client's intermediate CA certs are in the CA bundle downloaded from the server, and warn if any cert is missing. The downside of this approach is that the intermediate CA used to issue client certs would also be trusted for server certs.

/cc Maggie Dreyer, Justin Stoller, Jayant Sane

Add Comment Add Comment
 
This message was sent by Atlassian JIRA (v7.7.1#77002-sha1:e75ca93)
Atlassian logo

Maggie Dreyer (JIRA)

unread,
Feb 15, 2019, 11:25:04 AM2/15/19
to puppe...@googlegroups.com
Maggie Dreyer commented on Improvement PUP-9500
 
Re: Puppet assumes client cert issuer is in the ca bundle downloaded from the server

So I would argue that right now, the use case you describe is very much unsupported on multiple levels. Do you have an example of someone actually wanting to do this?

Jayant Sane (JIRA)

unread,
Feb 15, 2019, 12:10:07 PM2/15/19
to puppe...@googlegroups.com
Jayant Sane commented on Improvement PUP-9500

yeah I was going to ask the same - do we even support such configurations of agents and servers having different certificate chains. How would that work in terms of certification flows?

Josh Cooper (JIRA)

unread,
Feb 15, 2019, 1:16:03 PM2/15/19
to puppe...@googlegroups.com
Josh Cooper commented on Improvement PUP-9500

Good questions. It is not a supported configuration according to https://puppet.com/docs/puppet/6.2/config_ssl_external_ca.html#supported-external-ca-configurations.

But we added the ssl_client_ca_auth and ssl_server_ca_auth settings in Puppet 3, largely to work around the "locacacert can only contain a single cert" issue. See https://github.com/puppetlabs/puppet/pull/916. And the ssl_client_ca_auth setting still "works" on the agent if set. As in you can point the agent to a CA bundle file, and the agent will use that to verify the server's cert chain.

The ssl_server_ca_auth setting did the same for webrick puppetmaster (controlling which client intermediates the server would accept), but the setting is now dead.

Now that CA bundles are fully supported, I think we should deprecate ssl_client_ca_auth and ssl_server_ca_auth.

I think there are good reasons for using different intermediates, mainly around compartmentalization. If the client intermediate CA is compromised, then it doesn't affect the status of the puppetserver(s) cert. It also makes it possible to have different CRLs for server vs clients, like the infra CRL.

In order to truly support different intermediates, the client should send its entire chain in its Certificate message. It appears there's a ruby bug that prevents us from being able to configure that. See https://bugs.ruby-lang.org/issues/9758. The current workaround is add the client's intermediates to the server, so it can resolve the chain, using the Jetty equivalent of https://httpd.apache.org/docs/2.4/mod/mod_ssl.html#sslcacertificatefile.

Josh Cooper (JIRA)

unread,
Mar 13, 2019, 2:42:04 AM3/13/19
to puppe...@googlegroups.com
Josh Cooper commented on Improvement PUP-9500

Turns out the split_external_cas puppetserver test runs the agent with an incomplete chain (missing the agent intermediate CA), and relies on jetty being able to load the missing intermediate locally on the server. However, for that to work, revocation is disabled. To ensure I don't break things in 6.x, I've had to reenable support for this configuration. I think we should deprecate the ssl_client_ca_auth and ssl_server_ca_auth settings in Puppet 6, and remove them in 7.

Josh Cooper (JIRA)

unread,
Mar 21, 2019, 6:38:04 PM3/21/19
to puppe...@googlegroups.com

Josh Cooper (JIRA)

unread,
May 29, 2019, 1:04:04 PM5/29/19
to puppe...@googlegroups.com
Josh Cooper commented on Improvement PUP-9500

Agree we don't support multiple intermediate certificates currently. Given the amount of work still needed to support multiple intermediate CAs, such as SERVER-2346, I'm going to close this.

Reply all
Reply to author
Forward
0 new messages