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