Cisco offers Trusted
Root Store bundles for configuring the default trusted Certificate Authorities of
applications, operating systems, and products we ourselves use, and those which
go into the products and offerings we sell to customers.
The Trusted Root Stores are a collection of Certificate Authorities used in
Public Key Infrastructure, and cover a variety of protocols and usages, such as
HTTPS (SSL / TLS), VPN, SMPTS / STARTTLS, FTPS, LDAPS, S/MIME, Code Signing,
etc. The usage of such bundles is context dependent, and we offer a few public
bundles:
Core Bundle - Used for communication
throughout and back to Cisco. Only Cisco private CAs and approved
public CAs.
(Download Core
Bundle)
Intersect Bundle - Required for
products and services that require TLS connections to services not operated by
Cisco. and consists of Core plus only the public CAs that are trusted by all
the major Root Store programs. If your app / product speaks to the public
internet, this bundle is likely the best choice.
(Download Intersect
Bundle)
Union Bundle - Used where
connectivity is favored at the cost of security, and generally used by devices
like proxies that require wide connectivity. Union bundle is similar to
Intersect, but includes every public CA that are trusted by any of the major
Root Store programs.
FedRAMP Bundle - Used for US federal
operations, this bundle consists of the Core bundle, plus the USA CAs from the
Intersect bundle, plus root CAs from the US DoD External PKI Trust Chains.
Public Key Infrastructure (PKI) is built on the concept of a trust model: when presented with a new public key, an entity must have some basis for deciding whether or not to trust that the key presented is actually associated uniquely with the entity presenting it. In SSL-secured HTTP or SMTP, S/MIME, and similar services, this trust is based on a centralized, hierarchical trust model known as a trust chain: the presenter has had its public key validated and signed by a third party whose key is already known to the recipient and trusted to make such decisions. Examples of this type of third party include VeriSign, Thawte, and IdenTrust. This third party’s signed key, since it forms the root of the trust chain, is known as a root certificate.
Cisco has built numerous products that rely on a set of root certificates that pre-instantiate trust with a common set of certificate vendors: this set of root certificates is known as a root store. In alignment with Cryptographic Services’ function as the centralized provider of cryptographic materials for Cisco, Cryptographic Services has created multiple centralized sets of root certificates that will be validated and maintained by Cryptographic Services for development teams to use when building products that rely on this type of root store. By centralizing this service and the process of approving root certificate authorities for inclusion, Cisco intends to reduce redundancy in development resources, increase communication between development teams integrating this function into their products, and increase the security and trust level of each of its products.
What is Cisco Providing?
Cryptographic Services currently offers three root store bundles for products to use in anchoring TLS trust, ranging from minimized trust (most secure) to a wide range of public CAs (least secure). Per PSB requirements (SEC-509-CALIST), teams must choose the root store with the smallest trust possible that will still meet their needs.
At the moment, Cryptographic Services is providing these trust bundles as amalgamated collections of certificates from other trust stores.
What is in the different bundles?
See the Root Store Public cisco.com Page which has copies of the latest bundles, manifests showing the contents of each of the current bundle files, as well as historical records of the bundle contents over time. There is also a page documenting the Cisco Internal Certificate Authoritiesthat are included with each bundle.
Each Trust Store bundle is provided as a digitally signed PKCS#7 bundle file (.p7b), available for download from Cisco's public website at the main Cryptographic Services page (https://www.cisco.com/security/pki/trs/current/). Each bundle has been signed with a digital signing certificate that chains to Cisco's Root CA M1 embedded in most Cisco products (and also available publicly from that same site).
Core Trust Store Cisco provides a small bundle intended to facilitate services connecting specifically to Cisco-owned resources, such as products connecting to tools.cisco.com to look for software updates. This bundle includes only the certificates considered necessary to connect to Cisco resources, including the main Cisco-operated roots as well as specific third-party roots that are commonly used to issue Cisco production SSL certificates, as well as the Approved Public CAs.
Recommended Uses The Core bundle makes an excellent default set of trust anchors for products, since it contains no more trust than is necessary to obtain updates and data directly from Cisco. This makes it a good choice as the default trust bundle for products; the products may then offer customers the option to expand trust to external CAs with the Intersect bundle where appropriate.
Download The core bundle is available for download directly here: https://www.cisco.com/security/pki/trs/current/ios_core/
Intersect Trust Store The collection of root certificates in the intersect bundle consists of the most significant industry root certificate authorities. Cryptographic Services collects and analyzes the following root stores:
The Intersect bundle consists of a mathematical intersect of these root stores: only roots in all three of the root stores are included in the Intersect bundle. In addition, Cisco may include specific Cisco root certificate authorities in this bundle for product compatibility or security reasons, such as the Licensing CA to support license verifications. Cisco also verifies, wherever possible, that each selected provider has at a minimum completed the AICPA WebTrust for CA certification audit and filed the results appropriately. A complete list of the certificates included in this bundle is available from Cryptographic Services on request.
Recommended Uses The Intersect bundle is the required choice for products and services that require TLS connections to services not operated by Cisco. As an example, when connecting to a website operated by a customer, the product may not be able to anticipate which CA the customer has purchased their certificate from. The Intersect bundle provides a reasonable set of default trust for this situation, containing the most common industry CAs from the customer might have obtained a certificate.
Download The intersect bundle is available for download directly here: https://www.cisco.com/security/pki/trs/current/ios/
Union Trust Store Cisco also provides a Union bundle to support specific applications that require wider trust support at the expense of lower overall security. This bundle analyzes the contents of the four root stores referenced above, and then constructs a bundle consisting of all the certificate authorities in any of the three root stores (a mathematical union). As with the Intersect bundle, Cisco may include specific Cisco root certificate authorities in the Union bundle for product compatibility or security reasons. Because the Union bundle is significantly larger than the Intersect bundle and is considered to have a lower trust level, Cisco may not manually verify the completion of annual AICPA WebTrust for CA certification audits for all CAs included. A complete list of the certificates included in this bundle is available from Cryptographic Services on request.
Recommended Uses Recommended uses for the Union bundle include applications such as SSL circuit proxy functions, where the product needs to trust the widest possible array of certificate authorities in order to provide maximum compatibility.
Because the Union bundle offers a significantly lower security profile due to vastly wider trust, it is intended only for use in applications where this wider trust will not compromise the overall product trustworthiness.
**WARNING** : The Union bundle MUST NOT be used as the primary trust bundle for default TLS connections in a product.
Download The union bundle is available for download directly here:https://www.cisco.com/security/pki/trs/current/ios_union/
FedRAMP Trust Store The FedRAMP (Federal Risk and Authorization Management Program) trusted root store is a collection of digital certificates that have been deemed trustworthy by the U.S. government for use in securing federal information systems. These certificates are issued by trusted Certificate Authorities (CAs) and are used to establish secure connections between users and federal systems, ensuring the integrity, confidentiality, and authenticity of data transmitted over these connections. The FedRAMP trusted root store helps standardize security practices across federal agencies by providing a common set of trusted certificates that meet rigorous security standards.
Recommended Uses The FedRAMP bundle should be used for establishing the secure connections in the context of the Federal Risk and Authorization Management Program (FedRAMP). This bundle is created from the intersect bundle for exclusive use in US FedRAMP environment.
Download The FedRAMP bundle is available for download directly here: https://www.cisco.com/security/pki/trs/current/fedramp/ |
This section outlines the new features in the Cisco Trusted Root Store (TRS) bundles.
Downloading the new bundles
The new trusted root store bundles can be downloaded from subdirectories of the existing TRS index:
Current Directory
The /current/ directory contains all the latest bundles, each organized into its own subdirectory. The structure of the /current/ index is as follows:
Each bundle's latest version is located in its respective subdirectory.
Archive Directory
The /archive/ directory houses historical versions of each bundle. The structure mirrors that of the /current/ directory:
Each bundle’s directory contains a list of prior versions, with each version stored in its own subdirectory named after the version.
Directory Contents
Both the /current/ and /archive/ directories include the following types of content:
Here is a preview of the /archive/ios/ and /current/ios/ directory.
Log Files
Each bundle directory contains two log files:
File Naming Convention
Files follow a consistent naming convention to indicate their type and format. For example:
e22df10076c90c5e62bf88a389ef51a9d66eae23fc1245e8bcbbb6632cdb7057da1fb457969fa601f312ae6d951375e398dfd97c710a143b2ccc35443f6fd407
Additionally,
JSON Diff
Each bundle includes a JSON diff file that details changes between the current and previous versions. These files are human-readable and can be parsed by SHA to identify added or deleted certificates. Example structure:
{
"currentVersion": "20250513",
"prevVersion": "20250417",
"additions": [
{
"certSha256": "6AB2AB75F51CB4F4F0156203FBF6F646232F514BE059F62833308B82B4D72DB1",
"certSubjectDn": "CN=SECOM TLS ECC Root CA 2024,O=SECOM Trust Systems Co.\\, Ltd.,C=JP"
},
{
"certSha256": "1435F225C5D252D7A21948CC3CE62AECFA88001E3DD72D1CC3555100EB372F93",
"certSubjectDn": "CN=SECOM TLS RSA Root CA 2024,O=SECOM Trust Systems Co.\\, Ltd.,C=JP"
}
],
"deletions": [
{
"certSha256": "16AF57A9F676B0AB126095AA5EBADEF22AB31119D644AC95CD4B93DBF3F26AEB",
"certSubjectDn": "CN=Baltimore CyberTrust Root,OU=CyberTrust,O=Baltimore,C=IE"
}
]
}
Release Scheduling
The release process for TRS bundles has been updated:
Bundle Versioning
The version system for the new bundles has changed. The old TRS bundles were versioned sequentially. Since not all bundles release at the same pace, this versioning system did not provide any info as to how old or new a particular version was. The new versions are a UTC date string in the format yyyyMMdd. This date is the date that the bundle was built, signed, and published.
Bundle Signing
The old bundles are signed by the same offline root signer (Cisco Root CA M1). The new bundles use a new signing cert for each version, issued from the TRS Bundle SubCA. The signing certs are obtained from a Cryptographic Services internal CA. This process allows for revocation checking in the event that a signing key is ever compromised.
Question: How do I extract the certificates from this bundle?
You can also extract the information from the bundle with OpenSSL, provided you are using OpenSSL v1.0 or greater.
To do this, you will need:
Then run these commands:
Question: This bundle only seems to have few certificates in it when I check it with OpenSSL. Why?
Answer: The bundles are provided as a signed message file: by default, OpenSSL's PKCS#7 handler will only see the signature envelope on the file and not the contents. If you are only seeing few certificates, then you have not fully unpacked the certificate bundle.
To extract the certificates, follow the instructions above.
Question: I'm currently using the Mozilla/NSS trust store for my product. Why should I switch to this? Do I have to switch?
Answer: At this time, the use of the Cisco Trust Stores is a PSB requirement per requirement SEC-509-CALIST. This means teams must convert to using these bundles for TLS connections originating from Cisco product or service code (if you run into problems with this, we want to hear from you!).
All Cisco-developed code must use these Trust Stores as an anchor when originating TLS connections. Third-party software such as operating systems or browsers should not use these trust stores, to ensure compatibility and support. So if your Linux server needs to connect to Debian to download a patch, it should continue using the manufacturer-provided trust store to do so. If your Cisco-developed Java application needs to connect to something, it must use the Cisco Trust Stores.
The use of these trust stores offers several compelling features over the use of a third-party trust store:
Question: How often are the bundles updated? How do I find out about updates?
Answer: Bundles are built daily but published only when there’s a change in CCADB. Cryptographic Services also reserves the right to publish an emergency update in the event of a CA compromise. All updates are announced in advance (wherever possible) and after the fact on the Trusted Root notification mailer: trusted-root-notify@cisco.com (NOTE: Internal Cisco-only mailer). We urge all developers consuming or working with the Cisco Trust Store bundles to subscribe to that mailer (it's very low-traffic, we promise!).
Question: How do I find the version of a bundle?
Answer: Bundle files include a signed attribute designating the version number of the bundle. It is contained in a custom OID: 1.3.6.1.4.1.9.21.2.3.1 . Programmatically that OID can be parsed like so (the value in PRINTABLESTRING is the version number of the bundle):
openssl cms -in ios_union.p7b -noout -cmsout -print -inform DER | grep -A 2 "1.3.6.1.4.1.9.21.2.3.1"
Example output (showing v15 for ios_core.p7b):
JKS format does not support signed attributes like PKCS7. So to store the version in the JKS format bundles, a workaround is used. The version is added as a PKCS12 attribute to the trusted cert entry for the bundle signer. Since this is not supported in JKS format, the Java keytool is unable to read it. The version can be extracted by converting the JKS file to a p12 file and using OpenSSL. An example is shown below:
(Note, this creates and deletes a temporary file "_TEMPP21")
Example Output:
20250513
Using Java code, finding the version of a JKS bundle is much easier:
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.security.KeyStore;
import java.security.Signature;
import java.security.cert.Certificate;
import java.util.*;
try {
final KeyStore keystore = KeyStore.getInstance(new File(jksFilename), (char[])null);
final KeyStore.TrustedCertificateEntry entry =
(KeyStore.TrustedCertificateEntry)keystore.getEntry("signer-cert", null);
final Set<KeyStore.Entry.Attribute> attributes = entry.getAttributes();
for (KeyStore.Entry.Attribute attr : attributes) {
if (attr.getName().equals("1.3.6.1.4.1.9.21.2.3.1")) {
return attr.getValue();
}
}
throw new RuntimeException("Failed to find version attribute");
} catch (Exception e) {
throw new RuntimeException(e);
}
Question: How do I verify a bundle?
Answer: Please use this shell utility to verify the bundle: https://wwwin-github.cisco.com/sto-cryptosvcs/trs-verify/tree/dev
Highlights of this script's key features:
Single command to verify TRS bundles
Files needed to complete the following commands:
Cisco M1 Root# Option 1: Verify with Cisco M1 Root certificate
openssl cms -verify -inform DER -in <your TRS bundle.p7b> -out verified.p7b -certfile <crcam1.pem>
# Option 2: Verify with New TRS Signer certificates
openssl cms -verify -inform DER -in <your TRS bundle.p7b> -out verified.p7b -certfile <tbsca.pem> -CAfile <tbrca.pem>
Question: How does JKS verification work?
Answer: Since JKS format does not support signed messages, detached signatures are published which can be used to verify integrity of the entire keystore file. This is a rather straightforward process in Java code:
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.security.KeyStore;
import java.security.Signature;
import java.security.cert.Certificate;
import java.util.*;
public boolean verifySignature() {
try {
if((signatureFilename == null) || (signatureFilename.isEmpty())) {
System.out.println("No signature filename specified");
System.exit(1);
}
final KeyStore keystore = KeyStore.getInstance(new File(jksFilename), (char[])null);
final Certificate signerCert = keystore.getCertificate("signer-cert");
final String sigStr = Files.readString(Path.of(signatureFilename)).strip();
final byte[] sigBytes = HexFormat.of().parseHex(sigStr);
final ByteArrayOutputStream keystoreBytes = new ByteArrayOutputStream();
keystore.store(keystoreBytes, null);
final Signature sig = Signature.getInstance("SHA256withRSA");
sig.initVerify(signerCert);
sig.update(keystoreBytes.toByteArray());
return sig.verify(sigBytes);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
Signature verification can also be performed using keytool and OpenSSL on the command line:
# Export the signer certificate from the JKS keystore
keytool -exportcert -alias "signer-cert" -keystore ios.jks -rfc -file _TEMP_signer-cert.pem
# Download the signature file
curl -fsSL "https://www.cisco.com/security/pki/trs/current/ios/ios.jks.signature.sha256" -o "ios.jks.signature.sha256"
# Convert hex signature to binary
xxd -r -p "ios.jks.signature.sha256" "ios.jks.signature.sha256.bin"
# Extract public key from certificate
openssl x509 -in "_TEMP_signer-cert.pem" -pubkey -noout > "_TEMP_pubkey.pem"
# Verify the signature
openssl dgst -sha256 -verify "_TEMP_pubkey.pem" -signature "ios.jks.signature.sha256.bin" "ios.jks"
# Clean up temporary files
rm -rf _TEMP_signer-cert.pem ios.jks.signature.sha256 ios.jks.signature.sha256.bin _TEMP_pubkey.pem
Question: How do I extract all the certs from the JKS?
Answer: You can extract all certificates from a JKS keystore using the following Java code:
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.security.KeyStore;
import java.security.Signature;
import java.security.cert.Certificate;
import java.util.*;
public Certificate getCertificate(final String certSha256) {
try {
final KeyStore keystore = KeyStore.getInstance(new File(jksFilename), (char[])null);
return keystore.getCertificate(certSha256);
} catch(final Exception e) {
throw new RuntimeException(e);
}
}
public Set<Certificate> getAllCertificates() {
try {
final KeyStore keystore = KeyStore.getInstance(new File(jksFilename), (char[])null);
final Set<Certificate> certs = new HashSet<>();
final Iterator<String> iter = keystore.aliases().asIterator();
while(iter.hasNext()) {
final String alias = iter.next();
if(keystore.isCertificateEntry(alias)) {
certs.add(keystore.getCertificate(alias));
}
}
return certs;
} catch(final Exception e) {
throw new RuntimeException(e);
}
}
Question: None of my questions are answered here, who can I contact?
Answer: Please write to us: trust-root-store@external.cisco.com