Today, I noticed that OpenSSL and the browser (Firefox, Chrome) give me different certificate chains for a website. OpenSSL shows a root certificate from "GTE CyberTrust Global Root", and Firefox & Chrome show a root certificate for "Baltimore CyberTrust Root". Here is the certificate chain output from running "openssl":

openssl s_client -connect "WEBSITE.com:443"  -servername WEBSITE.com
Certificate chain
 0 s:/C=US/ST=NY/L=New York/O=Company/OU=Company/CN=*.WEBSITE.com
   i:/C=NL/L=Amsterdam/O=Verizon Enterprise Solutions/OU=Cybertrust/CN=Verizon Akamai SureServer CA G14-SHA2
 1 s:/C=NL/L=Amsterdam/O=Verizon Enterprise Solutions/OU=Cybertrust/CN=Verizon Akamai SureServer CA G14-SHA2
   i:/C=IE/O=Baltimore/OU=CyberTrust/CN=Baltimore CyberTrust Root
 2 s:/C=IE/O=Baltimore/OU=CyberTrust/CN=Baltimore CyberTrust Root
   i:/C=US/O=GTE Corporation/OU=GTE CyberTrust Solutions, Inc./CN=GTE CyberTrust Global Root

The "GTE CyberTrust Global Root" is a 1024-bit certificate. (Since 1024-bit certificates are deprecated, this can be a problem)

In my browser, if I view the Certificate Hierarchy for WEBSITE.com, it says that the "Baltimore CyberTrust Root" is the root certificate. (It's 2048-bit, which is good!)

Interestingly, if I look at the "issuer" for the "Baltimore CyberTrust Root" in the browser, the issuer is itself. On the other hand, OpenSSL indicates that it was issued by "GTE CyberTrust Global Root".

Why does browser tell me that "Baltimore CyberTrust Root" is the root certificate, and openssl tell me that "GTE CyberTrust Global Root" is the root? What accounts for the difference?


Cross Certification accounts for the difference.

Remember that a certificate is simply the unique combination of Subject Name and Public Key.

In your browsers' trust anchor lists, the certificate with Subject Name "Baltimore CyberTrust Root" and Public Key A has been signed by itself and is therefore a self-signed root certificate.

In your OpenSSL trust anchor list, the certificate with Subject Name "Baltimore CyberTrust Root" and Public Key A has been signed by "GTE CyberTrust Global Root". This is logically the same certificate as your browsers use, although, instead of being self-signed, it is signed by a superior root (superior in the hierarchical sense, not key length).

Developers of SSL libraries (Microsoft, Mozilla, OpenSSL etc) manage their own list of trust anchors; which is why you see different paths from your end entity certificate to your trust anchor.

Therefore, history is why they differ. Mozilla removed the "GTE CyberTrust Global Root" in NSS when Firefox 36 was released. Microsoft probably removed it around the same time too. Your version of OpenSSL still has it. Around the same time, Mozilla and Microsoft will probably have added a self-signed root CA certificate from "Baltimore CyberTrust Root" so that certificate chain building still works.

It is difficult to give a more precise answer as you don't mention which browsers you use nor which version and platform for OpenSSL.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.