{"id":1631,"date":"2020-06-02T17:58:06","date_gmt":"2020-06-02T15:58:06","guid":{"rendered":"https:\/\/dev.buddydevs.com\/miguel\/ssl-fehler-30-mai-2020\/"},"modified":"2026-09-12T11:57:16","modified_gmt":"2026-09-12T11:57:16","slug":"ssl-error-30-may-2020","status":"publish","type":"post","link":"https:\/\/dev.buddydevs.com\/miguel\/en\/ssl-fehler-30-mai-2020\/","title":{"rendered":"SSL error May 30, 2020"},"content":{"rendered":"
On May 30, 2020, we experienced a rare situation in the public-key infrastructure of the Internet when two of the root certificates expired, one signed by the other SSL certification authority.<\/p>\r\n\r\n\r\n\r\n
Theoretically, this is nothing unusual. Certificates expire constantly (usually in a year or even in 90 days when you use Let\u2019s Encrypt), and the certificates of the certification authorities expire after a few years. But on May 30, the expiring certification authority uncovered a fundamental problem that resulted in our API being unavailable for some of our customers.<\/p>\r\n\r\n\r\n\r\n
On May 30, when the certificates from the certification authorities expired, we received support requests that there was a certificate issue with our service. This was an unexpected notification, as we carefully check whether our certificates are valid and do not expire within the foreseeable future. A quick check in the browser also confirmed that everything seemed to be normal and that the API was responding correctly.<\/p>\r\n\r\n\r\n\r\n
When looking at the statistics of our infrastructure, we noticed that the number of API calls had decreased, but it was by far not close to zero, as would have been expected in the event of a complete SSL failure. When things are not working completely, it is often easier to see what is not working than in situations where some things work and others do not.<\/p>\r\n\r\n\r\n\r\n
An extensive investigation eventually revealed that problems had also occurred with other services on the Internet. We quickly found clues as to the cause: https:\/\/support.sectigo.com\/articles\/Knowledge\/Sectigo-AddTrust-External-CA-Root-Expiring-May-30-2020<\/a><\/p>\r\n\r\n\r\n\r\n This was an interesting situation. There was a valid path to the USERTrust RSA Certification Authority, and there was also an expired path. The browser was able to find the valid chain, but the lock was unable to find it. The test by Quality SSL Labs showed that the system worked and the certificate configuration worked flawlessly.<\/p>\r\n\r\n\r\n\r\n Our team began with the second change to our public certificate and tried to restore the service to the remaining customers, and shortly after deployment they confirmed to them that they could regain access to the service. The incident was now finally over, and the service was restored for all customers. But why did some of our customers lose access in the first place, when even the SSL scanner says that the certificate is valid?<\/p>\r\n\r\n\r\n\r\n The certificate was indeed valid, and the entire certificate chain was generated fairly correctly by the certification authority Comodo\/Sectigo (running a certificate over the weekend is not a good practice). What was not provided for was the way the client libraries would handle this situation, primarily OpenSSL, which powers the vast majority of HTTPS on Earth. In analyzing the incident, we came across an interesting OpenSSL bug from 2014 that states:<\/p>\r\n\r\n\r\n\r\n
\r\n\r\n
\r\n