Compartilhar via


Manipuladores de extensão

Começando com X.509 Formato de certificado versão 3, um certificado pode conter extensões de certificado. (Para obter o conteúdo de um certificado X.509, consulte propriedades de certificado.) Essas extensões indicam informações adicionais. Por exemplo, uma extensão pode indicar informações adicionais de identificação de assunto ou pode indicar informações de uso de chave, que especifica as tarefas (como assinatura ou criptografia) para as quais uma chave pode ser usada. Um conjunto de extensões padrão é definido para uso do aplicativo e as extensões também podem ser personalizadas.

Cada extensão tem uma cadeia de caracteres de identificador de objeto associada que identifica o tipo de informações adicionais e uma estrutura de dados que contém essas informações. Por exemplo, o identificador de objeto de uso de chave é "2.5.29.15", que indica informações de uso de chave. Sua estrutura de dados associada é um CRYPT_BIT_BLOB (bitfield) que especifica como a chave pode ser usada.

Uma extensão pode ser adicionada a um certificado antes de ser emitida. Quando o certificado é emitido, todas as extensões habilitadas fazem parte do certificado. Se uma extensão for marcada como crítica, seu uso deverá ser conhecido pelo aplicativo de uso e o aplicativo deverá aderir à intenção ou ao valor da extensão. Os Serviços de Certificados permitem que as extensões sejam definidas em um certificado não emitido por meio de métodos fornecidos por ICertAdmin e ICertServerPolicy. Para obter detalhes sobre extensões de certificado, consulte CERT_EXTENSION na documentação do CryptoAPI. Para obter informações sobre estruturas comuns de dados de extensão de certificado, consulte estruturas de extensão de certificado X.509.

O manipulador de extensão é um objeto COM que fornece rotinas para codificar as extensões e tipos de dados mais complexos, mas comumente usados, como IA5String ou PrintableString.

As extensões que têm os tipos de dados DATE, LONG e BSTR não exigem um manipulador de extensão. O módulo de política simplesmente chama ICertServerPolicy::SetCertificateExtension com o parâmetro Type definido como um valor que representa o tipo de dados de extensão: PROPTYPE_DATE, PROPTYPE_LONG ou PROPTYPE_STRING. Em seguida, ele passa a extensão para o mecanismo de servidor. O mecanismo de servidor, por sua vez, executa a codificação ASN.1 (Abstract Syntax Notation One) antes de armazenar a extensão no certificado.

No entanto, as extensões que têm tipos de dados diferentes desses tipos padrão devem ser codificadas como ASN.1 por um manipulador de extensão antes que o módulo de política as passe para o mecanismo de servidor. Quando o módulo de política chama ICertServerPolicy::SetCertificateExtension para passar uma extensão codificada em ASN.1 para o mecanismo de servidor, ele deve definir o parâmetro Type como PROPTYPE_BINARY. Em seguida, o mecanismo de servidor simplesmente armazena essa extensão codificada no certificado.

O manipulador de extensão padrão, Certenc.dll, exporta vários interfaces de ICertEncodeXXX e pode ser chamado pelo módulo de política. As informações de tipo necessárias também estão contidas em Certencl.dll que é fornecido no SDK (Platform Software Development Kit). Cada interface fornece um método Encode que retorna uma extensão de certificado codificada em ASN.1 para o módulo de política em um formato binário. O módulo de política pode definir a extensão em um certificado chamando o métodoICertServerPolicy::SetCertificateExtension.

Para obter mais informações, consulte Escrevendo manipuladores de extensão personalizados.