Show / Hide Table of Contents
Editar no GitHub

Customização de políticas

Políticas de assinaturas são um conjunto de normas e propriedades que regulam a criação e validação de assinaturas digitais. O PKI SDK possui padrões de políticas já configuradas para uso nos assinadores e verificadores, mas também é possível de maneira simples criar sua própria política ou customizar um padrão já existente.

Editando uma política

O exemplo abaixo demonstra como carregar um padrão de política de assinatura já configurado e editar alguns parâmetros.

// Carregando política AD-RT v2.1
var policy = BrazilCadesPolicySpec.GetAdrTempoV21();

// Definindo a inclusão do atributo assinado signing-time
policy.AttributeValidation.SigningTime = true;

// Adicionando mais um árbitro para validação do certificado dos signatários
policy.AddRootTrustArbitrator(TrustArbitrators.Windows);

// Adicionando mais um árbitro para validação do certificado da carimbadora
policy.SignatureTimestampPolicy.AddRootTrustArbitrator(new TrustedRoots(privateRoot));

Caso estja fazendo edição de uma política, certifique-se de não criar propriedades conflitantes na criação e validação.

Criando uma política

No exemplo abaixo iremos criar uma política de assinatura CAdES-BES básica implícita, a política não é assinada, não faz parte dos atributos assinados.

// Criando política
var policy = new CadesPolicySpec();

// Definindo propriedades de criação da assinatura
policy.AttributeGeneration = new AttributeGenerationSpec() {
    IncludeSigningTime = true,                                     // Inclui signing-time nos atributos assinados
    IncludeCertificatesInSignedData = InclusionLevel.WholeChain,   // Inclui toda cadeia do certificado no campo Certificates do SignedData
    IncludeCrlsInSignedData = true,                                // Inclui as CRLs usadas no campo CRLs do SignedData
};

// Definindo propriedades de validação da assinatura básica
policy.AttributeValidation = new AttributeValidationSpec() {
    SigningTime = ValidationRequirementLevels.May,
};

// Algoritmos permitidos
policy.DigestAlgorithms.Add(DigestAlgorithm.SHA256);
policy.DigestAlgorithms.Add(DigestAlgorithm.SHA1);
policy.SignatureAlgorithms.Add(SignatureAlgorithm.RSAWithSHA256);
policy.SignatureAlgorithms.Add(SignatureAlgorithm.RSAWithSHA1);

// Árbitro para validação dos certidicados dos signatários
policy.AddRootTrustArbitrator(TrustArbitrators.Windows);        

return policy;

Criando uma política avançada

O código abaixo foi retirado de uma implementação interna do SDK para exemplificar a criação de uma política de assinatura com elementos avançados. A política em questão é a do padrão ICP-Brasil AD-RC v2.1.

// Criando política
var policy = new CadesPolicySpec();

// Definindo propriedades e atributos de criação da assinatura
policy.AttributeGeneration = new AttributeGenerationSpec() {
    IncludeFullPathReferenceInSigningCertificateAttribute = false,

    // Inclui a política nos atributos assinados (política explícita)
    IncludeSignaturePolicyIdentifier = true,
    SignaturePolicyQualifiers = CadesPolicySpec.SignaturePolicyQualifiers.Uri,

    SignatureTimestamp = GenerationRequirementLevels.Must,
    IncludeCompleteCertificateReferences = true,
    IncludeCompleteRevocationReferences = true,
    CadesCTimeStamp = GenerationRequirementLevels.Must,
    IncludeCertificateValues = true,
    IncludeRevocationValues = true,
};

// Definindo propriedades e presença de atributos para validação
policy.AttributeValidation = new AttributeValidationSpec() {
    SignaturePolicyIdentifier = ValidationRequirementLevels.Must,
    SigningTime = ValidationRequirementLevels.May,
    SignatureTimestamp = ValidationRequirementLevels.Must,
    CompleteCertificateReferences = ValidationRequirementLevels.Must,
    CompleteRevocationReferences = ValidationRequirementLevels.Must,
    CadesCTimeStamp = ValidationRequirementLevels.Must,
    CertificateValues = ValidationRequirementLevels.Must,
    RevocationValues = ValidationRequirementLevels.Must
};

