Como assinar PDFs digitalmente com C# usando HSM

This article was translated from English: Does it need improvement?
Translated
View the article in English

O IronPDF permite a assinatura segura de PDFs com assinatura digital usando Módulos de Segurança de Hardware (HSMs) por meio da API PKCS#11, onde as chaves privadas nunca saem do dispositivo físico, fornecendo segurança de nível bancário para aplicações de missão crítica que exigem assinaturas digitais à prova de adulteração.

Início rápido: Assinar um PDF com HSM em C#

  1. Instale o IronPDF via NuGet: Install-Package IronPdf
  2. Configure seu dispositivo HSM (ou use o SoftHSM para testes)
  3. Crie um UsbPkcs11HsmSigner com suas credenciais HSM:
    1. Instale IronPDF com o Gerenciador de Pacotes NuGet

      PM > Install-Package IronPdf
    2. Copie e execute este trecho de código.

      var hsmSigner = new UsbPkcs11HsmSigner(libraryPath, pin, tokenLabel, keyLabel);
    3. Implante para testar em seu ambiente de produção.

      Comece a usar IronPDF em seu projeto hoje com uma avaliação gratuita

      arrow pointer
  4. Gere seu PDF e assine-o:
    var pdf = renderer.RenderHtmlAsPdf("<h1>Document</h1>");
    pdf.SignAndSave("signed.pdf", hsmSigner);
    var pdf = renderer.RenderHtmlAsPdf("<h1>Document</h1>");
    pdf.SignAndSave("signed.pdf", hsmSigner);
    Dim pdf = renderer.RenderHtmlAsPdf("<h1>Document</h1>")
    pdf.SignAndSave("signed.pdf", hsmSigner)
    $vbLabelText   $csharpLabel
  5. Verifique a assinatura no seu visualizador de PDF.

Adicionar uma assinatura a um documento PDF é um requisito comum em muitas aplicações. No entanto, aplicações de missão crítica exigem maior segurança, onde a chave não pode ser adulterada. Uma operação de assinatura normal com um arquivo .pfx é como ter uma chave mestra em casa. O aplicativo carrega a chave na memória para assinar o documento. Se o computador for comprometido, a chave poderá ser roubada.

Uma alternativa mais segura é usar um Módulo de Segurança de Hardware (HSM). Com um HSM (como um token USB), a chave privada é gerada dentro do dispositivo e não pode sair dele.

Esse processo é semelhante a levar o documento a um banco. O aplicativo fornece um PIN, e o HSM leva o documento para o cofre, carimba-o com a chave e devolve o documento carimbado. A chave nunca sai do cofre. Isso proporciona segurança adicional, pois a chave não pode ser copiada ou roubada.

Como faço para assinar PDFs com um HSM?

A assinatura com um HSM normalmente requer um dispositivo físico, como um token USB, com o qual o aplicativo interage. O IronPDF é compatível com essas operações, pois tanto a biblioteca quanto os HSMs padrão usam PKCS#11 como uma API comum. Para fins demonstrativos, este guia utiliza um HSM simulado em vez de um físico.

Em ambientes de produção ou de teste em tempo real, você não deve usar esta simulação. Em vez disso, use seu HSM real. Para ambientes de produção, considere implementar recursos adicionais de segurança de PDF , como proteção por senha e permissões, juntamente com a assinatura HSM, para uma proteção abrangente de documentos.

Para executar esta simulação, você precisa primeiro instalar o SoftHSM , o OpenSSL e o OpenSC para gerar a chave e o token necessários. Para obter mais informações sobre como utilizar o SoftHSM, consulte o repositório público deles no GitHub .

Antes de implementar a assinatura HSM, certifique-se de ter instalado corretamente o IronPDF e configurado sua chave de licença para uso em produção.

Comece criando um PDF a partir de uma string HTML. No exemplo abaixo, definimos os caminhos e as credenciais para o nosso SoftHSM simulado. Isso inclui fornecer o caminho absoluto para o arquivo de biblioteca SoftHSM .dll e o arquivo de certificado .crt que você criou.

Em seguida, especifique o caminho de saída, que neste caso é output.pdf.

