- 공유 링크 만들기
- X
- 이메일
- 기타 앱
이 글의 목적은 엑셀 VBA 디지털 서명(Sign) 관련 오류를 체계적으로 진단하고 해결하는 방법을 현업 기준으로 정리하여, 매크로 서명·배포·검증을 안전하고 재현성 있게 수행하도록 돕는 것이다.
1. 엑셀 VBA 디지털 서명의 동작 원리 이해
VBA 디지털 서명은 VBA 프로젝트(.xlsm, .xlam, .xls, .xla 등)의 코드에 인증서 기반 서명 값을 삽입하여, 코드 작성자 신원과 코드 무결성을 검증하는 메커니즘이다.
- 코드 무결성: 서명 이후 단 한 글자라도 코드가 수정되면 서명이 즉시 무효화된다.
- 신뢰 체인: 서명에 사용한 인증서가 신뢰할 수 있는 루트 인증서로부터 체인(루트→중간CA→개인 인증서)으로 검증되어야 한다.
- 시점 보장: 타임스탬프가 포함되면 인증서 만료 후에도 서명 당시 유효했음을 증명할 수 있다.
- 정책 적용: 엑셀 신뢰 센터 설정과 조직의 그룹정책에 따라 서명 매크로만 실행하도록 강제할 수 있다.
주의 : 서명은 보안 토큰이 아니라 신원 확인과 변경 감지를 위한 증거이다. 악성 코드도 유효한 인증서로 서명될 수 있으므로 추가 보안 통제가 필요하다.
2. 자주 발생하는 오류 유형과 원인
| 오류 메시지/증상 | 주요 원인 | 핵심 해결책 |
|---|---|---|
| “매크로에 대한 유효한 서명이 없습니다” | 코드 수정 후 재서명 미실시, 인증서 만료, 해시 알고리즘 비호환 | 코드 변경 후 즉시 재서명, 유효한 인증서 사용, SHA-256 서명 재시도 |
| “서명이 손상되었습니다” 또는 무효 표시 | VBA 프로젝트 일부가 변경됨, 내장 모듈 메타데이터 불일치 | 최근 변경 취소 또는 재서명, 서명 전 VBA 프로젝트 정리/압축 |
| “인증서를 신뢰할 수 없습니다” | 자체 서명(Self-signed) 인증서 미신뢰, 체인 불완전 | 신뢰할 수 있는 발급자 인증서 사용, 신뢰할 수 있는 게시자에 추가 |
| “인증서가 만료되었습니다” | 유효기간 경과, 타임스탬프 미포함 | 새 인증서로 재서명, 타임스탬프 포함 옵션 사용 |
| “서명할 수 없습니다” (VBE에서 서명 실패) | 개인키 없음, 인증서 권한 미일치, CSP/키 길이 문제 | 개인키 포함 인증서 설치, 서명용(Key Usage: Code Signing) 인증서 재발급 |
| “이 게시자는 차단됨” | 신뢰 센터의 게시자 차단 목록에 등록 | 신뢰 센터에서 게시자 제거 또는 신뢰 게시자에 다시 추가 |
| “서명되었으나 실행 차단” | 조직 정책이 내부 루트만 허용, EV 요구 | 조직 루트 체인으로 재서명, 정책에 맞춘 인증서 사용 |
3. 인증서 종류와 선택 기준
| 종류 | 특징 | 장점 | 적합한 용도 |
|---|---|---|---|
| SelfCert(자체 서명) | 로컬에서 SelfCert.exe로 생성, 체인 없음 | 즉시 발급, 비용 없음 | 개발·테스트, 개인 사용 |
| 조직 내부CA | 사내 PKI 발급, 도메인 신뢰 배포 | 관리 용이, 중앙 통제 | 사내 배포, 부서 자동 신뢰 |
| 공인 Code Signing | 공인 CA 발급, 체인 완전 | 외부 신뢰성, 배포 범용 | 대외 배포 애드인·템플릿 |
| EV Code Signing | 하드토큰/HSM 기반, 강화 검증 | 높은 신뢰, 정책 호환 우수 | 규모 있는 배포·규제 환경 |
주의 : 개인키가 없는 인증서는 서명에 사용할 수 없다. “개인키가 있음(Private Key)” 속성이 있는지 확인해야 한다.
4. 서명 절차: 실무 표준 작업순서(SOP)
4.1 개발 환경 준비
- Windows 사용자 스토어에 인증서(.pfx)와 개인키를 설치한다.
- 엑셀에서 파일 > 옵션 > 신뢰 센터 > 신뢰 센터 설정을 연다.
- 매크로 설정에서 조직 정책에 맞는 옵션을 선택한다(예: 디지털 서명된 매크로만 허용).
4.2 VBA 프로젝트 서명
- Alt+F11로 VBE(Visual Basic Editor)를 연다.
- 도구 > 디지털 서명 메뉴를 클릭한다.
- “선택”을 눌러 사용할 인증서를 지정한다.
- 확인을 눌러 서명을 완료한다.
- 파일을 저장하고 닫았다가 다시 열어 서명 상태를 확인한다.
4.3 자체 서명 인증서 만들기(SelfCert)
- Office 설치 폴더의 SelfCert.exe를 실행한다.
- 인증서 이름(예: Dev VBA Sign)을 입력 후 생성한다.
- VBE에서 4.2 절차로 선택하여 서명한다.
- 해당 인증서를 “신뢰할 수 있는 게시자”로 추가하여 경고를 최소화한다.
주의 : 자체 서명 인증서는 기본적으로 타 시스템에서 신뢰되지 않는다. 외부 배포에는 공인 인증서를 사용해야 한다.
5. 배포 전략: 신뢰와 자동 업데이트 유지
- 파일 형태: .xlam 애드인으로 배포하면 업데이트와 재서명이 용이하다.
- 서명 유지: 코드 변경 후 즉시 동일 인증서로 재서명한다.
- 타임스탬프: 가능하면 타임스탬프를 포함하여 만료 리스크를 줄인다.
- 게시자 신뢰: 초기 배포 시 사용자에게 “신뢰할 수 있는 게시자”로 추가하도록 안내한다.
- 조직 배포: 내부 루트 인증서·중간 인증서를 GPO로 배포하여 체인을 자동 신뢰한다.
6. 신뢰 센터와 그룹정책 점검 포인트
6.1 엑셀 신뢰 센터
- 매크로 설정: “알림 표시 후 제외”, “디지털 서명된 매크로만” 등 정책에 맞춰 설정한다.
- 신뢰할 수 있는 게시자: 배포 인증서를 추가하여 경고를 줄인다.
- 신뢰할 수 있는 위치: 내부 공유 폴더를 신뢰 위치로 등록하면 초기 배포 마찰을 낮춘다.
6.2 조직 그룹정책
- Office 매크로 정책: 서명 강제, 인터넷 위치 차단 여부 확인
- 인증서 배포: 루트 및 중간 CA 자동 배포, CRL/OCSP 접속 허용
- 암호화 표준: SHA-256 이상 요구, 약한 해시(SHA-1) 금지
주의 : 인터넷 차단 환경에서 CRL/OCSP 조회가 실패하면 서명이 신뢰되지 않을 수 있다. 오프라인 검증 정책 또는 내부 OCSP 프록시를 준비해야 한다.
7. 타임스탬프의 필요성과 실패 대응
타임스탬프는 “서명 당시 인증서가 유효했다”는 시점을 증명한다. 인증서 만료 후에도 서명은 유효로 해석될 수 있다. 타임스탬프가 빠지면 인증서 만료 시 서명도 사실상 신뢰되지 않는다.
- 권장: 모든 최종 배포 빌드에 타임스탬프 포함
- 네트워크: 타임스탬프 서버 접근 허용
- 장애: 타임스탬프 실패 시 배포 지연 또는 임시 내부 서버 사용
8. 문제 진단 체크리스트(현장용)
| # | 점검 항목 | 합격 기준 |
|---|---|---|
| 1 | 인증서에 개인키가 포함되어 있는가 | 개인키 있음 표기, 내보내기 불가 표시(보안설정) 확인 |
| 2 | 인증서 용도가 코드 서명인가 | Key Usage/Enhanced Key Usage에 Code Signing(OID 1.3.6.1.5.5.7.3.3) |
| 3 | SHA-256 이상의 서명인가 | 서명 알고리즘이 sha256RSA 이상 |
| 4 | 체인이 완전한가 | 루트/중간 CA 신뢰 스토어에 설치 |
| 5 | 타임스탬프가 있는가 | 서명 정보에 타임스탬프 존재 |
| 6 | 서명 후 코드 변경이 없었나 | 서명 직후 즉시 배포, 이후 변경 금지 |
| 7 | 조직 정책과 합치하는가 | “서명된 매크로만 허용” 환경에서 정상 실행 |
| 8 | 신뢰할 수 있는 게시자에 등록되었나 | 게시자 목록에 표시됨 |
| 9 | CRL/OCSP 접근 가능 여부 | 필요 시 네트워크 허용 또는 내부 서비스 제공 |
| 10 | 배포 경로가 신뢰 위치인가 | 신뢰 위치 또는 서명 강제 정책 충돌 없음 |
9. 실무 트러블슈팅 절차
- 증상 기록을 남긴다(오류 메시지, 스크린샷, 발생 시각, 사용자 계정).
- 파일 사본으로 테스트한다. 서명 무효화 위험을 피한다.
- 엑셀 신뢰 센터에서 매크로 정책과 게시자 신뢰 상태를 확인한다.
- Windows 인증서 관리자에서 체인·개인키·유효기간·해시 알고리즘을 확인한다.
- 타임스탬프 존재 여부를 확인한다. 없으면 재서명 시 포함한다.
- 서명 직후 파일을 저장하고 재열어 서명 유지 여부를 확인한다.
- 조직 정책과 네트워크(OCSP/CRL) 조건을 검증한다.
- 근본 원인 문서화 후 서명 파이프라인에 반영한다.
10. 자동화와 배포 팁
- 개발→테스트→운영 단계별 인증서 분리로 오배포를 줄인다.
- 버전 관리와 빌드 스크립트에서 “서명 단계”를 명시해 누락을 방지한다.
- 변경 이력 자동 삽입(빌드 번호·서명 시각)으로 감사 추적을 강화한다.
- 배포 전 샌드박스 VM에서 “신규 사용자 관점”으로 서명 신뢰를 검증한다.
11. 명령줄·스크립트 예시
다음 예시는 인증서 상태 확인과 배포 자동화 점검에 도움이 되는 명령 예시이다.
:: 인증서 스토어에 코드 서명 인증서 존재 여부 확인(PowerShell) Get-ChildItem Cert:\CurrentUser\My | Where-Object { $_.EnhancedKeyUsageList.FriendlyName -contains "Code Signing" } | Select-Object Subject, NotBefore, NotAfter, HasPrivateKey
:: 개인키 포함 여부 확인
Get-ChildItem Cert:\CurrentUser\My | Where-Object { $_.HasPrivateKey } |
Select-Object Subject, HasPrivateKey
:: 서명 후 파일의 디지털 서명 메타정보 확인(Windows)
certutil -dump "C:\Path\YourAddin.xlam"
:: 신뢰할 수 있는 게시자 목록 확인(관리자용)
certmgr.msc
주의 : VBA 자체에는 인증서 검증 API가 노출되지 않는다. 배포 파이프라인 단계에서 외부 도구로 서명·검증을 완료한 뒤 사용자에게 전달해야 한다.
12. VBE에서 서명 유지가 풀리는 경우의 원인
- VBA 프로젝트 속성 변경, 모듈 추가·삭제, 참조(References) 수정으로 내부 해시가 바뀌는 경우가 있다.
- 외부 도구가 파일을 “최적화”하며 VBA 스트림을 재압축하면 서명이 파기된다.
- 공유 드라이브의 파일 동기화 과정에서 메타데이터 손실이 발생할 수 있다.
해결은 다음과 같다.
- 코드 냉동(코드 프리즈) 후 서명한다.
- 서명 직후 파일을 읽기 전용 배포로 전환한다.
- 빌드 스크립트에서 “최적화/압축” 단계를 서명 전으로 이동한다.
13. 보안 모범사례
- 개인키 보호: 하드웨어 토큰 또는 HSM 사용을 고려한다.
- 권한 분리: 개발자와 서명 권한을 분리하여 승인 절차를 강제한다.
- 감사: 배포마다 서명자, 시각, 해시를 로그로 남긴다.
- 만료 관리: 인증서 만료 60일 전 갱신·재서명 계획을 실행한다.
- 약한 해시 금지: SHA-1 사용 금지 정책을 유지한다.
14. 오류 시나리오별 솔루션 요약
| 시나리오 | 즉시 조치 | 근본 해결 |
|---|---|---|
| 코드 수정 후 서명 파기 | 재서명 및 재배포 | 서명 전 코드 프리즈, 자동화된 빌드로 재현성 확보 |
| 자체 서명 미신뢰 | 사용자 로컬에 게시자 신뢰 추가 | 내부CA 또는 공인 인증서 전환 |
| 인증서 만료 | 새 인증서로 즉시 재서명 | 타임스탬프 의무화, 만료 모니터링 |
| 체인 검증 실패 | 중간/루트 인증서 설치 | GPO로 체인 자동 배포 |
| 정책 상 서명만 허용 | 서명 검증 통과 확인 | 정책 문서와 빌드 파이프라인 정렬 |
15. 배포 체크리스트(인쇄용 요약)
[빌드/배포 체크] 1) 코드 프리즈 완료 2) SHA-256 이상으로 서명 3) 타임스탬프 포함 4) 체인 완전성 검증 5) 신뢰 게시자 등록 안내 동봉 6) 샌드박스에서 신규 사용자 시나리오 테스트 7) 변경 이력·해시·서명자 기록 보관 FAQ
서명 후 참조(References)만 바꿨는데도 서명이 무효화되는가?
참조 목록 변경은 VBA 프로젝트 메타데이터를 바꾸므로 서명이 무효화된다. 참조 변경을 포함한 모든 수정 후에는 재서명해야 한다.
서명된 파일이 어떤 PC에서는 경고 없이 열리고 다른 PC에서는 차단되는가?
신뢰 센터 정책, 인증서 체인, CRL/OCSP 접근성 차이 때문이다. 조직 표준 이미지와 동일한 인증서 체인·정책·네트워크 조건을 맞추면 일관되게 동작한다.
자체 서명으로 외부 고객에게 배포해도 되는가?
권장하지 않는다. 외부 환경에서는 자체 서명이 기본적으로 신뢰되지 않는다. 공인 코드서명 또는 EV 코드서명을 사용한다.
인증서가 곧 만료된다. 지금 배포한 파일은 어떻게 되나?
타임스탬프가 있으면 서명 당시 유효성을 근거로 계속 신뢰될 수 있다. 타임스탬프가 없으면 만료 시 실행이 제한될 가능성이 높다.
서명만 하면 매크로 보안이 충분한가?
충분하지 않다. 서명은 신원과 무결성 확인 수단이다. 별도의 악성 코드 탐지, 원본 보증 절차, 접근 권한 통제가 함께 필요하다.