HSM을 사용하여 C#으로 PDF에 디지털 서명하는 방법

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

IronPDF는 PKCS#11 API를 통해 하드웨어 보안 모듈(HSM)을 사용하여 안전한 PDF 서명을 지원합니다. 개인 키는 물리적 장치를 벗어나지 않으므로 변조 방지 디지털 서명이 필요한 핵심 애플리케이션에 은행 수준의 보안을 제공합니다.

빠른 시작: C#에서 HSM을 사용하여 PDF에 서명하기

  1. NuGet을 통해 IronPDF를 설치하세요: Install-Package IronPdf
  2. HSM 장치를 구성하십시오(또는 SoftHSM을 사용하여 테스트하십시오).
  3. HSM 자격 증명을 사용하여 UsbPkcs11HsmSigner를 생성하십시오.

    Nuget Icon지금 바로 NuGet을 사용하여 PDF 만들기를 시작하세요.

    1. NuGet 패키지 관리자를 사용하여 IronPDF를 설치하세요.

      PM > Install-Package IronPdf

    2. 다음 코드 조각을 복사하여 실행하세요.

      var hsmSigner = new UsbPkcs11HsmSigner(libraryPath, pin, tokenLabel, keyLabel);
    3. 실제 운영 환경에서 테스트할 수 있도록 배포하세요.

      지금 바로 무료 체험판을 통해 프로젝트에서 IronPDF를 사용해 보세요.
      arrow pointer
  4. PDF 파일을 생성하고 서명하세요.
    var pdf = renderer.RenderHtmlAsPdf("<h1>Document</h1>");
    pdf.SignAndSave("signed.pdf", hsmSigner);
    var pdf = renderer.RenderHtmlAsPdf("<h1>Document</h1>");
    pdf.SignAndSave("signed.pdf", hsmSigner);
    $vbLabelText   $csharpLabel
  5. PDF 뷰어에서 서명을 확인하십시오.

PDF 문서에 서명을 추가하는 것은 많은 애플리케이션에서 흔히 요구되는 사항입니다. 하지만 핵심 임무 수행에 필수적인 애플리케이션은 키를 변조할 수 없는 더욱 높은 수준의 보안이 필요합니다. .pfx 파일을 사용한 일반적인 서명 작업은 마치 집에 마스터 키를 가지고 있는 것과 같습니다. 애플리케이션은 문서에 서명하기 위해 키를 메모리에 로드합니다. 컴퓨터가 해킹당하면 키가 도난당할 수 있습니다.

보다 안전한 대안은 하드웨어 보안 모듈(HSM)을 사용하는 것입니다. HSM(예: USB 토큰)의 경우 개인 키는 장치 내부에서 생성되며 장치 외부로 유출될 수 없습니다.

이 과정은 마치 서류를 은행에 가져가는 것과 같습니다. 애플리케이션이 PIN을 제공하면 HSM이 문서를 금고로 가져가 키로 도장을 찍고 도장이 찍힌 문서를 반환합니다. 열쇠는 절대 금고 밖으로 나가지 않는다. 이는 키를 복제하거나 도난당할 수 없으므로 추가적인 보안을 제공합니다.

HSM을 사용하여 PDF에 서명하는 방법은 무엇입니까?

HSM을 사용한 서명에는 일반적으로 애플리케이션이 상호 작용하는 USB 토큰과 같은 물리적 장치가 필요합니다. IronPDF는 이러한 작업과 호환됩니다. 라이브러리와 표준 HSM 모두 PKCS#11을 공통 API로 사용하기 때문입니다. 설명을 위해 이 가이드에서는 실제 HSM 대신 시뮬레이션된 HSM을 사용합니다.

실제 운영 환경이나 실시간 테스트 환경에서는 이 시뮬레이션을 사용해서는 안 됩니다. 그 대신 실제 HSM을 사용하십시오. 실제 운영 환경에서는 포괄적인 문서 보호를 위해 HSM 서명 기능과 더불어 암호 보호 및 권한 설정 과 같은 추가적인 PDF 보안 기능을 구현하는 것을 고려하십시오.

이 시뮬레이션을 실행하려면 먼저 SoftHSM , OpenSSLOpenSC를 설치하여 필요한 키와 토큰을 생성해야 합니다. SoftHSM 활용에 대한 자세한 내용은 공개 GitHub 저장소를 참조하십시오.

HSM 서명을 구현하기 전에 IronPDF가 제대로 설치 되었는지, 그리고 프로덕션 환경에서 사용할 수 있도록 라이선스 키가 구성되었는지 확인하십시오.

