Hướng dẫn ký xác thực ứng dụng với công cụ Microsoft SignTool

From CodeForLife
Jump to: navigation, search

Giới thiệu về Code Signing Certificate

Sau khi bạn hoàn thành ứng dụng trên PC, công việc tiếp theo là bạn phải publish ứng dụng để nhiều người dùng biết tới. Để được người dùng tin tưởng vào ứng dụng của bạn phải mua "Code Signing Certificate" và sử dụng nó ký lên ứng dụng để xác thực ứng dụng. Về Certificate thì có nhiều trang bán như :

Vậy sự khác biệt giữa ứng dụng đã xác thực và chưa xác thực khác nhau như thế nào. Chi tiết xem bảng dưới:

Not Signed Signed
RTENOTITLE RTENOTITLE
Khi chạy một ứng dụng chưa được ký, hoặc khi ứng dụng này được tải về qua trình duyệt, hòm thư thì sẽ xuất hiện cảnh báo bảo mật: "This file does not have a valid digital signature that verifies its publisher. You should only run software from publishers you trust.". Ứng dụng coi như không rõ nguồn gốc và do đó người dùng không tin tưởng để cài đặt ứng dụng, nhiều khi người dùng tưởng nhầm với virus hoặc spyware. Các ứng dụng được ký với "Code Signing certificate" sẽ hiển thị tên nhà xuất bản, giúp người dùng cuối xem chúng như nguồn đáng tin cậy và tải chúng về.

Hướng dẫn ký xác thực ứng dụng

Để ký ứng dụng Windows, nếu sử dụng Certificate thật thì khuyến cáo bạn nên sử dụng công cụ SignTool của Microsoft để đảm bảo an toàn cho Certificate của bạn. Nếu chỉ với mục đích test, bạn có thể sử dụng công cụ của bên thứ ba khác như DigiCert Certificate Utility for Windows (https://www.digicert.com/util/), công cụ này hoàn toàn miễn phí, nhỏ gọn lại có giao diện nên rất tiện sử dụng.

Để sử dụng được công cụ của Microsoft bắt buộc bạn phải cài đặt "Microsoft Windows SDK", vì bộ công cụ này nằm trong Windows SDK chứ không có bản riêng, đây cũng là điều khá bất tiện vì nếu cài Windows SDK thì khá nặng. Bạn cài một trong các phiên bản sau:

  • Microsoft Windows SDK 7
    • makecert: Nằm trong thư mục "C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin"
    • signtool: "C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin"
  • Microsoft Windows SDK 8.1
    • makecert: "C:\Program Files (x86)\Windows Kits\8.1\bin\x64"
    • signtool: "C:\Program Files (x86)\Windows Kits\8.1\bin\x64"
  • Microsoft Windows SDK 10
    • makecert: "C:\Program Files (x86)\Windows Kits\10\bin\10.0.16299.0\x64"
    • signtool: "C:\Program Files (x86)\Windows Kits\10\App Certification Kit"

Chú ý: Có thể đường dẫn thay đổi chút, bạn nên kiểm tra lại.
Ở đây tôi sử dụng Windows SDK 10, các bản khác tương tự, chỉ cần chú ý tới đường dẫn tới công cụ để thiết lập cho đúng khi thiết lập biến môi trường PATH.

Tạo "Code Signing Certificate"

Thực tế thì bạn phải mua "Code Signing Certificate" từ các đơn vị cung cấp uy tín, tôi thì thấy nhiều người sử dụng của Comodo. Nhưng để tiện viết hướng dẫn và giúp các bạn thử nghiệm tôi xin hướng dẫn các bạn tự tạo một "Code Signing Certificate", dĩ nhiên Certificate này không được xác thực với "Root CA" vì thế nó cũng không có nhiều ý nghĩa lắm khi publish ứng dụng, mà nó chỉ mang mục đích demo thôi.

Đầu tiên bạn bật "Command line", và chuyển tới thư mục chứa ứng dụng cần sign, sau đó đánh các lệnh sau để tạo ra một Certificate:

SET PATH="C:\Program Files (x86)\Windows Kits\10\bin\10.0.16299.0\x64";%PATH%

del MyCertTest.*
makecert.exe -sv MyCertTest.pvk -n "CN=MyTestApp,O=MobileSoftVn,OU=Company,L=San Diego,S=CA,C=US" MyCertTest.cer -r
pvk2pfx.exe -pvk MyCertTest.pvk -spc MyCertTest.cer -pfx MyCertTest.p12 -po test2018

Lệnh đầu tiên để add thư mục chứa công cụ sử dụng vào biến môi trường PATH, chú ý với từng phiên bản Windows SDK bạn phải thay đổi đường dẫn này cho phù hợp.

Khi chạy sẽ yêu cầu nhập mật khẩu thì bạn nhập mật khẩu tương ứng test2018 như trong lệnh nhé. Nhập khác là không sign được.
Sau khi chạy lệnh trên bạn sẽ thấy xuất hiện tệp MyCertTest.p12, đây là tệp "Code Signing Certificate" sử dụng để ký xác thực ứng dụng.

Ký xác thực ứng dụng

Bây giờ ban cần có một ứng dụng exe hoặc dll để thử nghiệm. Tôi sử dụng một tệp Setup.exe để thử nghiệm. Bây giờ ta dùng signtool để ký xác thực MyCertTest.p12 lên tệp Setup.exe:

SET PATH="C:\Program Files (x86)\Windows Kits\10\App Certification Kit";%PATH%
signtool sign /tr http://timestamp.digicert.com /td sha256 /fd sha256 /f "MyCertTest.p12" /p test2018 "Setup.exe"

Bạn chú ý thay đổi đường dẫn trong lệnh đầu tiên cho phù hợp nhé. Thành công sẽ có thông báo:

Done Adding Additional Store
Successfully signed and timestamped: Setup.exe

Tệp Setup.exe mới có kích thước lớn hơn tệp ban đầu một chút. Bạn kích phải chuột vào tệp Setup.exe, chọn Properties, bạn sẽ tháy thêm tab "Digital Signatures", mở tab này bạn sẽ thấy thông tin chữ ký số như sau:

RTENOTITLE

Xem chi tiết bạn kích vào "View Certificate".