Defina três strings: hsmTokenLabel, hsmPin e hsmKeyLabel. Essas sequências diferenciam maiúsculas de minúsculas e devem corresponder exatamente às credenciais que você criou ao gerar o token e o certificado com o SoftHSM. Em seguida, inicialize o objeto UsbPkcs11HsmSigner, passando o caminho da biblioteca SoftHSM, o PIN, o rótulo do token e o rótulo da chave como parâmetros.

Além disso, crie um PdfSignatureImage para adicionar uma representação visual da assinatura ao documento. Finalmente, chame SignAndSave, que usa o hsmSigner para assinar o documento e salvá-lo no caminho de saída especificado.

Qual é a aparência do código de assinatura do HSM?

:path=/static-assets/pdf/content-code-examples/how-to/signing-with-hsm.cs
using IronPdf;
using IronPdf.Signing;
using IronSoftware.Pdfium.Signing;
using System.Drawing;

ChromePdfRenderer renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>Testing</h1>");

// Define Paths and Credentials
string softhsmLibraryPath = @"D:\SoftHSM2\lib\softhsm2-x64.dll";
// These MUST match what you created
string hsmTokenLabel = "MyTestToken";
string hsmPin = "123456";
string hsmKeyLabel = "my-key"; // The label for the key *inside* the token

// Create the HsmSigner object.
UsbPkcs11HsmSigner hsmSigner = new UsbPkcs11HsmSigner(
    softhsmLibraryPath,
    hsmPin,
    hsmTokenLabel,
    hsmKeyLabel
);

// Create the Signature Image
string signatureImagePath = "IronSoftware.png";
PdfSignatureImage sigImage = new PdfSignatureImage(signatureImagePath, 0, new Rectangle(50, 50, 150, 150));

// Sign PDF with HSM
pdf.SignAndSave("signedWithHSM.pdf", hsmSigner);
Imports IronPdf
Imports IronPdf.Signing
Imports IronSoftware.Pdfium.Signing
Imports System.Drawing

Dim renderer As New ChromePdfRenderer()
Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf("<h1>Testing</h1>")

' Define Paths and Credentials
Dim softhsmLibraryPath As String = "D:\SoftHSM2\lib\softhsm2-x64.dll"
' These MUST match what you created
Dim hsmTokenLabel As String = "MyTestToken"
Dim hsmPin As String = "123456"
Dim hsmKeyLabel As String = "my-key" ' The label for the key *inside* the token

' Create the HsmSigner object.
Dim hsmSigner As New UsbPkcs11HsmSigner(softhsmLibraryPath, hsmPin, hsmTokenLabel, hsmKeyLabel)

' Create the Signature Image
Dim signatureImagePath As String = "IronSoftware.png"
Dim sigImage As New PdfSignatureImage(signatureImagePath, 0, New Rectangle(50, 50, 150, 150))

' Sign PDF with HSM
pdf.SignAndSave("signedWithHSM.pdf", hsmSigner)
$vbLabelText   $csharpLabel

O UsbPkcs11HsmSigner também aceita dois parâmetros opcionais: digestAlgorithm e signingAlgorithm. Por padrão, eles são definidos como SHA256 e RSA.

Trabalhando com diferentes configurações de HSM

Diferentes dispositivos HSM podem exigir configurações específicas. Aqui está um exemplo que mostra como configurar o assinador com algoritmos personalizados e lidar com múltiplas assinaturas:

// Configure with custom algorithms
var customHsmSigner = new UsbPkcs11HsmSigner(
    hsmLibraryPath,
    hsmPin,
    hsmTokenLabel,
    hsmKeyLabel,
    digestAlgorithm: IronPdf.Signing.DigestAlgorithm.SHA512,
    signingAlgorithm: IronPdf.Signing.SigningAlgorithm.RSA
);

// Apply signature with custom location and reason
var signatureOptions = new SignatureOptions
{
    SignerName = "Corporate Signing Authority",
    Location = "Company Headquarters",
    Reason = "Contract Approval"
};

