-
-
Notifications
You must be signed in to change notification settings - Fork 4.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
old certificate is used after switching to on-demand let's encrypt #1994
Comments
This issue is slightly different from #1991 as it is about switching the certificate and not about multiple certificates might secure the same site but IMHO it will be solved by implementing site based certificate caches. |
Yes, I agree, it seems that if the certificate map/cache was "sandboxed" to each site, it would resolve this issue. I'll investigate! |
mholt
added a commit
that referenced
this issue
Feb 4, 2018
- Expose the list of Caddy instances through caddy.Instances() - Added arbitrary storage to caddy.Instance - The cache of loaded certificates is no longer global; now scoped per-instance, meaning upon reload (like SIGUSR1) the old cert cache will be discarded entirely, whereas before, aggressively reloading config that added and removed lots of sites would cause unnecessary build-up in the cache over time. - Key certificates in the cache by their SHA-256 hash instead of by their names. This means certificates will not be duplicated in memory (within each instance), making Caddy much more memory-efficient for large-scale deployments with thousands of sites sharing certs. - Perform name-to-certificate lookups scoped per caddytls.Config instead of a single global lookup. This prevents certificates from stepping on each other when they overlap in their names. - Do not allow TLS configurations keyed by the same hostname to be different; this now throws an error. - Updated relevant tests, with a stark awareness that more tests are needed. - Change the NewContext function signature to include an *Instance. - Strongly recommend (basically require) use of caddytls.NewConfig() to create a new *caddytls.Config, to ensure pointers to the instance certificate cache are initialized properly. - Update the TLS-SNI challenge solver (even though TLS-SNI is disabled currently on the CA side). Store temporary challenge cert in instance cache, but do so directly by the ACME challenge name, not the hash. Modified the getCertificate function to check the cache directly for a name match if one isn't found otherwise. This will allow any caddytls.Config to be able to help solve a TLS-SNI challenge, with one extra side-effect that might actually be kind of interesting (and useless): clients could send a certificate's hash as the SNI and Caddy would be able to serve that certificate for the handshake. - Do not attempt to match a "default" (random) certificate when SNI is present but unrecognized; return no certificate so a TLS alert happens instead. - Store an Instance in the list of instances even while the instance is still starting up (this allows access to the cert cache for performing renewals at startup, etc). Will be removed from list again if instance startup fails. - Laid groundwork for ACMEv2 and Let's Encrypt wildcard support. Server type plugins will need to be updated slightly to accommodate minor adjustments to their API (like passing in an Instance). This commit includes the changes for the HTTP server. Certain Caddyfile configurations might error out with this change, if they configured different TLS settings for the same hostname. This change trades some complexity for other complexity, but ultimately this new complexity is more correct and robust than earlier logic. Fixes #1991 Fixes #1994 Fixes #1303
4 tasks
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Unfortunately this issue is hard to track and I could find a way to reproduce it on my test systems, yet.
I hope by describing the issue you'll find a reason by checking the code.
It might be solved by the solution discussed in #1991.
1. What version of Caddy are you using (
caddy -version
)?Caddy 0.10.10
2. What are you trying to do?
Switch certificate of a domain from third-party to on-demand let's encrypt.
3. What is your entire Caddyfile?
I just provided a short part of the configuration as all would result in 31026 lines of configuration.
Most of it is vhost configuration which just differ in the matching hostname.
'ratelimit' is deactivated because of xuqingfeng/caddy-rate-limit#23
4. How did you run Caddy (give the full command and describe the execution environment)?
Started using the sysv-init script extended by me with PR #1984 .
5. Please paste any relevant HTTP request(s) here.
see 8.
6. What did you expect to see?
After reloading Caddy it should start generating a let's encrypt certificate on the first request made to the domain.
7. What did you see instead (give full error messages and/or log)?
It delivers the old certificate until you switch to not-on-demand mode, reload Caddy and a certificate is generated.
The behaviour does not depend on the validity of the old certificate. It happens with invalid and with valid certificates and certificate chains.
8. How can someone who is starting from scratch reproduce the bug as minimally as possible?
Thiis is the hard part.
With a minimal config using just one or a few domains Caddy behaves as expected.
We have 986 domains with https configuration.
316 are using let's encrypt configuration.
233 are using on-demand let's encrypt.
Following the steps I can use to reproduce it on our production system:
The text was updated successfully, but these errors were encountered: