Cách ký nhiều file cùng lúc bằng SignTool
Cập nhật lần cuối: 28/08/2026
Hướng dẫn ký nhiều file bằng SignTool trên Windows, bao gồm ký hàng loạt EXE, DLL, MSI bằng Command Prompt và PowerShell, kèm timestamp và kiểm tra chữ ký sau khi ký.
Ký nhiều file bằng SignTool là gì?
Ký nhiều file bằng SignTool là quá trình sử dụng công cụ SignTool của Microsoft để ký số hàng loạt nhiều file thay vì thực hiện lệnh ký riêng cho từng file.
SignTool thường được sử dụng trong quy trình Code Signing để ký các file và thành phần phần mềm trên Windows như:
- EXE.
- DLL.
- MSI.
- MSP.
- OCX.
- CAB.
- SYS và các thành phần Windows Driver.
Khi một ứng dụng có hàng chục hoặc hàng trăm file cần ký, việc thực hiện thủ công từng file sẽ mất nhiều thời gian và dễ xảy ra sai sót. SignTool có thể kết hợp với Command Prompt, Batch Script hoặc PowerShell để tự động hóa quá trình ký nhiều file.
Ký hàng loạt bằng SignTool giúp chuẩn hóa quy trình Code Signing và giảm đáng kể thao tác thủ công khi phát hành phần mềm Windows.
Xem thêm: Code Signing là gì?
Vì sao cần ký nhiều file bằng SignTool?
Một ứng dụng Windows thường bao gồm nhiều thành phần khác nhau. Ngoài file EXE chính, phần mềm có thể chứa nhiều DLL, trình cập nhật, plugin hoặc các package MSI.
Ví dụ một thư mục release có thể chứa:
Release\
├── App.exe
├── Updater.exe
├── Core.dll
├── Network.dll
├── Security.dll
└── Installer.msi
Nếu ký từng file thủ công, quản trị viên hoặc developer phải thực hiện nhiều lệnh SignTool riêng biệt.
Khi số lượng file tăng lên, việc này có thể dẫn đến:
- Mất nhiều thời gian.
- Bỏ sót file chưa được ký.
- Sử dụng sai Code Signing Certificate.
- Thiếu timestamp trên một số file.
- Khó kiểm soát kết quả ký.
- Khó tích hợp vào quy trình build và release.
Sử dụng script để ký hàng loạt giúp quá trình này được thực hiện nhất quán hơn.
Chuẩn bị trước khi ký nhiều file
Trước khi thực hiện ký hàng loạt, cần chuẩn bị SignTool, Code Signing Certificate và timestamp server.
1. Cài đặt SignTool
SignTool được Microsoft cung cấp thông qua Windows SDK. Sau khi cài đặt Windows SDK, SignTool.exe thường nằm trong thư mục cài đặt SDK.
Có thể kiểm tra SignTool bằng Command Prompt:
signtool
Nếu hệ thống hiển thị thông tin trợ giúp của SignTool, công cụ đã có thể được sử dụng.
2. Chuẩn bị Code Signing Certificate
Cần có Code Signing Certificate hợp lệ và private key tương ứng để thực hiện ký.
Tùy loại chứng thư và mô hình triển khai, private key có thể được lưu trữ trên:
- Windows Certificate Store.
- Hardware Token.
- HSM.
- Hệ thống ký số từ xa hoặc cloud signing service.
Đối với certificate yêu cầu Hardware Token hoặc HSM, cần đảm bảo thiết bị ký đã được kết nối và phần mềm middleware tương ứng hoạt động bình thường.
3. Chuẩn bị Timestamp Server
Timestamp giúp ghi nhận thời điểm chữ ký được tạo. Khi ký hàng loạt, nên sử dụng timestamp cho toàn bộ file thay vì chỉ ký mà không có timestamp.
Với SignTool hiện đại, có thể sử dụng RFC 3161 timestamp thông qua tham số /tr và /td.
Cú pháp SignTool để ký một file
Trước khi ký nhiều file, cần nắm được cú pháp ký một file bằng SignTool.
signtool sign /fd SHA256 /a /tr <timestamp-url> /td SHA256 "file.exe"
Trong đó:
| Tham số | Ý nghĩa |
|---|---|
sign |
Yêu cầu SignTool thực hiện ký file. |
/fd SHA256 |
Sử dụng SHA-256 làm file digest algorithm. |
/a |
Tự động lựa chọn certificate phù hợp trong Certificate Store. |
/tr |
Chỉ định RFC 3161 timestamp server. |
/td SHA256 |
Chỉ định digest algorithm được sử dụng cho timestamp. |
Ví dụ:
signtool sign /fd SHA256 /a /tr http://timestamp.example.com /td SHA256 "App.exe"
Trong ví dụ trên, cần thay http://timestamp.example.com bằng timestamp server thực tế được CA hoặc nhà cung cấp Code Signing hỗ trợ.
Ký nhiều file EXE bằng Command Prompt
Cách đơn giản để ký nhiều file EXE trong cùng một thư mục là sử dụng vòng lặp for của Command Prompt.
Ví dụ:
for %f in (*.exe) do signtool sign /fd SHA256 /a /tr http://timestamp.example.com /td SHA256 "%f"
Command trên sẽ tìm tất cả file có phần mở rộng .exe trong thư mục hiện tại và lần lượt đưa từng file vào SignTool.
Ví dụ thư mục có:
App.exe
Updater.exe
Launcher.exe
SignTool sẽ thực hiện tương đương các lệnh:
signtool sign ... "App.exe"
signtool sign ... "Updater.exe"
signtool sign ... "Launcher.exe"
Cách này phù hợp khi cần ký nhanh một số lượng lớn file EXE trong cùng một thư mục.
Ký nhiều file DLL bằng SignTool
SignTool cũng có thể được sử dụng để ký hàng loạt DLL.
Ví dụ:
for %f in (*.dll) do signtool sign /fd SHA256 /a /tr http://timestamp.example.com /td SHA256 "%f"
Nếu các DLL nằm trong một thư mục cụ thể, có thể chỉ định đường dẫn:
for %f in (C:\Release\*.dll) do signtool sign /fd SHA256 /a /tr http://timestamp.example.com /td SHA256 "%f"
Việc đặt đường dẫn file trong dấu ngoặc kép giúp xử lý trường hợp đường dẫn hoặc tên file chứa khoảng trắng.
Ký nhiều file MSI bằng SignTool
MSI cũng có thể được ký hàng loạt bằng SignTool.
for %f in (*.msi) do signtool sign /fd SHA256 /a /tr http://timestamp.example.com /td SHA256 "%f"
Ví dụ một thư mục chứa nhiều bộ cài đặt:
Application-v1.msi
Application-v2.msi
Application-v3.msi
Command trên sẽ lần lượt ký từng package MSI.
Cần lưu ý rằng việc ký file MSI không đồng nghĩa với việc tất cả file EXE hoặc DLL bên trong MSI cũng được ký. Nếu các thành phần bên trong package cần có chữ ký riêng, chúng nên được ký trong quá trình build trước khi tạo package MSI.
Xem thêm: Cách ký file MSI bằng SignTool
Ký nhiều loại file bằng một Batch Script
Nếu cần ký EXE, DLL và MSI trong cùng một thư mục, có thể tạo Batch Script để thực hiện toàn bộ quá trình.
Ví dụ:
@echo off
set TIMESTAMP=http://timestamp.example.com
for %%f in (*.exe) do (
signtool sign /fd SHA256 /a /tr %TIMESTAMP% /td SHA256 "%%f"
)
for %%f in (*.dll) do (
signtool sign /fd SHA256 /a /tr %TIMESTAMP% /td SHA256 "%%f"
)
for %%f in (*.msi) do (
signtool sign /fd SHA256 /a /tr %TIMESTAMP% /td SHA256 "%%f"
)
echo Signing completed.
Script có thể được lưu thành file có phần mở rộng .bat và chạy từ thư mục chứa các file cần ký.
Có một điểm cần lưu ý về cú pháp:
Command Prompt:
for %f in (*.exe) do ...
Batch Script:
for %%f in (*.exe) do ...
Khi chạy trực tiếp trong Command Prompt, biến vòng lặp sử dụng một dấu %. Trong Batch Script, biến vòng lặp phải sử dụng hai dấu %%.
Ký file trong các thư mục con
Nếu các file cần ký nằm trong nhiều thư mục con, có thể sử dụng tùy chọn /r của lệnh for.
Ví dụ trong Batch Script:
for /r "C:\Release" %%f in (*.exe) do (
signtool sign /fd SHA256 /a /tr http://timestamp.example.com /td SHA256 "%%f"
)
Command trên sẽ tìm các file EXE trong C:\Release và toàn bộ thư mục con.
Ví dụ:
C:\Release\
├── App.exe
├── Core\
│ └── Core.exe
├── Plugins\
│ ├── PluginA.exe
│ └── PluginB.exe
└── Tools\
└── Updater.exe
Toàn bộ các file EXE trong cấu trúc trên sẽ được đưa vào quy trình ký.
Ký nhiều file bằng PowerShell
PowerShell cung cấp nhiều khả năng lọc và xử lý file hơn Command Prompt, do đó phù hợp với các quy trình ký hàng loạt phức tạp.
Ví dụ ký toàn bộ EXE trong một thư mục:
Get-ChildItem "C:\Release" -Filter *.exe | ForEach-Object {
signtool sign /fd SHA256 /a /tr http://timestamp.example.com /td SHA256 $_.FullName
}
Nếu muốn tìm file trong cả thư mục con:
Get-ChildItem "C:\Release" -Filter *.exe -Recurse | ForEach-Object {
signtool sign /fd SHA256 /a /tr http://timestamp.example.com /td SHA256 $_.FullName
}
PowerShell sẽ lấy đường dẫn đầy đủ của từng file thông qua thuộc tính FullName và truyền đường dẫn đó cho SignTool.
Ký nhiều loại file bằng PowerShell
Có thể sử dụng một script PowerShell để xử lý nhiều loại file trong cùng một lần chạy.
$extensions = "*.exe", "*.dll", "*.msi"
foreach ($extension in $extensions) {
Get-ChildItem "C:\Release" -Filter $extension -Recurse | ForEach-Object {
signtool sign /fd SHA256 /a /tr http://timestamp.example.com /td SHA256 $_.FullName
}
}
Script trên sẽ tìm lần lượt các file EXE, DLL và MSI trong thư mục C:\Release và các thư mục con.
Ký nhiều file bằng Certificate cụ thể
Tham số /a cho phép SignTool tự động lựa chọn certificate phù hợp. Tuy nhiên, nếu máy tính có nhiều Code Signing Certificate, việc chỉ định certificate cụ thể có thể giúp tránh chọn nhầm chứng thư.
Có thể chỉ định certificate thông qua SHA-1 thumbprint:
signtool sign /sha1 <certificate-thumbprint> /fd SHA256 /tr http://timestamp.example.com /td SHA256 "App.exe"
Đối với Batch Script:
@echo off
set CERT_THUMBPRINT=YOUR_CERTIFICATE_THUMBPRINT
set TIMESTAMP=http://timestamp.example.com
for %%f in (*.exe) do (
signtool sign /sha1 %CERT_THUMBPRINT% /fd SHA256 /tr %TIMESTAMP% /td SHA256 "%%f"
)
Cách này giúp quy trình ký sử dụng đúng certificate đã được xác định trước thay vì phụ thuộc vào cơ chế lựa chọn tự động của SignTool.
Ký nhiều file với Timestamp
Khi ký hàng loạt, timestamp nên được áp dụng nhất quán cho các file trong cùng một release.
Với RFC 3161 timestamp, SignTool sử dụng:
/tr <timestamp-url>
/td SHA256
Ví dụ:
signtool sign /fd SHA256 /a /tr http://timestamp.example.com /td SHA256 "App.exe"
Timestamp ghi nhận thời điểm chữ ký được tạo. Điều này có ý nghĩa quan trọng trong quá trình xác thực chữ ký sau khi Code Signing Certificate hết hạn, miễn là chữ ký và timestamp đáp ứng các yêu cầu xác thực tại thời điểm kiểm tra.
Kiểm tra chữ ký sau khi ký nhiều file
Sau khi ký hàng loạt, cần kiểm tra kết quả thay vì chỉ dựa vào việc script đã chạy đến cuối.
SignTool cung cấp lệnh verify để xác minh chữ ký:
signtool verify /pa "App.exe"
Có thể kiểm tra nhiều file EXE bằng Batch Script:
for %%f in (*.exe) do (
signtool verify /pa "%%f"
)
Để kiểm tra cả các thư mục con:
for /r %%f in (*.exe) do (
signtool verify /pa "%%f"
)
Nếu cần kiểm tra một file cụ thể với chính sách xác thực Windows Authenticode, có thể sử dụng:
signtool verify /pa /v "App.exe"
Tham số /v giúp hiển thị thêm thông tin trong quá trình xác minh.
Kiểm tra chữ ký bằng PowerShell
Ngoài SignTool, PowerShell có thể sử dụng Get-AuthenticodeSignature để kiểm tra trạng thái chữ ký.
Get-AuthenticodeSignature "C:\Release\App.exe"
Để kiểm tra nhiều file:
Get-ChildItem "C:\Release" -Filter *.exe -Recurse |
ForEach-Object {
Get-AuthenticodeSignature $_.FullName
}
Kết quả trả về có thể giúp xác định trạng thái của từng chữ ký, chẳng hạn như Valid, NotSigned hoặc trạng thái lỗi tương ứng.
Tạo Batch Script vừa ký vừa kiểm tra kết quả
Trong quy trình ký hàng loạt, nên kiểm tra mã thoát của SignTool để phát hiện file ký thất bại.
Ví dụ:
@echo off
set TIMESTAMP=http://timestamp.example.com
for %%f in (*.exe) do (
echo.
echo Signing: %%f
signtool sign /fd SHA256 /a /tr %TIMESTAMP% /td SHA256 "%%f"
if errorlevel 1 (
echo FAILED: %%f
) else (
echo SUCCESS: %%f
)
)
echo.
echo Signing process completed.
Script trên hiển thị trạng thái SUCCESS hoặc FAILED đối với từng file.
Cách này đặc biệt hữu ích khi thư mục có số lượng file lớn và cần xác định nhanh file nào chưa được ký thành công.
Xử lý lỗi khi ký nhiều file
Trong quá trình ký hàng loạt, một số file có thể thất bại trong khi các file khác vẫn được ký thành công.
Một số nguyên nhân thường gặp gồm:
- Không tìm thấy Code Signing Certificate.
- Certificate không có private key.
- Không truy cập được Hardware Token hoặc HSM.
- Certificate không phù hợp với mục đích Code Signing.
- Không thể truy cập timestamp server.
- File đang được một tiến trình khác sử dụng.
- Đường dẫn file không chính xác.
- SignTool không tương thích với môi trường hiện tại.
- Quyền truy cập không đủ để thực hiện thao tác ký.
Do đó, script ký hàng loạt nên kiểm tra kết quả của từng lệnh SignTool và ghi nhận những file bị lỗi.
Ký nhiều file trong quy trình CI/CD
SignTool có thể được tích hợp vào quy trình CI/CD để tự động ký các file sau khi build hoàn tất.
Một quy trình phát hành phần mềm có thể được tổ chức như sau:
Source Code
│
▼
Build Application
│
▼
Generate EXE / DLL / MSI
│
▼
Code Signing
│
├── Sign EXE
├── Sign DLL
└── Sign MSI
│
▼
Verify Signature
│
▼
Create Release Package
│
▼
Deploy / Distribute
Trong mô hình này, bước Code Signing được thực hiện sau khi quá trình build hoàn tất và trước khi package được phát hành.
Private key không nên được lưu trực tiếp trong source code hoặc commit vào repository. Với môi trường CI/CD, thông tin xác thực và khóa ký cần được bảo vệ bằng cơ chế quản lý secret hoặc giải pháp ký số phù hợp.
Xem thêm: Hướng dẫn sử dụng SignTool để ký file EXE
Có nên ký tất cả file trong thư mục không?
Không nên sử dụng script để ký tất cả file một cách không kiểm soát. Trước khi chạy quy trình ký hàng loạt, cần xác định rõ những loại file nào thực sự cần chữ ký số.
Ví dụ:
Release\
├── App.exe → Ký
├── Updater.exe → Ký
├── Core.dll → Ký
├── Config.json → Không cần ký
├── README.txt → Không cần ký
└── Installer.msi → Ký
Chỉ nên đưa các file thuộc phạm vi Code Signing vào quy trình. Điều này giúp giảm thời gian xử lý và tránh tạo ra các chữ ký không cần thiết.
Ký nhiều file có làm thay đổi file không?
Quá trình ký số sẽ thêm thông tin chữ ký vào file theo cơ chế Authenticode của định dạng file. Vì vậy, kích thước file có thể thay đổi sau khi ký.
Quan trọng hơn, nội dung file không nên tiếp tục thay đổi sau khi chữ ký đã được tạo. Nếu file bị thay đổi sau khi ký, chữ ký có thể không còn hợp lệ.
Do đó, Code Signing thường được thực hiện ở giai đoạn cuối của quy trình build:
Compile
│
▼
Build
│
▼
Package
│
▼
Code Signing
│
▼
Verify
│
▼
Release
Ký lại file đã được ký có được không?
File đã có chữ ký có thể được xử lý lại trong một số trường hợp, nhưng không nên mặc định ký lại mọi file đã được ký.
Trong quy trình tự động, nên kiểm tra trạng thái của file trước khi ký để tránh việc một file bị ký nhiều lần ngoài ý muốn.
Đặc biệt với hệ thống release có nhiều bước build và package, cần xác định rõ bước nào chịu trách nhiệm Code Signing để tránh tạo ra quy trình ký lặp.
Command Prompt hay PowerShell phù hợp hơn để ký nhiều file?
| Tiêu chí | Command Prompt | PowerShell |
|---|---|---|
| Ký file trong một thư mục | Phù hợp | Phù hợp |
| Ký số lượng file lớn | Phù hợp | Phù hợp |
| Tìm file trong thư mục con | Có thể thực hiện | Dễ thực hiện |
| Lọc file theo điều kiện | Hạn chế | Linh hoạt |
| Xử lý lỗi | Cơ bản | Linh hoạt hơn |
| Tự động hóa CI/CD | Có thể sử dụng | Phù hợp |
Nếu chỉ cần ký các file trong một thư mục cố định, Batch Script là lựa chọn đơn giản. Nếu cần lọc file, tìm kiếm trong nhiều thư mục, kiểm tra trạng thái chữ ký hoặc xử lý lỗi chi tiết, PowerShell thường phù hợp hơn.
Lưu ý khi ký hàng loạt bằng SignTool
- Xác định chính xác các file cần ký trước khi chạy script.
- Sử dụng đúng Code Signing Certificate.
- Sử dụng SHA-256 cho file digest.
- Sử dụng timestamp server phù hợp.
- Kiểm tra kết quả của từng file sau khi ký.
- Không thay đổi nội dung file sau khi ký.
- Bảo vệ private key và thiết bị ký.
- Không lưu private key hoặc thông tin nhạy cảm trực tiếp trong source code.
- Kiểm tra chữ ký trước khi đưa package vào production.
Xem thêm: SignTool là gì?
Kết luận
Ký nhiều file bằng SignTool là giải pháp hiệu quả để tự động hóa quy trình Code Signing trên Windows. Thay vì thực hiện từng lệnh riêng lẻ, có thể sử dụng Command Prompt, Batch Script hoặc PowerShell để ký hàng loạt các file EXE, DLL, MSI và những thành phần phần mềm cần thiết.
Để xây dựng quy trình ký ổn định, cần kết hợp Code Signing Certificate, SHA-256, timestamp và bước xác minh chữ ký sau khi ký. Khi số lượng file lớn hoặc quy trình phát hành được tự động hóa bằng CI/CD, việc sử dụng script giúp giảm thao tác thủ công, hạn chế bỏ sót file và tạo ra quy trình Code Signing nhất quán hơn.
Bạn vẫn chưa biết nên chọn…?
Đừng lo lắng, đội ngũ chuyên gia của chúng tôi luôn sẵn sàng lắng nghe nhu cầu và tư vấn giải pháp bảo mật phù hợp nhất cho website và doanh nghiệp của bạn. Hãy liên hệ ngay để được hỗ trợ nhanh chóng, chính xác và hiệu quả.