// Load existing PDF for signing
var existingPdf = PdfDocument.FromFile("contract.pdf");
existingPdf.SignAndSave("contract-signed.pdf", customHsmSigner, signatureOptions);
// Configure with custom algorithms
var customHsmSigner = new UsbPkcs11HsmSigner(
    hsmLibraryPath,
    hsmPin,
    hsmTokenLabel,
    hsmKeyLabel,
    digestAlgorithm: IronPdf.Signing.DigestAlgorithm.SHA512,
    signingAlgorithm: IronPdf.Signing.SigningAlgorithm.RSA
);

// Apply signature with custom location and reason
var signatureOptions = new SignatureOptions
{
    SignerName = "Corporate Signing Authority",
    Location = "Company Headquarters",
    Reason = "Contract Approval"
};

// Load existing PDF for signing
var existingPdf = PdfDocument.FromFile("contract.pdf");
existingPdf.SignAndSave("contract-signed.pdf", customHsmSigner, signatureOptions);
Imports IronPdf

' Configure with custom algorithms
Dim customHsmSigner As New UsbPkcs11HsmSigner(
    hsmLibraryPath,
    hsmPin,
    hsmTokenLabel,
    hsmKeyLabel,
    digestAlgorithm:=IronPdf.Signing.DigestAlgorithm.SHA512,
    signingAlgorithm:=IronPdf.Signing.SigningAlgorithm.RSA
)

' Apply signature with custom location and reason
Dim signatureOptions As New SignatureOptions With {
    .SignerName = "Corporate Signing Authority",
    .Location = "Company Headquarters",
    .Reason = "Contract Approval"
}

' Load existing PDF for signing
Dim existingPdf As PdfDocument = PdfDocument.FromFile("contract.pdf")
existingPdf.SignAndSave("contract-signed.pdf", customHsmSigner, signatureOptions)
$vbLabelText   $csharpLabel

Essa abordagem é particularmente útil ao trabalhar com exemplos de assinaturas digitais que exigem padrões de conformidade específicos ou quando é necessário adicionar metadados para rastrear detalhes da assinatura.

Quais são os problemas comuns de configuração de HSM?

Se você encontrar o erro mostrado abaixo ao executar o exemplo de código, siga estas etapas de solução de problemas para depurar e verificar sua configuração. Para obter assistência adicional com problemas de assinatura digital, consulte nosso guia de solução de problemas de assinaturas digitais .

O erro CKR_GENERAL_ERROR geralmente ocorre quando o programa não consegue encontrar o arquivo de configuração do SoftHSM ou quando o aplicativo .NET está sendo executado como um processo de 32 bits, enquanto a biblioteca SoftHSM é de 64 bits.

Erro de inicialização do HSM PKCS#11 exibindo CHR_GENERAL_ERROR na saída do console com rastreamento de pilha completo.

Alterar o alvo da plataforma

Uma causa comum para esse erro é a incompatibilidade de arquitetura. Seu aplicativo C# deve ser executado como um processo de 64 bits para ser compatível com a biblioteca SoftHSM de 64 bits (softhsm2-x64.dll). Nas propriedades do seu projeto no Visual Studio, altere a Plataforma de destino de 'Any CPU' ou 'x86' para x64 para garantir a compatibilidade.

Configuração de compilação do Visual Studio mostrando a plataforma de destino definida como arquitetura x64 com símbolos de compilação condicional.

Definindo a variável de ambiente

Outra causa comum é que o programa não consegue encontrar o arquivo .conf no SoftHSM. Você precisa informar à biblioteca onde procurar, definindo uma variável de ambiente em todo o sistema. Crie uma nova variável chamada SOFTHSM2_CONF e defina seu valor como o caminho completo do seu arquivo de configuração (por exemplo, D:\SoftHSM2\etc\softhsm2.conf). Lembre-se de reiniciar o Visual Studio após fazer as alterações.

Diálogo de variáveis ​​de sistema do Windows com a variável de ambiente SOFTISM2_CONF destacada, mostrando o caminho de configuração do HSM.

Além disso, você pode verificar se a variável foi encontrada adicionando esta linha:

Console.WriteLine($"Verifying variable: {Environment.GetEnvironmentVariable("SOFTHSM2_CONF")}");
Console.WriteLine($"Verifying variable: {Environment.GetEnvironmentVariable("SOFTHSM2_CONF")}");
Console.WriteLine($"Verifying variable: {Environment.GetEnvironmentVariable(""SOFTHSM2_CONF"")}")
$vbLabelText   $csharpLabel

