Manipuladores de extensão

A partir do formato de certificado X.509 Versão 3, um certificado pode conter extensões de certificado. (Para obter o conteúdo de um certificado X.509, consulte Propriedades do certificado.) Essas extensões indicam informações adicionais. Por exemplo, uma extensão pode indicar informações adicionais de identificação do 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 (campo de bits) 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 using 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 da 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 os tipos de dados e extensões 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árias interfaces ICertEncodeXXX e pode ser chamado pelo módulo de política. As informações de tipo necessárias também estão contidas no Certencl.dll que é fornecido no SDK (Platform Software Development Kit). Cada interface fornece um método Encode que retorna uma extensão de certificado codificado 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étodo ICertServerPolicy::SetCertificateExtension .

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