Cách ký file MSI bằng SignTool
Cập nhật lần cuối: 22/08/2026
Hướng dẫn cách ký số file MSI bằng SignTool trên Windows với Code Signing Certificate, bao gồm chuẩn bị chứng thư, thực hiện ký, thêm Timestamp và kiểm tra chữ ký sau khi ký.
MSI là gì?
MSI (Microsoft Software Installer) là định dạng gói cài đặt được Windows sử dụng để phân phối và cài đặt phần mềm. File MSI có thể chứa các thành phần như ứng dụng, DLL, cấu hình và các tài nguyên cần thiết cho quá trình cài đặt.
Tương tự như file EXE và DLL, file MSI có thể được ký số bằng Authenticode để xác minh danh tính nhà phát hành và kiểm tra tính toàn vẹn của gói cài đặt.
Quy trình ký MSI thường bao gồm:
- Chuẩn bị file MSI đã hoàn tất quá trình build.
- Chuẩn bị Code Signing Certificate và Private Key.
- Sử dụng SignTool để ký file MSI.
- Thêm Timestamp vào chữ ký.
- Kiểm tra lại chữ ký sau khi ký.
Ký MSI không thay đổi nội dung các file bên trong gói cài đặt theo cách ký riêng từng file. Chữ ký Authenticode được thêm vào chính file MSI để xác minh tính toàn vẹn và nguồn gốc của gói cài đặt.
Xem thêm: SignTool là gì?
Vì sao cần ký file MSI?
MSI thường được sử dụng để phân phối phần mềm cho người dùng cuối hoặc triển khai trong môi trường doanh nghiệp. Nếu file MSI bị thay đổi sau khi phát hành, người dùng có thể tải hoặc cài đặt một gói không còn giống với phiên bản do nhà phát hành tạo ra.
Code Signing giúp cung cấp cơ chế để kiểm tra:
- Danh tính của nhà phát hành.
- Tính toàn vẹn của file MSI.
- Certificate được sử dụng để ký.
- Certificate Chain.
- Timestamp của chữ ký nếu có.
Nhờ đó, người dùng hoặc hệ thống có thể kiểm tra MSI trước khi thực hiện quá trình cài đặt.
Chuẩn bị trước khi ký MSI
Trước khi thực hiện Code Signing, cần chuẩn bị SignTool, Code Signing Certificate và file MSI cần ký.
1. Cài đặt SignTool
SignTool được cung cấp trong Windows SDK. Sau khi cài đặt, công cụ 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
Có thể kiểm tra SignTool bằng Command Prompt:
signtool
Nếu Windows không nhận diện lệnh, có thể sử dụng đường dẫn đầy đủ tới SignTool.exe hoặc thêm thư mục chứa SignTool vào biến môi trường PATH.
2. Chuẩn bị Code Signing Certificate
Để ký MSI, cần có Code Signing Certificate và Private Key tương ứng.
Certificate có thể được lưu trữ dưới nhiều hình thức:
- File PFX.
- Windows Certificate Store.
- USB Token.
- Hardware Security Module (HSM).
- Remote Signing hoặc Cloud Signing.
Trong ví dụ dưới đây, file PFX được sử dụng để minh họa cách ký MSI bằng SignTool.
3. Chuẩn bị file MSI
Giả sử file MSI cần ký có đường dẫn:
C:\Release\MyApplication.msi
File MSI nên được ký sau khi quá trình build và đóng gói đã hoàn tất.
Nếu MSI tiếp tục được thay đổi sau khi ký, chữ ký có thể không còn hợp lệ và cần thực hiện ký lại.
Ký MSI bằng file PFX
Cách đơn giản nhất để ký MSI bằng SignTool là sử dụng Code Signing Certificate được lưu trong file PFX.
1. Ký MSI bằng PFX
Sử dụng lệnh:
signtool sign /f "C:\Certificates\codesigning.pfx" "C:\Release\MyApplication.msi"
Trong đó:
- sign: thực hiện quá trình ký số.
- /f: chỉ định file chứa Certificate và Private Key.
- codesigning.pfx: file PFX chứa Code Signing Certificate.
- MyApplication.msi: file MSI cần ký.
2. Ký MSI bằng PFX có mật khẩu
Nếu file PFX được bảo vệ bằng mật khẩu, có thể sử dụng tùy chọn /p:
signtool sign /f "C:\Certificates\codesigning.pfx" /p "YourPassword" "C:\Release\MyApplication.msi"
Không nên lưu mật khẩu PFX trực tiếp trong source code hoặc script được commit vào hệ thống quản lý mã nguồn.
Trong môi trường production hoặc CI/CD, thông tin xác thực nên được lưu trong Secret Management hoặc sử dụng HSM, USB Token hoặc dịch vụ Remote/Cloud Signing để bảo vệ Private Key.
Ký MSI bằng SHA-256
Khi thực hiện Code Signing mới, nên sử dụng SHA-256 thay vì các thuật toán hash cũ như SHA-1.
SignTool cho phép chỉ định File Digest Algorithm bằng tùy chọn /fd:
signtool sign /fd SHA256 /f "C:\Certificates\codesigning.pfx" "C:\Release\MyApplication.msi"
Trong đó:
- /fd SHA256: sử dụng SHA-256 cho file digest.
- /f: chỉ định file PFX.
- MyApplication.msi: file MSI cần ký.
Việc chỉ định rõ /fd SHA256 cũng giúp tránh các lỗi hoặc cảnh báo liên quan đến File Digest Algorithm trên các phiên bản SignTool hiện đại.
Ký MSI và thêm Timestamp
Timestamp nên được thêm vào chữ ký khi phát hành MSI. Timestamp cung cấp bằng chứng về thời điểm chữ ký được tạo và giúp duy trì khả năng xác minh chữ ký trong những trường hợp Code Signing Certificate hết hạn sau đó.
Ví dụ sử dụng RFC 3161 Timestamp:
signtool sign /fd SHA256 /tr https://timestamp.digicert.com /td SHA256 /f "C:\Certificates\codesigning.pfx" "C:\Release\MyApplication.msi"
Trong lệnh trên:
- /fd SHA256: sử dụng SHA-256 cho file digest.
- /tr: chỉ định RFC 3161 Timestamp Server.
- /td SHA256: sử dụng SHA-256 cho Timestamp Digest.
- /f: chỉ định file PFX.
- MyApplication.msi: file MSI cần ký.
Timestamp Server thực tế có thể thay đổi tùy Certificate Authority hoặc dịch vụ Timestamp mà tổ chức sử dụng.
Xem thêm: Timestamp là gì?
Ký MSI bằng Certificate trong Windows Certificate Store
Nếu Code Signing Certificate đã được cài đặt vào Windows Certificate Store và Private Key có thể sử dụng được, không nhất thiết phải cung cấp file PFX khi ký.
Có thể sử dụng tùy chọn /a để SignTool tự động lựa chọn Certificate phù hợp:
signtool sign /fd SHA256 /a /tr https://timestamp.digicert.com /td SHA256 "C:\Release\MyApplication.msi"
Cách này phù hợp với máy ký chuyên dụng hoặc môi trường Certificate đã được quản lý tập trung.
1. Chọn Certificate theo Subject Name
signtool sign /fd SHA256 /n "Example Company Ltd" /tr https://timestamp.digicert.com /td SHA256 "C:\Release\MyApplication.msi"
Tùy chọn /n cho phép xác định Certificate dựa trên Subject Name.
2. Chọn Certificate theo Thumbprint
signtool sign /fd SHA256 /sha1 CERTIFICATE_THUMBPRINT /tr https://timestamp.digicert.com /td SHA256 "C:\Release\MyApplication.msi"
Sử dụng Thumbprint giúp xác định chính xác Certificate cần dùng trong trường hợp Certificate Store chứa nhiều Certificate.
Ký MSI bằng USB Token và HSM
Code Signing Certificate có thể được sử dụng với USB Token hoặc HSM để hạn chế khả năng Private Key bị sao chép khỏi thiết bị bảo mật.
Mô hình tổng quát:
Code Signing Certificate
│
▼
Windows Certificate Store
│
▼
SignTool
│
▼
CSP / KSP
│
▼
USB Token / HSM
│
▼
Private Key
│
▼
Digital Signature
│
▼
Signed MSI
Trong mô hình này, SignTool sử dụng Certificate và Signing Provider để yêu cầu thiết bị thực hiện thao tác ký. Private Key không nhất thiết phải được xuất thành file PFX trên máy tính.
Cấu hình cụ thể phụ thuộc vào loại USB Token, HSM, CSP/KSP và phần mềm middleware của nhà cung cấp.
Xem thêm: HSM là gì?
Kiểm tra chữ ký của file MSI
Sau khi ký, cần kiểm tra lại chữ ký để xác nhận MSI đã được ký thành công.
Lệnh cơ bản:
signtool verify /pa "C:\Release\MyApplication.msi"
Để hiển thị thông tin chi tiết:
signtool verify /v /pa "C:\Release\MyApplication.msi"
Kết quả xác minh có thể cung cấp thông tin về chữ ký, Certificate và Certificate Chain.
1. Kiểm tra tất cả chữ ký
Nếu file MSI có nhiều chữ ký, có thể sử dụng:
signtool verify /all /v /pa "C:\Release\MyApplication.msi"
Tùy chọn /all yêu cầu SignTool kiểm tra tất cả chữ ký có trong file.
2. Kiểm tra Timestamp
Có thể sử dụng /tw để yêu cầu SignTool cảnh báo nếu chữ ký không có Timestamp:
signtool verify /v /tw /pa "C:\Release\MyApplication.msi"
Điều này hữu ích trong quy trình Release khi muốn đảm bảo mọi MSI được phát hành đều có Timestamp.
Ký MSI có làm thay đổi file không?
Có.
Quá trình Authenticode Signing sẽ thêm thông tin chữ ký vào file MSI. Vì vậy, file MSI sau khi ký sẽ không còn có nội dung nhị phân hoàn toàn giống với phiên bản trước khi ký.
Điều này dẫn đến một nguyên tắc quan trọng:
MSI cần được ký sau khi hoàn tất tất cả các bước build, đóng gói và chỉnh sửa nội dung.
Nếu tiếp tục thay đổi MSI sau khi ký, chữ ký có thể không còn hợp lệ.
Quy trình nên được thực hiện theo thứ tự:
Source Code
│
▼
Build Application
│
▼
Generate MSI
│
▼
Test MSI
│
▼
Sign MSI
│
├── SHA-256
├── Code Signing Certificate
└── Timestamp
│
▼
Verify MSI
│
▼
Release
Có cần ký từng file EXE và DLL bên trong MSI không?
Không phải lúc nào cũng cần.
Chữ ký của MSI xác minh tính toàn vẹn và nguồn gốc của chính gói MSI. Trong khi đó, EXE, DLL hoặc các file thực thi bên trong MSI là những thành phần riêng biệt và có thể có chữ ký riêng.
Ví dụ một bộ cài đặt có thể có cấu trúc:
MyApplication.msi
│
├── MyApplication.exe
├── Core.dll
├── Graphics.dll
└── Configuration Files
Trong trường hợp này:
- MyApplication.msi có thể được ký để xác minh gói cài đặt.
- MyApplication.exe có thể được ký riêng.
- Core.dll có thể được ký riêng.
- Các file dữ liệu hoặc cấu hình thông thường không nhất thiết phải có Code Signing.
Việc có ký từng thành phần hay không phụ thuộc vào kiến trúc phần mềm và yêu cầu bảo mật của hệ thống.
Không nên ký MSI trước khi hoàn tất quá trình đóng gói
Một lỗi thường gặp là ký MSI trước rồi mới tiếp tục thay đổi nội dung hoặc thực hiện các bước xử lý khác đối với gói cài đặt.
Ví dụ không nên thực hiện:
Build MSI
│
▼
Sign MSI
│
▼
Modify MSI
│
▼
Release
Thay vào đó, nên hoàn tất mọi thay đổi trước khi ký:
Build MSI
│
▼
Modify / Configure
│
▼
Final MSI
│
▼
Sign
│
▼
Verify
│
▼
Release
Nếu MSI cần thay đổi sau khi đã ký, nên tạo lại hoặc cập nhật phiên bản cuối cùng rồi thực hiện ký lại.
Ký MSI trong quy trình CI/CD
SignTool có thể được tích hợp vào pipeline CI/CD để tự động ký MSI sau khi quá trình build hoàn tất.
Một quy trình cơ bản:
Build
│
▼
Generate MSI
│
▼
Automated Test
│
▼
SignTool Sign
│
├── Code Signing Certificate
├── SHA-256
└── Timestamp
│
▼
SignTool Verify
│
▼
Artifact
│
▼
Release
Việc Verify ngay sau khi ký giúp phát hiện lỗi Certificate, Timestamp hoặc Signature trước khi MSI được đưa vào hệ thống phân phối.
Trong môi trường CI/CD, không nên lưu file PFX và mật khẩu Private Key trực tiếp trong source code. Private Key nên được bảo vệ bằng Secret Management, HSM hoặc dịch vụ Signing phù hợp.
Ví dụ hoàn chỉnh ký và xác minh MSI
Giả sử có:
- MSI: C:\Release\MyApplication.msi
- Certificate: C:\Certificates\codesigning.pfx
- File Digest: SHA-256
- Timestamp: RFC 3161
Thực hiện ký:
signtool sign /fd SHA256 /f "C:\Certificates\codesigning.pfx" /tr https://timestamp.digicert.com /td SHA256 "C:\Release\MyApplication.msi"
Sau đó xác minh chữ ký:
signtool verify /v /pa "C:\Release\MyApplication.msi"
Kiểm tra thêm Timestamp:
signtool verify /v /tw /pa "C:\Release\MyApplication.msi"
Nếu cả quá trình Sign và Verify đều thành công, file MSI có thể được sử dụng làm artifact để phát hành.
Các lỗi thường gặp khi ký MSI bằng SignTool
1. Không tìm thấy Code Signing Certificate
Nguyên nhân thường gặp là file PFX không tồn tại, sai đường dẫn, sai mật khẩu hoặc Certificate không có Private Key tương ứng.
Cần kiểm tra:
- Đường dẫn tới file PFX.
- Mật khẩu PFX.
- Certificate có Private Key hay không.
- Certificate có mục đích Code Signing hay không.
- Certificate còn hiệu lực hay không.
2. SignTool yêu cầu chỉ định File Digest Algorithm
Với các phiên bản SignTool hiện đại, nên chỉ định rõ:
/fd SHA256
Ví dụ:
signtool sign /fd SHA256 /f "C:\Certificates\codesigning.pfx" "C:\Release\MyApplication.msi"
3. Timestamp Server không hoạt động
Nếu Timestamp Server không thể truy cập, quá trình ký có thể không hoàn thành.
Cần kiểm tra:
- Kết nối Internet.
- DNS.
- Firewall.
- Proxy.
- URL Timestamp Server.
Đối với RFC 3161, cần sử dụng:
/tr https://timestamp.example.com /td SHA256
4. Verify MSI thất bại
Nếu MSI bị thay đổi sau khi ký, chữ ký có thể không còn hợp lệ.
Có thể sử dụng chế độ kiểm tra chi tiết:
signtool verify /v /debug /pa "C:\Release\MyApplication.msi"
Kết quả chi tiết giúp xác định vấn đề liên quan đến Signature, Certificate Chain hoặc quá trình xác minh.
5. MSI có chữ ký nhưng Certificate không được tin cậy
Việc file MSI chứa chữ ký không đồng nghĩa với việc mọi hệ thống đều tin cậy Certificate đó.
Cần kiểm tra:
- Root CA.
- Intermediate CA.
- Certificate Chain.
- Validity Period.
- Revocation Status.
- Timestamp.
Ký MSI có giúp vượt qua SmartScreen không?
Không thể đảm bảo.
Code Signing giúp xác minh danh tính nhà phát hành và tính toàn vẹn của file, nhưng Microsoft Defender SmartScreen sử dụng nhiều tín hiệu khác để đánh giá mức độ tin cậy của phần mềm.
Do đó, một MSI được ký hợp lệ vẫn có thể xuất hiện cảnh báo trong một số trường hợp.
| Thành phần | Vai trò |
|---|---|
| Code Signing | Xác minh nguồn gốc và tính toàn vẹn của MSI |
| Code Signing Certificate | Xác định nhà phát hành theo Certificate |
| Timestamp | Ghi nhận thời điểm ký |
| SmartScreen | Đánh giá nhiều tín hiệu liên quan đến độ tin cậy của phần mềm |
Xem thêm: Application Reputation là gì?
Những lưu ý khi ký file MSI
- Ký MSI sau khi hoàn tất quá trình build và đóng gói.
- Sử dụng Code Signing Certificate phù hợp.
- Ưu tiên SHA-256 cho chữ ký mới.
- Sử dụng RFC 3161 Timestamp khi phát hành.
- Không chỉnh sửa MSI sau khi ký.
- Luôn Verify MSI sau khi ký.
- Bảo vệ Private Key và không lưu trực tiếp trong source code.
- Sử dụng HSM, USB Token hoặc Remote/Cloud Signing khi cần bảo vệ Private Key.
- Nếu các file EXE hoặc DLL bên trong MSI cần được xác minh độc lập, có thể ký riêng từng file.
Xem thêm: Code Signing Certificate là gì?
Kết luận
Ký MSI bằng SignTool là một bước quan trọng trong quá trình phát hành phần mềm Windows. SignTool cho phép sử dụng Code Signing Certificate để tạo chữ ký Authenticode trên file MSI, đồng thời hỗ trợ SHA-256, Timestamp và xác minh chữ ký.
Quy trình cơ bản gồm hoàn tất việc build MSI, ký bằng Code Signing Certificate, thêm Timestamp, sau đó sử dụng signtool verify để kiểm tra chữ ký trước khi phát hành.
Đối với môi trường doanh nghiệp hoặc CI/CD, Private Key cần được bảo vệ phù hợp bằng HSM, USB Token hoặc các giải pháp Signing chuyên dụng. Đồng thời, cần phân biệt chữ ký của MSI với chữ ký của các file EXE hoặc DLL bên trong gói cài đặt, vì mỗi file có thể được ký và xác minh độc lập.
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ả.