Hướng dẫn sử dụng SignTool để ký file EXE

Hướng dẫn sử dụng SignTool để ký file EXE

Cập nhật lần cuối: 17/08/2026

Hướng dẫn sử dụng SignTool để ký file EXE trên Windows bằng Code Signing Certificate, bao gồm chuẩn bị chứng chỉ, ký bằng PFX, Timestamp, xác minh chữ ký và xử lý các lỗi thường gặp.

SignTool là gì?

SignTool là công cụ dòng lệnh do Microsoft cung cấp để thực hiện các thao tác liên quan đến chữ ký số trên file Windows. Công cụ cho phép ký file, xác minh chữ ký và thêm Timestamp cho file đã được ký.

Đối với file EXE, SignTool thường được sử dụng trong quy trình Code Signing nhằm xác minh danh tính của nhà phát hành và bảo vệ tính toàn vẹn của file sau khi phát hành.

SignTool không cung cấp Code Signing Certificate. Công cụ chỉ sử dụng Certificate và Private Key đã có để thực hiện quá trình ký số.


Xem thêm: SignTool là gì?


Cần chuẩn bị gì trước khi sử dụng SignTool?

Trước khi ký file EXE, cần chuẩn bị các thành phần sau:

  • Máy tính Windows.
  • SignTool.
  • Code Signing Certificate.
  • Private Key tương ứng với Certificate.
  • File EXE cần ký.
  • Timestamp Server nếu muốn thêm Timestamp.

Code Signing Certificate có thể được lưu dưới dạng file PFX hoặc được cài đặt trong Windows Certificate Store.

Trong các hệ thống yêu cầu bảo mật cao, Private Key có thể được lưu trên USB Token, HSM hoặc sử dụng giải pháp Cloud Signing thay vì lưu trực tiếp trên máy tính.


Xem thêm: Code Signing là gì?


Cài đặt SignTool trên Windows

SignTool được phân phối cùng Windows SDK. Sau khi cài đặt SDK, file signtool.exe thường nằm trong thư mục Bin của Windows SDK.

Ví dụ:

C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64\signtool.exe

Tùy phiên bản SDK và kiến trúc hệ thống, đường dẫn có thể khác nhau.

Sau khi cài đặt, có thể mở Command Prompt hoặc PowerShell và chạy:

signtool

Nếu SignTool hoạt động bình thường, công cụ sẽ hiển thị cú pháp và danh sách các lệnh hỗ trợ.

Các lệnh chính của SignTool

Lệnh Chức năng
sign Ký số file.
verify Kiểm tra chữ ký số.
timestamp Thêm Timestamp cho file đã ký.
remove Xóa chữ ký khỏi file.
catdb Quản lý Catalog Database.

Trong quy trình ký file EXE thông thường, ba lệnh quan trọng nhất là sign, timestampverify.

Kiểm tra Code Signing Certificate

Trước khi thực hiện ký, cần xác định Certificate đang được lưu ở đâu và Private Key có sẵn hay không.

Nếu Certificate được cài đặt trong Windows Certificate Store, có thể mở:

certmgr.msc

Sau đó truy cập:

Personal
    └── Certificates

Certificate dùng để Code Signing cần có mục đích sử dụng phù hợp và phải có Private Key tương ứng.

Nếu chỉ có Public Key mà không có Private Key, SignTool không thể tạo chữ ký số.


Xem thêm: Public Key và Private Key là gì?


Ký file EXE bằng file PFX

Đây là phương pháp phổ biến khi Code Signing Certificate và Private Key được lưu trong một file PFX.

Ví dụ:

signtool sign /f MyCert.pfx /fd SHA256 MyApp.exe

Trong đó:

  • /f MyCert.pfx: chỉ định file Certificate.
  • /fd SHA256: sử dụng SHA-256 làm File Digest Algorithm.
  • MyApp.exe: file EXE cần ký.

SignTool hiện đại yêu cầu chỉ định File Digest Algorithm khi ký. SHA-256 là lựa chọn được Microsoft khuyến nghị.

Ký file EXE bằng PFX có mật khẩu

Nếu file PFX được bảo vệ bằng mật khẩu, sử dụng thêm tham số /p.

signtool sign /f MyCert.pfx /p YourPassword /fd SHA256 MyApp.exe

Trong đó:

  • /f: chỉ định file PFX.
  • /p: mật khẩu của file PFX.
  • /fd SHA256: sử dụng SHA-256.
  • MyApp.exe: file cần ký.

Không nên lưu mật khẩu Private Key dưới dạng plaintext trong source code, script hoặc repository. Trong môi trường Production nên sử dụng cơ chế quản lý Secret phù hợp.

Ký file EXE bằng Certificate Store

Nếu Certificate đã được cài đặt trong Windows Certificate Store, có thể yêu cầu SignTool tìm Certificate theo Subject Name.

signtool sign /n "My Company Certificate" /fd SHA256 MyApp.exe

Trong đó:

  • /n: Subject Name của Certificate.
  • /fd SHA256: sử dụng SHA-256.
  • MyApp.exe: file cần ký.

