mirror of
https://github.com/alam00000/bentopdf.git
synced 2026-11-08 00:50:59 +01:00
100 lines
6.4 KiB
Markdown
100 lines
6.4 KiB
Markdown
---
|
|
title: 서명 검증
|
|
description: PDF 파일의 디지털 서명을 검증합니다. 인증서 유효성, 서명자 신원, 문서 무결성, 신뢰 체인 상태를 확인합니다.
|
|
---
|
|
|
|
# 서명 검증
|
|
|
|
서명된 PDF를 업로드하면 이 도구가 모든 디지털 서명을 추출하고, 서명자를 식별하고, 인증서 유효성을 확인하며, 서명 이후 문서가 수정되었는지 알려 줍니다. 신뢰할 수 있는 인증서를 제공해 서명 체인을 검증할 수도 있습니다.
|
|
|
|
## 작동 방식
|
|
|
|
1. 서명된 PDF 파일을 업로드합니다. 검증이 자동으로 시작됩니다.
|
|
2. 도구가 요약을 표시합니다. 발견된 서명 수와 그중 유효한 서명 수가 나옵니다.
|
|
3. 각 서명마다 서명자 이름, 발급자, 날짜, 상태를 보여 주는 상세 카드가 표시됩니다.
|
|
4. 선택적으로 **신뢰할 수 있는 인증서**(.pem, .crt, .cer, .der)를 업로드하면 특정 신뢰 앵커를 기준으로 서명을 검증할 수 있습니다. 재검증은 자동으로 실행됩니다.
|
|
|
|
## 확인 항목
|
|
|
|
### 서명 파싱
|
|
|
|
도구는 PDF에서 PKCS#7 서명 객체를 추출하고 ASN.1 구조를 디코딩하여, 서명자의 X.509 인증서와 서명에 포함된 인증서 체인을 가져옵니다.
|
|
|
|
### 인증서 유효성
|
|
|
|
- **만료**: 인증서가 현재 유효 기간 내에 있습니까?
|
|
- **자체 서명 감지**: 인증서가 스스로를 발급했습니까?
|
|
- **신뢰 체인**: 신뢰할 수 있는 인증서가 제공된 경우, 서명자의 인증서가 그 인증서까지 이어집니까?
|
|
|
|
### 암호화 검증
|
|
|
|
- 도구는 서명의 `/ByteRange`가 포함하는 바이트를 재구성하고, 서명자가 선언한 알고리즘으로 해시한 뒤, 그 결과를 서명 내부의 `messageDigest` 속성과 비교합니다.
|
|
- 그런 다음 서명된 속성을 DER SET으로 다시 직렬화하고, 서명자 인증서의 공개 키로 서명을 검증합니다.
|
|
- **이 모든 검사를 통과한 경우에만 서명이 유효한 것으로 보고됩니다.** 서명 후 PDF 바이트가 수정되었거나 내장된 서명이 서명자의 키와 일치하지 않으면, 상태에 구체적인 사유와 함께 "유효하지 않음: 암호화 검증 실패"가 표시됩니다.
|
|
|
|
#### 지원하는 서명 알고리즘
|
|
|
|
| 알고리즘 | 검증 경로 |
|
|
| ----------------------- | ------------------------------------------------------------------------ |
|
|
| RSA (PKCS#1 v1.5) | node-forge `publicKey.verify`, Web Crypto 폴백 포함 |
|
|
| RSA-PSS (RSASSA-PSS) | Web Crypto `verify({name: 'RSA-PSS', saltLength})` |
|
|
| ECDSA P-256/P-384/P-521 | DER → IEEE P1363 서명 변환 후 Web Crypto `verify({name: 'ECDSA', hash})` |
|
|
|
|
서명이 이 목록에 없는 알고리즘(예: Ed25519, SM2 또는 특이한 다이제스트 OID를 쓰는 RSA)을 사용하면, 카드에 구체적인 OID나 사유와 함께 노란색으로 <strong>"미검증: 지원되지 않는 서명 알고리즘"</strong>이 표시됩니다. 이는 의도적인 3단계 구분입니다.
|
|
|
|
- **유효**: 서명자의 공개 키로 서명이 암호학적으로 검증되었습니다.
|
|
- **유효하지 않음**: 검증이 실행되었고 부정적인 결과가 나왔습니다(바이트 변경, 키 불일치).
|
|
- **미검증**: 이 알고리즘에 대해서는 도구가 검증을 실행할 수 없었습니다. 인증서 메타데이터는 계속 표시되지만, 서명을 "알 수 없음"으로 간주하고 Adobe Acrobat이나 `openssl cms -verify`로 검증해야 합니다.
|
|
|
|
### 안전하지 않은 다이제스트 알고리즘
|
|
|
|
- **MD5 또는 SHA-1**을 사용하는 서명은 유효하지 않은 것으로 거부되며 "안전하지 않은 다이제스트" 상태로 표시됩니다. 두 알고리즘 모두 충돌 공격이 공개되어 있으므로, SHA-1이나 MD5 해시에 대한 서명은 무결성을 보장하지 않습니다.
|
|
- SHA-224, SHA-256, SHA-384, SHA-512는 모두 허용됩니다.
|
|
|
|
### 문서 적용 범위
|
|
|
|
- **전체 적용**: 서명이 PDF 파일 전체를 포함하므로, 서명 후 추가되거나 변경된 바이트가 없습니다.
|
|
- **부분 적용**: 서명이 파일의 일부만 포함합니다. 서명 후 수정이 이루어졌음을 나타낼 수 있습니다(반드시 악의적인 것은 아니며, 증분 저장도 부분 적용을 만듭니다).
|
|
|
|
## 서명 상세 정보
|
|
|
|
각 서명 카드에는 다음이 표시됩니다.
|
|
|
|
- **서명자**: 서명자 인증서의 공통 이름, 조직, 이메일
|
|
- **발급자**: 서명자 인증서를 발급한 인증 기관
|
|
- **서명 일시**: 서명에 포함된 타임스탬프
|
|
- **유효 시작 / 유효 종료**: 인증서의 유효 기간
|
|
- **사유**: 문서에 서명한 이유 (제공된 경우)
|
|
- **위치**: 서명한 장소 (제공된 경우)
|
|
- **적용 범위 상태**: 전체 또는 부분
|
|
- **신뢰 배지**: 신뢰함 또는 신뢰 체인에 없음 (사용자 지정 인증서가 제공된 경우에만)
|
|
|
|
### 기술 세부 정보
|
|
|
|
기술 세부 정보 섹션을 펼치면 다음을 볼 수 있습니다.
|
|
|
|
- 서명자 인증서의 일련 번호
|
|
- 다이제스트 알고리즘 (SHA-256, SHA-512 등)
|
|
- 서명 알고리즘 (SHA-256을 사용하는 RSA, SHA-256을 사용하는 ECDSA 등)
|
|
- 유효하지 않은 서명의 오류 메시지
|
|
|
|
## 사용 사례
|
|
|
|
- 추가 서명하기 전에 디지털 서명된 계약서 검증
|
|
- 서명된 문서가 변조되지 않았는지 감사
|
|
- 문서 서명 이후 인증서가 만료되었는지 확인
|
|
- 조직의 루트 인증서를 기준으로 서명 검증
|
|
- 정부 또는 법률 문서의 서명 세부 정보 조회
|
|
|
|
## 팁
|
|
|
|
- 자체 서명 인증서라고 해서 서명이 유효하지 않은 것은 아닙니다. 신뢰할 수 있는 제3자를 통해 서명자의 신원을 확인할 수 없다는 뜻이며, 내부 문서에서는 흔한 일입니다.
|
|
- 부분 적용이 항상 변조를 의미하는 것은 아닙니다. 많은 PDF 워크플로가 증분 업데이트(예: 두 번째 서명)를 추가해 부분 적용이 생깁니다.
|
|
- 조직의 루트 또는 중간 인증서를 신뢰할 수 있는 인증서로 업로드하면 신뢰 체인 검증을 받을 수 있습니다.
|
|
|
|
## 관련 도구
|
|
|
|
- [디지털 서명](./digital-sign-pdf): 자신의 인증서로 PDF에 서명
|
|
- [PDF 평면화](./flatten-pdf): 서명 후 수정을 막기 위해 서명 전에 PDF를 평면화
|
|
- [메타데이터 제거](./remove-metadata): 서명을 적용하기 전에 PDF 정리
|