본문으로 건너뛰기

signtool sign 명령 참조

설명

본 문서에서 signtool는 sslTrus 원격 코드 서명 클라이언트 CLI를 의미하며, Microsoft Windows SDK에 포함된 signtool.exe가 아닙니다. Windows SDK 도구를 사용할 때는 Microsoft signtool.exe로 명시합니다.

signtool sign 로컬 파일에 대해 원격 서명을 직접 수행합니다.CLI는 로컬에서 서명할 데이터를 추출하고, 원격 서비스를 호출하여 개인 키 서명을 완료한 후, 서명, 타임스탬프 및 인증서 정보를 출력 파일에 다시 기록합니다.

signtool sign [flags]

도움말 및 버전 보기:

signtool --help
signtool --version

자격 증명 구성​

sign 명령은 다음 방법으로 액세스 자격 증명을 읽습니다:

자격 증명 항목매개변수환경 변수설명
Access Key--access-key / -kACCESS_KEY매개변수가 비어 있으면 자동으로 환경 변수를 읽습니다
Access Secret--access-secret / -sACCESS_SECRET매개변수가 비어 있으면 자동으로 환경 변수를 읽습니다
export ACCESS_KEY="your-access-key"
export ACCESS_SECRET="your-access-secret"

원격 서비스 주소는 --address 매개변수에 의해 제어되며 다음 값을 지원합니다:

매개변수 값실제 서비스 주소
nicsrshttps://ssl.face.nicsrs.com
빈 값, racent 또는 기타 임의의 값https://ssl.face.racent.com
주의
  • ACCESS_KEY와 ACCESS_SECRET는 실제로 읽는 환경 변수 이름이며, SIGNTOOL_ACCESS_KEY / SIGNTOOL_ACCESS_SECRET는 현재 CLI가 자동으로 읽지 않습니다.
  • Access Secret을 셸 히스토리나 스크립트 저장소에 기록하지 않는 것이 좋으며, 런타임에 주입되는 환경 변수나 안전한 CI 변수를 우선 사용하세요.

매개변수 설명​

매개변수약칭기본값설명
--address-a비어 있음원격 서비스 주소 식별자로, URL 투과 전달 매개변수가 아닙니다.
--access-key-k비어 있음비어 있으면 ACCESS_KEY을(를) 읽습니다.
--access-secret-s비어 있음비어 있으면 ACCESS_SECRET을(를) 읽습니다.
--cert-code-c비어 있음필수. 인증서 번호.
--file-f비어 있음필수. 서명할 파일 경로로, 디렉터리일 수 없습니다.
--out-o비어 있음출력 파일 경로. 비어 있고 덮어쓰기가 비활성화된 경우 기본 파일명이 자동 생성됩니다.
--override—false출력 파일이 원본 파일을 덮어씁니다.
--sha1-1falseSHA1 서명을 활성화합니다.
--sha2-2trueSHA2 서명을 활성화합니다.
--timestamp—autoSHA1 Authenticode 타임스탬프 주소. auto은(는) 기본 주소를 사용하며, 빈 문자열은 비활성화합니다.
--timestamp-rfc3161—autoSHA2 RFC3161 타임스탬프 주소. auto은(는) 기본 주소를 사용하며, 빈 문자열은 비활성화합니다.
--desc-n비어 있음서명에 기록할 프로그램 설명 텍스트.
--url-u비어 있음서명에 기록할 프로그램 정보 URL.
--nest—true기존 서명을 유지하고 중첩 서명을 추가합니다. false일 때 기존 서명을 제거합니다.
--verify—false서명 추가 시 인증서가 신뢰할 수 없으면 오류를 반환합니다.
--dry-run—false로컬 테스트 인증서로 서명을 생성하며, 원격 서명 인터페이스를 호출하지 않습니다.
부울 매개변수 형식

부울 매개변수는 参数=值 형식을 사용해야 하며, 공백으로 구분하는 것은 지원되지 않습니다:

  • 올바름: --sha1=true --sha2=false
  • 오류: --sha1 true --sha2 false

필수 규칙​

실행 전에 다음 조건을 검증하며, 하나라도 충족되지 않으면 오류를 출력하고 종료합니다:

  • --access-key 또는 ACCESS_KEY 가 반드시 존재해야 합니다.
  • --access-secret 또는 ACCESS_SECRET 가 반드시 존재해야 합니다.
  • --cert-code 가 반드시 존재해야 합니다.
  • --file 가 반드시 존재해야 하며, 디렉터리일 수 없습니다.
  • --sha1 와 --sha2 중 최소 하나는 활성화되어야 합니다.

출력 파일 규칙​

지정하지 않은 경우 --out:

--override출력 동작
false(기본값)입력 파일과 동일한 디렉터리에 출력하며, 파일 이름은 ${name}.signed.${yyyyMMdd.HHmmss}${ext}
true입력 파일을 직접 덮어씀

예시:

app.exe    → app.signed.20260611.153000.exe
driver.sys → driver.signed.20260611.153000.sys
주의

--override=true은(는) 원본 파일을 덮어쓰므로 실행 전에 백업했는지 확인하세요. 서명에 실패하면 CLI는 미완성된 출력 파일을 최대한 삭제합니다.