Nếu muốn SignTool tự động lựa chọn Certificate phù hợp, có thể sử dụng:

signtool sign /a /fd SHA256 MyApp.exe

Ký file EXE bằng Certificate Thumbprint

Khi máy tính có nhiều Certificate, có thể chỉ định Certificate cụ thể bằng SHA-1 Thumbprint.

signtool sign /sha1 CERTIFICATE_THUMBPRINT /fd SHA256 MyApp.exe

Cách này giúp hạn chế trường hợp SignTool chọn nhầm Certificate khi có nhiều Certificate cùng đáp ứng điều kiện tìm kiếm.

Thêm Timestamp khi ký file EXE

Timestamp là thành phần quan trọng trong Code Signing. Nó ghi nhận thời điểm chữ ký được tạo thông qua một Timestamp Authority.

Với RFC 3161 Timestamp Server, có thể sử dụng tham số /tr/td.

signtool sign ^
/f MyCert.pfx ^
/fd SHA256 ^
/tr http://timestamp.example.com ^
/td SHA256 ^
MyApp.exe

Trong đó:

  • /tr: địa chỉ RFC 3161 Timestamp Server.
  • /td SHA256: thuật toán digest sử dụng cho Timestamp.
  • /fd SHA256: thuật toán digest sử dụng cho chữ ký.

Có thể sử dụng Timestamp Server của nhà cung cấp chứng thư số, tùy theo dịch vụ mà doanh nghiệp đang sử dụng.

Timestamp giúp ghi nhận thời điểm chữ ký được tạo và hỗ trợ việc xác minh chữ ký sau khi Code Signing Certificate hết hạn, miễn là các điều kiện xác minh chữ ký và Timestamp vẫn đáp ứng yêu cầu.


Xem thêm: Timestamp là gì?


Lệnh hoàn chỉnh để ký file EXE

Một lệnh thường dùng trong quy trình Code Signing là:

signtool sign ^
/f MyCert.pfx ^
/p YourPassword ^
/fd SHA256 ^
/tr http://timestamp.example.com ^
/td SHA256 ^
MyApp.exe

Quy trình có thể hình dung như sau:

MyApp.exe
    │
    ▼
SignTool
    │
    ├── Code Signing Certificate
    ├── Private Key
    ├── SHA-256
    └── RFC 3161 Timestamp
    │
    ▼
Signed MyApp.exe

Ký file EXE bằng USB Token hoặc HSM

Nếu Private Key được lưu trong USB Token hoặc HSM, không nên xuất Private Key ra file PFX chỉ để sử dụng với SignTool.

Trong trường hợp này, Certificate có thể được cài đặt trong Certificate Store và SignTool sử dụng CSP hoặc KSP của thiết bị để thực hiện thao tác ký.

Ví dụ:

signtool sign /n "My Code Signing Certificate" /fd SHA256 MyApp.exe

Mô hình hoạt động:

Build Server
     │
     ▼
  SignTool
     │
     ▼
 CSP / KSP / Middleware
     │
     ▼
 USB Token / HSM
     │
     ├── Private Key
     │
     └── Signing Operation
     │
     ▼
 Signed EXE

Private Key được giữ trong thiết bị và không cần xuất trực tiếp ra máy tính dưới dạng file.


Xem thêm: HSM là gì?


Kiểm tra chữ ký của file EXE

Sau khi ký, nên kiểm tra lại chữ ký để xác nhận file đã được ký thành công.

Lệnh cơ bản:

signtool verify MyApp.exe

Đối với file ứng dụng thông thường, có thể sử dụng Default Authenticode Verification Policy:

signtool verify /pa MyApp.exe

Để hiển thị thông tin chi tiết:

signtool verify /pa /v MyApp.exe

Thông tin trả về có thể giúp kiểm tra Certificate, Publisher, Certificate Chain và trạng thái xác minh chữ ký.

Kiểm tra chữ ký bằng giao diện Windows

Ngoài SignTool, có thể kiểm tra trực tiếp bằng Windows Explorer.

Right-click MyApp.exe
       │
       ▼
Properties
       │
       ▼
Digital Signatures
       │
       ▼
Chọn Signature
       │
       ▼
Details

Tại đây có thể kiểm tra Publisher, trạng thái chữ ký và thông tin Certificate.

Kiểm tra Timestamp sau khi ký

Nếu file đã được Timestamp, thông tin Timestamp có thể được xem trong phần Digital Signatures của Windows.

Cũng có thể sử dụng:

signtool verify /pa /v MyApp.exe

Khi kiểm tra Production Build, nên xác nhận cả chữ ký và Timestamp thay vì chỉ kiểm tra việc file có chữ ký.

Có thể thêm Timestamp sau khi đã ký không?

Có. SignTool hỗ trợ thêm Timestamp cho file đã được ký.

Ví dụ với RFC 3161:

signtool timestamp ^
/tr http://timestamp.example.com ^
/td SHA256 ^
MyApp.exe

File phải được ký trước khi thực hiện thao tác Timestamp.

