Skip to content

Refatorar a recuperação da chave de assinatura em Assinador.cs#126

Open
lucasmoraes804 wants to merge 1 commit intoHercules-NET:masterfrom
lucasmoraes804:feature/certificado
Open

Refatorar a recuperação da chave de assinatura em Assinador.cs#126
lucasmoraes804 wants to merge 1 commit intoHercules-NET:masterfrom
lucasmoraes804:feature/certificado

Conversation

@lucasmoraes804
Copy link
Contributor

O processo de assinatura foi atualizado para usar a chave RSA do certificado digital. Alterar para forma "moderna", compatível com provedores CNG e CSP

O processo de assinatura foi atualizado para usar a chave RSA do certificado digital.
@lucasmoraes804
Copy link
Contributor Author

@danilobreda se poder analisar. Esse é um problema que está ocorrendo com certificados novos A3 principalmente. Como o provedores são os mais novos, não compatível com certificadoDigital.PrivateKey e ocasionava o erro System.Security.Cryptography.CryptographicException: Tipo de provedor inválido especificado.

@marcosgerene
Copy link
Collaborator

marcosgerene commented Dec 3, 2025

@lucasmoraes804 tive este mesmo problema que você relatou com A3

System.Security.Cryptography.CryptographicException: Tipo de provedor inválido especificado.

Meu medo nesse tipo de mudança é quebrar o legado. Neste tipo de cenário tendo a ser mais "defensivo". Analise, por favor, esta solução:

SignedXml docXml = new SignedXml(documento);

// Pega a chave RSA de forma "moderna", compatível com CNG e CSP
RSA rsa = certificadoDigital.GetRSAPrivateKey();

if (rsa == null)
{
    // Fallback para o método legado
    if (certificadoDigital.PrivateKey is RSA rsaLegacy)
    {
        rsa = rsaLegacy;
    }
    else
    {
        throw new Exception("O certificado não possui chave privada RSA compatível.");
    }
}

docXml.SigningKey = rsa;
docXml.SignedInfo.SignatureMethod = signatureMethod;

This comment was marked as resolved.

@lucasmoraes804
Copy link
Contributor Author

@marcosgerene essa alteração foi testado com a versão do .Net 4.6.2 em uma aplicação WPF. Mas caso queira posso testar essa alternativa que mencionou

@Ander89BR
Copy link
Contributor

Fiz um PR no seu fork @lucasmoraes804 adicionando o using que é obrigatório para compilação.
@marcosgerene creio que não seja necessário esta questão do legado

Meu medo nesse tipo de mudança é quebrar o legado. Neste tipo de cenário tendo a ser mais "defensivo". Analise, por favor, esta solução:

Acho que não seria o problema, pois o GetRSAPrivateKey() teoricamente é exatamente para pegar o PrivateKey, independente de qual tipo seja. Além de que o PrivateKey está obsoleto pela documentação da Microsoft, pedindo exatamente para usar o GetRSAPrivateKey().
Fonte: https://learn.microsoft.com/pt-br/dotnet/api/system.security.cryptography.x509certificates.x509certificate2.privatekey?view=net-6.0

Entrando o meu PR com o using que está faltando, creio que seja importante a implementação, pois muitos certificados estão com este problema.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants