본문으로 건너뛰기

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_KEYACCESS_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공백출력 파일 경로; 비어 있고 덮어쓰기가 활성화되지 않은 경우 기본 파일 이름이 자동으로 생성됩니다.
--overridefalse출력 파일이 원본 파일을 덮어씁니다.
--sha1-1falseSHA1 서명을 활성화합니다.
--sha2-2trueSHA2 서명을 활성화합니다.
--timestampautoSHA1 Authenticode 타임스탬프 주소입니다. auto 기본 주소를 사용하며, 빈 문자열을 입력하면 비활성화됩니다.
--timestamp-rfc3161autoSHA2 RFC3161 타임스탬프 주소입니다. auto 기본 주소를 사용하며, 빈 문자열을 입력하면 비활성화됩니다.
--desc-n비어 있음서명에 기록할 프로그램 설명 텍스트입니다.
--url-u공백서명에 기록할 프로그램 정보 URL입니다.
--nesttrue기존 서명을 유지하고 중첩 서명을 추가합니다. false인 경우 기존 서명을 제거합니다.
--verifyfalse서명 추가 시 인증서가 신뢰할 수 없으면 오류를 반환합니다.
--dry-runfalse로컬 테스트 인증서로 서명을 생성하며 원격 서명 인터페이스를 호출하지 않습니다.
부울 값 매개변수 형식

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

  • 올바름: --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-rfc3161auto 값은 검증 단계에서 기본 주소로 대체됩니다:

매개변수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는 원격 서명 인터페이스를 호출하지 않지만, 여전히 로컬 파일을 읽고 쓰며 로컬 자체 서명 인증서를 호출합니다. 현재 자격 증명과 인증서 번호에 대한 비어 있지 않음 검증을 거치므로 예시에서 자격 증명 자리 표시자를 사용했습니다.


문제 해결 참고

오류 메시지가능한 원인처리 권장 사항
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을(를) 교체하세요.