SignTool có thể ký nhiều file EXE cùng lúc không?

Có. SignTool cho phép chỉ định nhiều file trong cùng một lệnh.

Ví dụ:

signtool sign ^
/f MyCert.pfx ^
/fd SHA256 ^
/tr http://timestamp.example.com ^
/td SHA256 ^
App.exe ^
Installer.exe ^
Updater.exe

Cách này có thể hữu ích khi một bộ phần mềm chứa nhiều file thực thi cần được ký.

Quy trình ký file EXE trong Production

Đối với phần mềm phát hành cho người dùng, quy trình Code Signing nên được thực hiện sau khi Build và kiểm thử hoàn tất.

Source Code
    │
    ▼
Build
    │
    ▼
EXE
    │
    ▼
Testing
    │
    ▼
Package
    │
    ▼
Code Signing
    │
    ▼
Timestamp
    │
    ▼
Verify Signature
    │
    ▼
Release

Sau khi ký, không nên chỉnh sửa nội dung của file EXE. Nếu file bị thay đổi sau khi ký, chữ ký có thể không còn hợp lệ.

Một số lỗi thường gặp khi sử dụng SignTool

Lỗi Nguyên nhân có thể xảy ra
No certificates were found Không tìm thấy Certificate phù hợp.
No private key is available Certificate không có Private Key hoặc SignTool không truy cập được Private Key.
The system cannot find the file specified Sai đường dẫn hoặc tên file.
SignTool Error: No certificates were found that met all the given criteria Certificate không đáp ứng các điều kiện được chỉ định.
Timestamp failed Không kết nối được Timestamp Server hoặc Timestamp Server trả về lỗi.
Invalid provider type specified CSP, KSP hoặc Middleware của thiết bị ký chưa được cấu hình đúng.

Lỗi thiếu /fd SHA256 khi ký

Một số phiên bản SignTool hiện đại yêu cầu chỉ định File Digest Algorithm.

Nếu sử dụng:

signtool sign /f MyCert.pfx MyApp.exe

có thể nhận được cảnh báo hoặc lỗi liên quan đến việc chưa chỉ định /fd.

Nên sử dụng:

signtool sign /f MyCert.pfx /fd SHA256 MyApp.exe

Tương tự, khi sử dụng RFC 3161 Timestamp cần chỉ định /td:

/tr http://timestamp.example.com /td SHA256

SignTool ký thành công nhưng SmartScreen vẫn cảnh báo

Việc SignTool báo ký thành công không có nghĩa file EXE chắc chắn sẽ không xuất hiện cảnh báo Microsoft Defender SmartScreen.

Code Signing giúp xác minh Publisher và tính toàn vẹn của file, trong khi SmartScreen còn sử dụng các tín hiệu Reputation và những thông tin bảo mật khác để đánh giá ứng dụng.

Do đó, một ứng dụng mới phát hành vẫn có thể xuất hiện cảnh báo ngay cả khi chữ ký số hoàn toàn hợp lệ.


Xem thêm: Vì sao SmartScreen vẫn cảnh báo sau khi ký số?


Những lưu ý khi ký file EXE bằng SignTool

  • Sử dụng Code Signing Certificate hợp lệ.
  • Sử dụng SHA-256 cho File Digest.
  • Nên sử dụng RFC 3161 Timestamp.
  • Bảo vệ Private Key khỏi việc sao chép trái phép.
  • Không lưu mật khẩu PFX trực tiếp trong source code.
  • Không chỉnh sửa file EXE sau khi ký.
  • Luôn Verify chữ ký sau khi ký.
  • Với môi trường Production, nên cân nhắc USB Token, HSM hoặc Cloud Signing để bảo vệ Private Key.

Kết luận

SignTool là công cụ quan trọng trong quy trình Code Signing trên Windows, cho phép nhà phát triển ký số file EXE bằng Code Signing Certificate, thêm Timestamp và xác minh chữ ký sau khi hoàn tất.

Với trường hợp đơn giản, có thể sử dụng Certificate và Private Key được lưu trong file PFX. Nếu Private Key được bảo vệ bằng USB Token hoặc HSM, SignTool có thể sử dụng Certificate Store cùng CSP hoặc KSP tương ứng để thực hiện thao tác ký mà không cần xuất Private Key ra file.

Một quy trình ký EXE hoàn chỉnh nên bao gồm Code Signing, SHA-256, RFC 3161 Timestamp và Verify. Đồng thời, cần nhớ rằng việc ký số thành công không đảm bảo ứng dụng sẽ luôn vượt qua Microsoft Defender SmartScreen.

Bài viết mới nhất

Timestamp Server là gì? Cách hoạt động và vai trò trong Code Signing Code Signing Certificate và SSL Certificate khác nhau như thế nào? Điều gì xảy ra khi Code Signing Certificate bị thu hồi? Điều gì xảy ra khi Code Signing Certificate hết hạn? Code Signing hoạt động như thế nào? Quy trình ký và xác minh chữ ký số

Có thể bạn quan tâm

Gọi điện
Zalo
Google Maps