알고리즘 선택​

기본적으로 SHA2만 활성화됩니다:

signtool sign -c CERT_CODE -f app.exe

SHA1만 서명:

signtool sign -c CERT_CODE -f app.exe --sha1=true --sha2=false

SHA1과 SHA2 동시 서명:

signtool sign -c CERT_CODE -f app.exe --sha1=true --sha2=true
설명

SHA1과 SHA2를 동시에 활성화하면 프로세스는 먼저 SHA1을 처리한 다음 SHA2를 처리합니다. SHA1은 현재도 지원되지만, 새로운 서명 시나리오에서는 SHA2를 우선 사용합니다.


타임스탬프 구성​

--timestamp 및 --timestamp-rfc3161의 auto 값은 검증 단계에서 기본 주소로 대체됩니다.

매개변수auto 실제 값용도
--timestamphttp://timestamp.sectigo.comSHA1 Authenticode 타임스탬프
--timestamp-rfc3161http://timestamp.sectigo.comSHA2 RFC3161 타임스탬프

사용자 정의 SHA2 타임스탬프 서비스:

signtool sign \
-c CERT_CODE \
-f app.exe \
--timestamp-rfc3161=http://timestamp.acs.microsoft.com

SHA2 타임스탬프 비활성화:

signtool sign -c CERT_CODE -f app.exe --timestamp-rfc3161=

모든 타임스탬프 끄기:

signtool sign -c CERT_CODE -f app.exe --timestamp= --timestamp-rfc3161=
설명
  • http로 시작하는 타임스탬프 주소만 사용됩니다.
  • SHA1은 --timestamp를 우선 사용하며, HTTP 주소가 아닌 경우 --timestamp-rfc3161 사용을 시도합니다.
  • SHA2는 --timestamp-rfc3161를 사용합니다.
  • SHA2 타임스탬프 추가에 실패하면 Microsoft와 Sectigo 기본 주소 간에 자동으로 한 번 재시도합니다.
  • 타임스탬프 실패가 반드시 서명 실패로 이어지지는 않으며, CLI는 오류를 기록하고 타임스탬프가 없는 서명 결과를 유지합니다.

자주 사용하는 예시​

환경 변수를 사용하여 자격 증명을 제공하며, 기본 SHA2 서명을 사용합니다:

export ACCESS_KEY="your-access-key"
export ACCESS_SECRET="your-access-secret"

signtool sign \
--cert-code CERT_CODE \
--file app-unsigned.exe \
--out app-signed.exe

매개변수를 사용하여 자격 증명을 직접 제공:

signtool sign \
--access-key "your-access-key" \
--access-secret "your-access-secret" \
--cert-code CERT_CODE \
--file app-unsigned.exe \
--out app-signed.exe

NICSRS 주소 사용:

signtool sign \
--address nicsrs \
--cert-code CERT_CODE \
--file app-unsigned.exe \
--out app-signed.exe

프로그램 설명과 공식 웹사이트 URL을 작성합니다:

signtool sign \
-c CERT_CODE \
-f app-unsigned.exe \
-o app-signed.exe \
--desc "Example Application" \
--url "https://example.com"

중첩 서명 추가(기존 서명 유지):

signtool sign -c CERT_CODE -f app.exe --nest=true

원본 파일 덮어쓰기:

signtool sign -c CERT_CODE -f app.exe --override=true

dry-run 로컬 테스트 서명(원격 인터페이스 호출 없음):

signtool sign \
-k dummy \
-s dummy \
-c CERT_CODE \
-f app.exe \
--dry-run=true
설명

--dry-run 원격 서명 인터페이스를 호출하지 않지만, 여전히 로컬 파일을 읽고 쓰며 로컬 자체 서명 인증서를 호출합니다. 현재도 자격 증명 및 인증서 번호의 null 값 검증을 거치므로, 예시에서는 자리 표시자 자격 증명을 사용했습니다.


문제 해결 참조​

오류 메시지가능한 원인처리 권장 사항
access key is required...--access-key을(를) 전달하지 않았으며 ACCESS_KEY도 설정하지 않았습니다.환경 변수를 설정하거나 -k을(를) 사용하십시오.
access secret is required...--access-secret을(를) 전달하지 않았으며 ACCESS_SECRET도 설정하지 않았습니다.환경 변수를 설정하거나 -s을(를) 사용하십시오.
cert code is required...인증서 번호를 전달하지 않았습니다.-c CERT_CODE을(를) 사용하십시오.
sha1 or sha2 is required...SHA1과 SHA2를 동시에 비활성화했습니다.최소 하나의 알고리즘을 활성화하십시오.
file <path> is a directory--file이(가) 파일이 아닌 디렉터리를 가리킵니다.서명할 파일의 경로로 변경하십시오.
타임스탬프 실패했지만 서명 파일은 생성됨타임스탬프 서비스를 사용할 수 없거나 인증서 체인 검증에 실패했습니다.타임스탬프 URL을 확인하고 필요한 경우 --timestamp-rfc3161을(를) 교체하십시오.