So Qualified Subordination is super important, it’s what really allows us to implement Least Privilege in PKI hierarchies.
This concept is implemented in Windows XP as of SP3 because there was a back-port of the Windows Vista certificate chain validation logic included in SP3.
With that said there is at least one difference between VISTA, Windows 7 and Windows 8 chain validation logic in the way Name Constraints is processed.
More precisely once it sees a name constraint applied to a certificate it requires that only the names and scope of names expressed in the Name Constraint extension are present in the certificate.
For example, lets say I restrict a CA to issue only for the DNS domain of example.com, once this is put in the certificate I can no longer include “O=Example Company Name” in the subject of the certificates issued by that CA.
If I want the CA to be able to include that organization name in the certificates it issues I have to express that using the DirectoryName constraint.
This is not compliant with the RFC and was later changed so VISTA, Windows 7 and Windows 8 do not behave this way.
That said you can change the behavior in XP by tweaking the following registry key:
This is a bitmask represented as a REG_DWORD, it is defined in WinCrypt.h as but the flag following definitions will tell you how to tweak this one part:
#define CERT_PROT_ROOT_FLAGS_VALUE_NAME L”Flags”
// Set the following flag to disable checking for not defined name
// When set, CertGetCertificateChain won’t check for or set the following
// dwErrorStatus: CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT.
// In LH, checking for not defined name constraints is always disabled.
#define CERT_PROT_ROOT_DISABLE_NOT_DEFINED_NAME_CONSTRAINT_FLAG 0x20
You could deploy this behavior via group policy if you did not want the behavior, it’s probably easier to just include the names you are willing to let the CA issue to but changing the behavior in this way in an option for some.
Hope this helps,