// Algoritmos permitidos
policy.DigestAlgorithms.Add(DigestAlgorithm.SHA256);
policy.SignatureAlgorithms.Add(SignatureAlgorithm.RSAWithSHA256);

// Informações da política
policy.PolicyOid = "<OID of the policy>";
policy.PolicyUri = new Uri("<URI of the policy>");
policy.PolicyDigest = new DigestAlgorithmAndValue(DigestAlgorithm.SHA256, adrcSha256Digest);

// Árbitro para validação dos certificados
policy.AddRootTrustArbitrator(TrustArbitrators.PkiBrazil);

// Período válido para assinatura
policy.SigningPeriodStart = GetBrasilia0H(2012, 3, 6);
policy.SigningPeriodEnd = GetBrasilia24H(2023, 6, 21);


// Política do carimbo de tempo de assinatura
policy.SignatureTimestampPolicy = new CadesPolicySpec() {
    AttributeGeneration = new AttributeGenerationSpec() {
        IncludeCompleteCertificateReferences = true,
        IncludeCompleteRevocationReferences = true,
        IncludeCertificateValues = true,
        IncludeRevocationValues = true
    },
    AttributeValidation = new AttributeValidationSpec() {
        SignaturePolicyIdentifier = ValidationRequirementLevels.MustNot,
        SigningTime = ValidationRequirementLevels.MustNot,
        SignatureTimestamp = ValidationRequirementLevels.MustNot,
        CompleteCertificateReferences = ValidationRequirementLevels.Must,
        CompleteRevocationReferences = ValidationRequirementLevels.Must,
        CadesCTimeStamp = ValidationRequirementLevels.MustNot,
        CertificateValues = ValidationRequirementLevels.Must,
        RevocationValues = ValidationRequirementLevels.Must,
        ArchiveTimestamp = ValidationRequirementLevels.MustNot
    },
};        
policy.SignatureTimestampPolicy.DigestAlgorithms.Add(DigestAlgorithm.SHA256);
policy.SignatureTimestampPolicy.SignatureAlgorithms.Add(SignatureAlgorithm.RSAWithSHA256);
policy.SignatureTimestampPolicy.AddRootTrustArbitrator(TrustArbitrators.PkiBrazil);


// Política do carimbo de tempo de referências
policy.CadesCTimestampPolicy = new CadesPolicySpec() {        
    AttributeGeneration = new AttributeGenerationSpec() {
        IncludeCompleteCertificateReferences = true,
        IncludeCompleteRevocationReferences = true,
        IncludeCertificateValues = true,
        IncludeRevocationValues = true
    },
    AttributeValidation = new AttributeValidationSpec() {
        SignaturePolicyIdentifier = ValidationRequirementLevels.MustNot,
        SigningTime = ValidationRequirementLevels.MustNot,
        SignatureTimestamp = ValidationRequirementLevels.MustNot,
        CompleteCertificateReferences = ValidationRequirementLevels.Must,
        CompleteRevocationReferences = ValidationRequirementLevels.Must,
        CadesCTimeStamp = ValidationRequirementLevels.MustNot,
        CertificateValues = ValidationRequirementLevels.Must,
        RevocationValues = ValidationRequirementLevels.Must,
        ArchiveTimestamp = ValidationRequirementLevels.MustNot
    },
};
policy.CadesCTimestampPolicy.DigestAlgorithms.Add(DigestAlgorithm.SHA256);
policy.CadesCTimestampPolicy.SignatureAlgorithms.Add(SignatureAlgorithm.RSAWithSHA256);
policy.CadesCTimestampPolicy.AddRootTrustArbitrator(TrustArbitrators.PkiBrazil);

return policy;
Back to top Copyright © 2015-2020 Lacuna Software