Storing Trust Assertions in PKCS#11 Modules
Introduction
PKCS#11 XXXREFXXX is a useful and widely supported standard for storage and use
of keys and certificates. It is often used with smart cards.
XXX
Trust Assertions
A trust assertion describes a level of trust in a certain subject for a
given purpose. Conceptually each trust assertion is a triple
containing the following:
Reference to the Subject
Purpose
Level of Trust
We examine each of these parts of the triple in further detail below.
Level of Trust
XXX
Untrusted: Explicitly untrusted. Override other
trust.
Trusted: Explicitly trusted. Override other
trust
Trust Anchor: Explicitly trusted anchor which
can confer its trust (eg: via signatures) on other
subjects.
Purpose
A trust assertion refers to a specific purpose or usage. A
certificate may be trusted for purposes like: email, code signing,
authenticating a server.
In addition to the usage, the purpose can contain a more specific
designation, such as the hostname of a server.
Subject Reference
Each trust assertion contains a reference to the subject. This is the thing
that is trusted. In this specification we will deal exclusively with
certificates as the subject. However .
There are two ways to refer to a certificate depending on whether
that certificate is being referred to as a trust root (like a certificate
authority) or referred to by another trusted certificate.
Certificates used as trust roots are referred to by the complete DER
encoding of the certificate.
Certificates verified by another certificate (signed as part
of a certificate chain) are referred to by the DER value of the issuer
field and the serial number.
Referring to a trust root certificate by its issuer and serial number
is meaningless.
Referring to a certificates signed by another certificate would preclude uses
such as certificate revocation lists.
Therefore different methods MUST be used to refer certificates in these
different situations.
PKCS#11 Trust Assertion Objects
Trust assertions are stored as objects on a PKCS#11 token. Although these are
specific to a certificate, they do not need to be stored on the same token as
the certificate.
When represented as PKCS#11 objects, trust assertions get a bit less elegant
than the reference + purpose + trust-level described above. This is done
for practicality and minimizing the number of PKCS#11 lookups required
to do an operation.
Common Trust Assertion Object Attributes
First we describe the attributes that all trust assertion objects have in
common. All trust assertions are of the class CKO_G_TRUST_ASSERTION.
General trust assertion attributes
Attribute
Data Type
Description
CKA_CLASS
CK_OBJECT_CLASS
CKO_G_TRUST_ASSERTION
CKA_G_TRUST_TYPE
CK_TRUST_TYPE
The type of trust assertion. This represents
the trust level. See more details below.
CKA_G_PURPOSE
CK_UTF8_CHAR array
The string representation of the purpose, usually
an OID.
The CKA_G_PURPOSE attribute contains a string which represents the purpose
of the trust assertion. These are generally OIDs. The following predefined
values match those of the Extended Key Usage X.509 extension. Other values
may be used when interoperability of the trust assertion between multiple
applications is not desired.
Predefined Purposes
Value
Description
1.3.6.1.5.5.7.3.1
TLS Server Authentication
1.3.6.1.5.5.7.3.2
TLS Client Authentication
1.3.6.1.5.5.7.3.3
Code Signing
1.3.6.1.5.5.7.3.4
Email Protection
1.3.6.1.5.5.7.3.5
IPSec Endpoint
1.3.6.1.5.5.7.3.6
IPSec Tunnel
1.3.6.1.5.5.7.3.7
IPsec User
1.3.6.1.5.5.7.3.8
Time Stamping
Each different type of trust assertion is represented by a different
CK_G_TRUST_TYPE value. The following types are defined.
Trust assertion types
Trust Type
Description
CKT_G_CERTIFICATE_UNTRUSTED
A trust assertion that represents an explicitly
untrust in a certificate.
CKT_G_CERTIFICATE_TRUST_EXCEPTION
A trust assertion that represents an explicitly
trust in a certificate.
CKT_G_CERTIFICATE_TRUST_ANCHOR
A trust assertion that represents a trust anchor
which is used as the root of a certificate trust
tree.
Certificate Exception Trust Assertion
A certificate exception is a trust assertion which signifies a trusted level
of trust in a certificate. The expectation is that all other trust validation
is overridden by this trust.
The certificate is referenced by a using the entire DER encoding of the
certificate.
All certificate exceptions have a designated peer as part of their purpose.
In the case of TLS authentication purposes, this is the host name of the
peer that is being communicated with. In the case of email protection
purposes this is the email address this certificate is to be used with.
In addition to the following, all the general trust assertion attributes
are present on a certificate exception object.
Certificate Exception Attributes
Attribute
Data Type
Description
CKA_G_TRUST_TYPE
CK_TRUST_TYPE
CKT_G_CERTIFICATE_TRUST_EXCEPTION
CKA_G_PEER
CK_UTF8_CHAR array
The peer part of the purpose.
CKA_G_CERTIFICATE_VALUE
Byte array
The DER encoding of the certificate.
Certificate Anchor Trust Assertion
A certificate anchor is a trust assertion which is to be used with a
certificate authority that is a trust root authority to verify
other certificates with.
This type of object signifies a trust anchor level of trust.
The certificate is referenced by a using the entire DER encoding of the
certificate.
In addition to the following, all the general trust assertion attributes
are present on a certificate exception object.
Certificate Anchor Attributes
Attribute
Data Type
Description
CKA_G_TRUST_TYPE
CK_TRUST_TYPE
CKT_G_CERTIFICATE_TRUST_ANCHOR
CKA_G_CERTIFICATE_VALUE
Byte array
The DER encoding of the certificate.
Certificate Untrusted Assertion
An untrusted certificate is a trust assertion which signifies the explicit
lack of trust in a certificate. An example of this is an item in a CRL
or a certificate explicitly marked as untrusted by a user.
The certificate is referenced by a using the issuer and serial number
of the certificate in question.
In addition to the following, all the general trust assertion attributes
are present on a certificate exception object.
Untrusted Certificate Attributes
Attribute
Data Type
Description
CKA_G_TRUST_TYPE
CK_TRUST_TYPE
CKT_G_CERTIFICATE_UNTRUSTED
CKA_ISSUER
Byte array
DER-encoding of the certificate issuer name
CKA_SERIAL_NUMBER
Byte array
DER-encoding of the certificate serial number
Operations
Building a Certificate Chain
During TLS or other certificate verification operations, a certificate chain
must be built up. The certificate chain starts with a trust anchor and
each certificate in the chain is signed by the previous one. The chain ends
with the endpoint certificate for the peer.
Conceptually building a certificate chain can be described as two operations
1) building the chain based on trust assertions, and 2) allowing then
allowing falsification of all or part of the chain based on trust
assertions.
Check if the endpoint certificate has a certificate exception
for the given purpose (and peer). If a certificate exception is found
then the certificate chain consists of one certificate and is considered
valid at this point.
Complete the initial certificate chain. Often the peer does not
send a complete chain and only sends its own certificate. Build up the
chain backwards from the bottom up using the certificate issuer to to
perform PKCS#11 lookups for objects matching the CKA_ISSUER. This is
done until a self-signed certificate is reached, or a certificate is not
found.
Look for a trust anchor for each certificate in the chain
starting from the certificate that signed the endpoint certificate. When
a trust anchor is found then the certificate chain is truncated at that
point.
Allow falsification for each certificate in the resulting
certificate chain by checking whether each certificate has PKCS#11
untrusted certificate trust assertion. If at any point an untrusted
trust assertion is found (eg: CRL) then the certificate chain is
considered invalid.
Pass the resulting certificate chain to the crypto library for
further validation.
Justifications
Some answers to this spec was designed as it is.
Why use a complete DER encoding?
Conceivably we could use a hash of the certificate instead of the
CKA_G_CERTIFICATE_VALUE. NSS Trust Objects XXREFXX uses hashes in this
way.
In the current climate of hash algorithms being broken in various ways
it seems more prudent to avoid the hashing of the certificate and just
use the complete certificate DER-encoding for lookups.
Why lookup untrusted certificates by issuer + serial number?
Certificate revocation lists XXREFXX do not generally contain the full value
of the certificate or a hash thereof. They simply contain serial numbers,
which when combined with the issuer of the certificate revocation list,
are meant to uniquely identify a given certificate.
In order to support CRLs exposed as untrusted assertions (one of the design
goals) we must limit ourselves to this method of identifying untrusted
certificates.
Why not use NSS Trust Objects?
NSS contains an implementation of storing trust information via PKCS#11.
This has not been completely documented, but an overview is available
here XXREFXX.
After careful study of NSS's method of storing trust information, and discussion
with others, the following inherent problems are apparent.
Mandates the use of SHA1 and MD5 hashes both of which are
cryptographically broken in some way XXREFXX. See above
XXLINKXX
Only supports a distinct set of purposes, new purposes are
not supported.
Does not support a trust assertion limited to a single peer, which
precludes storage of trust assertions.