먼저 HTML 문자열에서 PDF를 생성합니다. 아래 예시에서는 시뮬레이션된 SoftHSM에 대한 경로와 자격 증명을 정의합니다. 여기에는 SoftHSM .dll 라이브러리 파일과 사용자가 생성한 .crt 인증서 파일의 절대 경로를 제공하는 것이 포함됩니다.

다음으로 출력 경로를 지정합니다. 이 예에서는 output.pdf입니다.

hsmTokenLabel, hsmPin, hsmKeyLabel 이렇게 세 개의 문자열을 정의합니다. 이 문자열은 대소문자를 구분하며 SoftHSM을 사용하여 토큰과 인증서를 생성할 때 만든 자격 증명과 정확히 일치해야 합니다. 그 후, SoftHSM 라이브러리 경로, PIN, 토큰 레이블 및 키 레이블을 매개변수로 전달하여 UsbPkcs11HsmSigner 객체를 초기화합니다.

또한, 서명을 시각적으로 문서에 추가하려면 PdfSignatureImage를 생성하십시오. 마지막으로, SignAndSave를 호출하면 hsmSigner를 사용하여 문서에 서명하고 지정된 출력 경로에 저장합니다.

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);
$vbLabelText   $csharpLabel

UsbPkcs11HsmSigner는 추가로 digestAlgorithmsigningAlgorithm의 두 가지 선택적 매개변수를 받습니다. 기본적으로 이들은 SHA256RSA로 설정됩니다.

다양한 HSM 구성 작업하기

HSM 장치마다 특정 구성이 필요할 수 있습니다. 다음은 사용자 지정 알고리즘으로 서명자를 구성하고 여러 서명을 처리하는 방법을 보여주는 예입니다.

// 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);
$vbLabelText   $csharpLabel

이 접근 방식은 특정 규정 준수 기준이 필요한 디지털 서명 사례를 다루거나 서명 세부 정보를 추적하기 위해 메타데이터를 추가 해야 할 때 특히 유용합니다.

HSM 구성에서 흔히 발생하는 문제는 무엇입니까?

코드 예제를 실행하는 동안 아래와 같은 오류가 발생하는 경우, 다음 문제 해결 단계를 따라 디버깅하고 구성을 확인하십시오. 디지털 서명 관련 문제에 대한 추가 지원이 필요하시면 디지털 서명 문제 해결 가이드를 참조하십시오.

이 CKR_GENERAL_ERROR 오류는 일반적으로 프로그램이 SoftHSM 구성 파일을 찾을 수 없거나 .NET 애플리케이션이 32비트 프로세스로 실행되는 반면 SoftHSM 라이브러리는 64비트인 경우에 발생합니다.

PKCS#11 HSM 초기화 오류 발생, 콘솔 출력에 CHR_GENERAL_ERROR 오류와 전체 스택 트레이스가 표시됩니다.

플랫폼 대상 변경

이 오류의 일반적인 원인은 아키텍처 불일치입니다. C# 애플리케이션은 64비트 SoftHSM 라이브러리(softhsm2-x64.dll)와 호환되도록 64비트 프로세스로 실행되어야 합니다. Visual Studio 프로젝트 속성에서 플랫폼 대상을 '모든 CPU' 또는 'x86'에서 x64로 변경하여 호환성을 확보하십시오.

Visual Studio 빌드 구성에서 플랫폼 대상이 x64 아키텍처로 설정되고 조건부 컴파일 기호가 표시되는 부분입니다.

환경 변수 설정

또 다른 일반적인 원인은 프로그램이 SoftHSM에서 .conf 파일을 찾을 수 없다는 것입니다. 라이브러리가 어디를 찾아야 하는지 시스템 전체 환경 변수를 설정하여 알려줘야 합니다. SOFTHSM2_CONF라는 이름의 새 변수를 생성하고 해당 변수의 값을 구성 파일의 전체 경로(예: D:\SoftHSM2\etc\softhsm2.conf)로 설정하십시오. 변경 사항을 적용한 후에는 Visual Studio를 다시 시작하는 것을 잊지 마세요.

HSM 구성 경로를 보여주는 SOFTISM2_CONF 환경 변수가 강조 표시된 Windows 시스템 변수 대화 상자

또한, 다음 줄을 추가하여 변수가 발견되었는지 확인할 수 있습니다.

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

콘솔 출력이 비어 있으면 프로그램이 환경 변수를 찾을 수 없는 것입니다. 설정을 변경한 후 Visual Studio 또는 컴퓨터를 다시 시작하고 다시 시도하십시오.

프로덕션 HSM 배포를 위한 모범 사례