Se a saída do console estiver em branco, o programa não conseguiu encontrar a variável de ambiente. Você precisa configurar isso, reiniciar o Visual Studio ou o computador e tentar novamente.

Melhores práticas para implantação de HSM em produção

Ao implementar PDFs assinados por HSM em ambientes de produção, considere estas medidas de segurança adicionais:

  1. Registro de auditoria : Implemente um registro abrangente para todas as operações do HSM para manter a conformidade e rastrear o acesso.
  2. Gerenciamento de Certificados : Atualize e rotacione os certificados regularmente, de acordo com as políticas de segurança da sua organização.
  3. Procedimentos de backup : Estabeleça procedimentos adequados de backup e recuperação para as configurações do HSM.
  4. Otimização de desempenho : Monitore o desempenho da assinatura e implemente estratégias de cache para certificados acessados ​​com frequência.

Essas práticas complementam o fluxo de trabalho padrão de assinatura de PDFs e garantem que sua infraestrutura de segurança de documentos permaneça robusta e em conformidade com os padrões do setor.

Perguntas frequentes

O que é a assinatura HSM e como ela difere da assinatura de PDFs comum?

A assinatura HSM (Módulo de Segurança de Hardware) com IronPDF oferece segurança de nível bancário, onde as chaves privadas nunca saem do dispositivo físico. Ao contrário da assinatura de arquivos .pfx comuns, onde as chaves são carregadas na memória e podem ser comprometidas em caso de ataque ao computador, a assinatura HSM mantém a chave privada protegida dentro do dispositivo de hardware, tornando impossível copiá-la ou roubá-la.

Como configuro a assinatura HSM em C# para PDFs?

Para configurar a assinatura HSM com o IronPDF, primeiro instale a biblioteca via NuGet com o comando 'Install-Package IronPDF'. Em seguida, crie um objeto UsbPkcs11HsmSigner com suas credenciais HSM, incluindo o caminho da biblioteca, o PIN, o rótulo do token e o rótulo da chave. Por fim, use o método SignAndSave para assinar seu documento PDF.

Quais são os benefícios de segurança de usar HSM para assinaturas em PDF?

A utilização de HSM com IronPDF proporciona assinaturas digitais invioláveis, ideais para aplicações de missão crítica. O processo é semelhante a levar documentos a um cofre de banco: a aplicação fornece um PIN, o HSM assina o documento internamente e devolve o documento assinado sem jamais expor a chave privada, garantindo que não possa ser copiado ou roubado.

Posso testar a assinatura HSM sem um dispositivo físico?

Sim, o IronPDF permite simular a assinatura de HSM usando bibliotecas como o SoftHSM para fins de desenvolvimento e teste. No entanto, para ambientes de produção, é necessário usar um dispositivo HSM físico real para garantir a segurança adequada.

Qual padrão de API o IronPDF usa para comunicação com HSM?

O IronPDF utiliza o padrão de API PKCS#11 para comunicação com HSMs, garantindo compatibilidade com dispositivos HSM padrão. Essa API comum permite que o IronPDF interaja perfeitamente com diversos tokens de hardware e módulos de segurança HSM.

Como posso verificar se meu PDF foi assinado com sucesso usando o HSM?

Após assinar um PDF com a funcionalidade HSM do IronPDF, você pode verificar a assinatura abrindo o PDF assinado em qualquer visualizador de PDF padrão. O visualizador exibirá as informações da assinatura digital e confirmará a autenticidade e integridade do documento.

Curtis Chau
Redator Técnico

Curtis Chau é bacharel em Ciência da Computação (Universidade Carleton) e se especializa em desenvolvimento front-end, com experiência em Node.js, TypeScript, JavaScript e React. Apaixonado por criar interfaces de usuário intuitivas e esteticamente agradáveis, Curtis gosta de trabalhar com frameworks modernos e criar manuais ...

Leia mais
Pronto para começar?
Nuget Downloads 18,318,263 | Versão: 2026.4 acaba de ser lançado
Still Scrolling Icon

Ainda está rolando a tela?

Quer provas rápidas? PM > Install-Package IronPdf
executar um exemplo Veja seu HTML se transformar em um PDF.