이 페이지에는 자동 번역된 텍스트가 포함될 수 있습니다.
C# 및 VB.NET에서 USB 토큰과 HSM 장치를 사용하여 PDF에 서명하는 방법
신뢰할 수 있는 인증 기관은 더 이상 문서 서명 인증서용 개인 키 다운로드를 허용하지 않습니다. 대신 개인 키는 USB 토큰, 스마트 카드 또는 클라우드 기반 HSM과 같은 보안 하드웨어에 저장해야 합니다.
Docotic.Pdf 라이브러리를 사용하여 HSM 장치를 사용하여 .NET에서 PDF 문서에 서명할 수 있습니다. 이 문서에서는 Azure Key Vault, AWS KMS 및 PKCS#11 호환 하드웨어와의 통합에 대해 설명합니다.
9.7.18373 15,244건의 테스트 통과 총 NuGet 다운로드 5,976,723C# .NET PDF 라이브러리 다운로드 페이지에서 라이브러리와 무료 기간 한정 라이선스 키를 받으실 수 있습니다.
필수 조건
이 문서의 코드 샘플은 자체 서명된 인증서를 사용하여 PDF 문서에 서명합니다. 기본적으로 PDF 뷰어는 이러한 서명을 신뢰하지 않습니다. 자체 서명된 인증서는 테스트용으로만 사용해야 하며, 프로덕션 환경에서는 사용하지 마십시오. 신뢰할 수 있는 PDF 서명을 생성하려면 타사 인증 기관에서 발급한 문서 서명 인증서를 사용하십시오.
적합한 인증서를 받으세요
Adobe 승인 신뢰 목록(AATL)에 등록된 회사의 인증서를 사용하는 것이 좋습니다. Adobe Acrobat은 기본적으로 이러한 회사의 인증서를 신뢰하며 "인증서 유효성을 알 수 없음" 경고를 표시하지 않습니다.
EU(eIDAS) 호환 문서를 작성하려면 유럽 연합 신뢰 목록(EUTL)에 등록된 공급업체에서 발급한 공인 인증서를 사용해야 합니다.
.NET에서 인증서 사용 방법 알아보기
문서 서명 인증서를 주문하면 일반적으로 HSM 장치에 대한 액세스 권한을 받게 됩니다. 이는 물리적 USB 토큰이거나 클라우드 기반 HSM 솔루션일 수 있습니다.
그런 다음 이 HSM으로 데이터에 서명하는 방법을 배워야 합니다. 모든 암호화 제공업체가 다르기 때문에 이 부분이 가장 까다롭습니다. USB 토큰 또는 클라우드 API 설명서를 참조하세요.
이상적으로는 해당 .NET SDK를 찾아야 합니다. 또는 최소한 네이티브 SDK를 찾아 .NET에서 상호 운용성을 통해 사용하는 것이 좋습니다.
목표는 인증서를 사용하여 모든 바이트에 서명할 수 있는 C# 또는 VB.NET 코드를 얻는 것입니다.
외부 서명을 위한 PDF API
HSM 기기로 모든 바이트에 서명할 수 있게 되면 Docotic.Pdf를 사용하여 PDF 문서에 서명할 준비가 된 것입니다. 이를 위해 IPdfSigner 인터페이스를 구현하고 서명에 사용해야 합니다.
IPdfSigner 인터페이스 구현
IPdfSigner
는 두 개의 멤버를 선언합니다. SignatureAlgorithm
속성은 서명에 사용된 알고리즘을 반환합니다.
일반적으로 RSA 또는 ECDSA 알고리즘을 사용합니다.
Sign
메서드는 외부 서명 흐름의 핵심 부분입니다. Docotic.Pdf는 이 메서드에 PDF 문서 바이트의 다이제스트를
제공합니다. HSM 기기를 사용하여 이 다이제스트에 서명하고 디지털 서명 바이트를 반환해야 합니다. 여기서는 PKCS#7
객체를 반환해서는 안 됩니다. 암호화 서명만 생성하여 반환하면 됩니다.
Docotic.Pdf는 각 서명마다 Sign
메서드를 두 번 호출합니다. 첫 번째 호출은 서명에 필요한 공간을 계산하는 데
사용됩니다. 두 번째 호출은 문서에 실제로 서명하는 데 사용됩니다.
외부 서명을 위한 PdfSigningOptions 생성
PdfSigningOptions(IPdfSigner, X509Certificate2[])
생성자를
사용하여 IPdfSigner
구현으로 PDF 문서에 서명합니다. 인증서 체인을 가져와 두 번째 인수로 제공합니다. 최소
하나의 인증서가 필요하며, 서명 인증서가 먼저 와야 합니다.
퍼즐의 마지막 조각은 PdfSigningOptions.DigestAlgorithm
속성입니다. 이 속성의 값은
IPdfSigner.SignatureAlgorithm
및 IPdfSigner.Sign
구현과 일치해야 합니다.
일반적인 상황에서 외부 서명을 사용하여 PDF에 서명하는 방법을 살펴보겠습니다.
C#에서 PKCS#11 드라이버를 사용하여 PDF 문서에 서명하세요
암호화 USB 토큰 또는 스마트 카드에 PKCS#11 드라이버가 포함되어 있는 경우 .NET에서
Pkcs11Interop.X509Store 또는
Pkcs11Interop 라이브러리를 사용할 수 있습니다.
Pkcs11Interop
는 Atos CardOS 스마트 카드, YubiKey PIV, SmartCard-HSM, SafeNet ProtectServer HSM 및
기타 HSM과 호환됩니다.
PKCS#11 드라이버를 사용하여 PDF 문서에 서명 코드 샘플은 USB 토큰 또는 스마트 카드를 사용하여 PDF 문서에 서명하는 방법을 보여줍니다. 다음 줄을 사용자 지정해야 합니다.
string pkcsLibraryPath = @"C:\Program Files\SoftHSM2\lib\softhsm2-x64.dll";
ulong slotId = 1743347971;
string alias = "YOUR-ALIAS";
string certLabel = "YOUR-CERTIFICATE";
string pin = "YOUR-PIN";
var digestAlgorithm = PdfDigestAlgorithm.Sha512;
샘플 구성에서는 SoftHSM2를 USB 토큰 에뮬레이터로 사용합니다. 실제 애플리케이션에서는 SoftHSM2가 필요하지 않습니다. 대신 USB 토큰과 함께 제공되는 드라이버를 사용하세요.
Azure Key Vault를 사용하여 PDF 문서에 서명
Microsoft Azure Key Vault는 인증서와 키를 안전하게 저장합니다. 다음과 같은 준비가 필요합니다.
- Azure 계정을 만듭니다.
- Azure 사용자를 만듭니다.
- Key Vault를 만듭니다.
- 선택한 Azure 사용자에게 Key Vault에 대한 액세스를 허용합니다.
- Key Vault에 문서 서명 인증서를 추가합니다. 통합 인증 기관에서 인증서를 가져오기할 수 있습니다.
그런 다음 Azure.Security.KeyVault.Keys
NuGet 패키지를 사용하여 .NET에서 로그인합니다. Azure Key
Vault의 키로 서명하는 샘플 C# 코드는 다음과 같습니다.
var vaultUrl = new Uri("https://YOUR-VAULT.vault.azure.net/");
var credential = new DefaultAzureCredential();
var keyClient = new KeyClient(vaultUrl, credential);
KeyVaultKey key = keyClient.GetKey("YOUR-KEY");
var cryptoClient = new CryptographyClient(key.Id, credentials);
byte[] messageToSign = ..;
byte[] signature = cryptoClient.SignData(SignatureAlgorithm.RS512, messageToSign).Signature;
관련된 IPdfSigner
구현은 다음과 같습니다.
class AzureSigner : IPdfSigner
{
private readonly CryptographyClient m_client;
private readonly AzureSignatureAlgorithm m_signingAlgorithm;
public AzureSigner(CryptographyClient client, AzureSignatureAlgorithm signingAlgorithm)
{
m_client = client;
m_signingAlgorithm = signingAlgorithm;
}
public PdfSignatureAlgorithm SignatureAlgorithm
{
get
{
if (m_signingAlgorithm == AzureSignatureAlgorithm.RS256 ||
m_signingAlgorithm == AzureSignatureAlgorithm.RS384 ||
m_signingAlgorithm == AzureSignatureAlgorithm.RS512)
return PdfSignatureAlgorithm.Rsa;
throw new NotSupportedException($"Unsupported {nameof(SignatureAlgorithm)} value: {m_signingAlgorithm}");
}
}
public PdfDigestAlgorithm DigestAlgorithm
{
get
{
if (m_signingAlgorithm == AzureSignatureAlgorithm.RS256)
return PdfDigestAlgorithm.Sha256;
if (m_signingAlgorithm == AzureSignatureAlgorithm.RS384)
return PdfDigestAlgorithm.Sha384;
if (m_signingAlgorithm == AzureSignatureAlgorithm.RS512)
return PdfDigestAlgorithm.Sha512;
throw new NotSupportedException($"Unsupported {nameof(SignatureAlgorithm)} value: {m_signingAlgorithm}");
}
}
public byte[] Sign(byte[] message)
{
return m_client.SignData(m_signingAlgorithm, message).Signature;
}
}
마지막으로, 이 AzureSigner
클래스를 사용하여 PDF 문서에 서명합니다.
CryptographyClient cryptoClient = ..;
using X509Certificate2 cert = ..
var signer = new AzureSigner(cryptoClient, SignatureAlgorithm.RS512);
using var pdf = new PdfDocument();
PdfPage page = pdf.Pages[0];
PdfSignatureField field = page.AddSignatureField(50, 50, 200, 200);
var options = new PdfSigningOptions(signer, new[] { cert })
{
DigestAlgorithm = signer.DigestAlgorithm,
Field = field,
};
pdf.SignAndSave(options, ..);
GitHub에서 전체 Azure Key Vault를 사용하여 PDF 문서에 서명 코드 샘플을 살펴보세요.
AWS KMS를 사용하여 PDF 문서에 서명
AWS Key Management Service(KMS)는 암호화 키를 위한 또 다른 안전한 저장소입니다. 준비 단계는 Azure Key Vault와 동일합니다.
- AWS 계정을 생성합니다.
- IAM 사용자를 생성합니다.
- 서명 키를 추가합니다.
- 선택한 IAM 사용자의 키에 대한 액세스를 허용합니다.
AWS의 경우 .NET에서 AWSSDK.KeyManagementService
NuGet 패키지를 사용해야 합니다. PDF 서명 샘플 코드는
Azure 시나리오와 매우 유사합니다.
using var pdf = new PdfDocument();
PdfPage page = pdf.Pages[0];
PdfSignatureField field = page.AddSignatureField(50, 50, 200, 200);
var signingAlgorithm = SigningAlgorithmSpec.RSASSA_PSS_SHA_512;
var signer = new AwsSigner("arn:aws:kms:YOUR-id", signingAlgorithm)
var options = new PdfSigningOptions(signer, new[] { cert })
{
DigestAlgorithm = signer.DigestAlgorithm,
Field = field,
};
pdf.SignAndSave(options, ..);
class AwsSigner : IPdfSigner
{
private readonly string m_keyId;
private readonly SigningAlgorithmSpec m_signingAlgorithm;
public AwsSigner(string keyId, SigningAlgorithmSpec signingAlgorithm)
{
m_keyId = keyId;
m_signingAlgorithm = signingAlgorithm;
}
public PdfSignatureAlgorithm SignatureAlgorithm
{
get
{
if (m_signingAlgorithm == SigningAlgorithmSpec.RSASSA_PKCS1_V1_5_SHA_256 ||
m_signingAlgorithm == SigningAlgorithmSpec.RSASSA_PKCS1_V1_5_SHA_384 ||
m_signingAlgorithm == SigningAlgorithmSpec.RSASSA_PKCS1_V1_5_SHA_512)
return PdfSignatureAlgorithm.Rsa;
throw new NotSupportedException($"Unsupported {nameof(SigningAlgorithmSpec)} value: {m_signingAlgorithm}");
}
}
public PdfDigestAlgorithm DigestAlgorithm
{
get
{
string alg = m_signingAlgorithm.Value;
if (alg.EndsWith("256"))
return PdfDigestAlgorithm.Sha256;
if (alg.EndsWith("384"))
return PdfDigestAlgorithm.Sha384;
if (alg.EndsWith("512"))
return PdfDigestAlgorithm.Sha512;
throw new NotSupportedException($"Unsupported {nameof(SigningAlgorithmSpec)} value: {m_signingAlgorithm}");
}
}
public byte[] Sign(byte[] message)
{
using var kmsClient = new AmazonKeyManagementServiceClient();
using var stream = new MemoryStream(message);
var signRequest = new SignRequest()
{
SigningAlgorithm = m_signingAlgorithm,
KeyId = m_keyId,
MessageType = MessageType.RAW,
Message = stream,
};
SignResponse signResponse = kmsClient.SignAsync(signRequest).GetAwaiter().GetResult();
return signResponse.Signature.ToArray();
}
}
전체 AWS KMS를 사용하여 PDF 문서에 서명 코드 샘플은 GitHub에서도 확인할 수 있습니다.
결론
Docotic.Pdf 라이브러리를 활용하여 USB 토큰, 스마트 카드 또는 클라우드 기반 HSM을 사용하여 PDF 문서에
서명하세요. 이를 위해 C# 또는 VB.NET 코드로 IPdfSigner
인터페이스를 구현하세요.
GitHub에서 PDF 형식의 디지털 서명 코드 샘플을 다운로드하여 사용해 보세요. 추가 정보는 관련 문서를 참조하세요.
자주 묻는 질문
USB 토큰이나 스마트 카드를 사용하여 PDF에 서명하려면 어떻게 해야 하나요?
Docotic.Pdf 및 Pkcs11Interop .NET 라이브러리를 사용하여 토큰 또는 스마트 카드로 PDF에 서명할 수 있습니다. 자세한 내용은 C#에서 PKCS#11 드라이버를 사용하여 PDF 문서에 서명하세요 섹션을 참조하세요.
USB 토큰이나 스마트 카드로 SoftHSM을 어떻게 사용하나요?
SoftHSM은 실제 HSM 장치를 시뮬레이션합니다. USB 토큰이나 스마트 카드가 있는 경우 SoftHSM이 필요하지 않습니다. 대신 HSM 장치와 함께 제공되는 PKCS#11 드라이버를 사용하세요.
외부 서명으로 PDF 문서에 서명하려면 어떻게 해야 하나요?
Azure Key Vault를 사용하여 PDF 문서에 서명 및 AWS KMS를 사용하여 PDF 문서에 서명 섹션을 확인하세요. 다른 클라우드 기반 HSM을 사용한 외부 PDF 서명은 유사한 프로세스를 따릅니다.
.NET에서 Azure Key Vault를 어떻게 사용하나요?
Azure.Security.KeyVault.Keys
NuGet 패키지를 사용하세요. GitHub에서 Azure Key Vault를 사용하여 PDF 문서에 서명
코드 샘플을 사용해 보세요.