HSM으로 서명된 PDF 파일을 운영 환경에 배포할 때는 다음과 같은 추가 보안 조치를 고려하십시오.

  1. 감사 로깅 : 규정 준수를 유지하고 접근 권한을 추적하기 위해 모든 HSM 작업에 대한 포괄적인 로깅을 구현합니다.
  2. 인증서 관리 : 조직의 보안 정책에 따라 인증서를 정기적으로 업데이트하고 교체하십시오.
  3. 백업 절차 : HSM 구성에 대한 적절한 백업 및 복구 절차를 수립하십시오.
  4. 성능 최적화 : 서명 성능을 모니터링하고 자주 액세스하는 인증서에 대한 캐싱 전략을 구현합니다.

이러한 관행은 표준 PDF 서명 워크플로를 보완하고 문서 보안 인프라가 견고하고 업계 표준을 준수하도록 보장합니다.

자주 묻는 질문

HSM 서명이란 무엇이며 일반 PDF 서명과 어떻게 다른가요?

IronPDF의 HSM(하드웨어 보안 모듈) 서명은 개인 키가 물리적 장치를 벗어나지 않도록 하여 은행 수준의 보안을 제공합니다. 일반적인 .pfx 파일 서명 방식은 키가 메모리에 로드되어 컴퓨터 공격 시 손상될 수 있지만, HSM 서명은 개인 키를 하드웨어 장치 내부에 안전하게 보관하여 복사 또는 탈취를 불가능하게 합니다.

C#에서 PDF 파일에 대한 HSM 서명을 어떻게 구성하나요?

IronPDF를 사용하여 HSM 서명을 구성하려면 먼저 NuGet 패키지 'Install-Package IronPdf'를 통해 라이브러리를 설치합니다. 그런 다음 라이브러리 경로, PIN, 토큰 레이블 및 키 레이블을 포함한 HSM 자격 증명을 사용하여 UsbPkcs11HsmSigner 객체를 생성합니다. 마지막으로 SignAndSave 메서드를 사용하여 PDF 문서에 서명합니다.

HSM을 PDF 서명에 사용하면 어떤 보안상의 이점이 있습니까?

IronPDF와 HSM을 함께 사용하면 미션 크리티컬 애플리케이션에 이상적인 위변조 방지 디지털 서명을 제공합니다. 이 과정은 마치 은행 금고에 문서를 맡기는 것과 같습니다. 애플리케이션이 PIN을 제공하면 HSM이 내부적으로 문서에 서명하고 개인 키를 노출하지 않고 서명된 문서를 반환합니다. 따라서 문서가 복사되거나 도난당할 염려가 없습니다.

물리적 장치 없이 HSM 서명을 테스트할 수 있나요?

네, IronPDF는 개발 및 테스트 목적으로 SoftHSM과 같은 라이브러리를 사용하여 HSM 서명을 시뮬레이션할 수 있습니다. 하지만 실제 운영 환경에서는 적절한 보안을 보장하기 위해 실제 HSM 장치를 사용해야 합니다.

IronPDF는 HSM 통신에 어떤 API 표준을 사용합니까?

IronPDF는 HSM 통신에 PKCS#11 API 표준을 사용하여 표준 HSM 장치와의 호환성을 보장합니다. 이 공통 API를 통해 IronPDF는 다양한 HSM 하드웨어 토큰 및 보안 모듈과 원활하게 상호 작용할 수 있습니다.

PDF 파일에 HSM 서명이 성공적으로 완료되었는지 어떻게 확인할 수 있나요?

IronPDF의 HSM 기능을 사용하여 PDF에 서명한 후에는 서명된 PDF 파일을 표준 PDF 뷰어에서 열어 서명을 확인할 수 있습니다. 뷰어는 디지털 서명 정보를 표시하고 문서의 진위성과 무결성을 확인해 줍니다.

커티스 차우
기술 문서 작성자

커티스 차우는 칼턴 대학교에서 컴퓨터 과학 학사 학위를 취득했으며, Node.js, TypeScript, JavaScript, React를 전문으로 하는 프론트엔드 개발자입니다. 직관적이고 미적으로 뛰어난 사용자 인터페이스를 만드는 데 열정을 가진 그는 최신 프레임워크를 활용하고, 잘 구성되고 시각적으로 매력적인 매뉴얼을 제작하는 것을 즐깁니다.

커티스는 개발 분야 외에도 사물 인터넷(IoT)에 깊은 관심을 가지고 있으며, 하드웨어와 소프트웨어를 통합하는 혁신적인 방법을 연구합니다. 여가 시간에는 게임을 즐기거나 디스코드 봇을 만들면서 기술에 대한 애정과 창의성을 결합합니다.

시작할 준비 되셨나요?
Nuget 다운로드 17,527,568 | 버전: 2026.2 방금 출시되었습니다