Chuyển tới nội dung chính

Tài liệu tham khảo

Trang này tổng hợp các thông tin tham khảo dùng chung cho dịch vụ ký mã từ xa sslTrus trong các phương thức tích hợp khác nhau, bao gồm:

  • Quy tắc tính số lần ký mã.
  • Giao thức tem thời gian Authenticode và RFC 3161.
  • Các máy chủ tem thời gian ký mã thường dùng.
  • Các điểm cần lưu ý khi chọn dịch vụ tem thời gian trong môi trường production.

Cách tính số lần ký

Số lần ký được tính theo hành động ký thực tế đã hoàn thành.

Cách hiểu đơn giản:

一个文件成功完成一次签名 = 一次签名次数

Số lần ký không được tính theo số lượng tệp mã nguồn, cũng không tính theo một lần build, một lần đóng gói hoặc một lần CI/CD Pipeline.

Ví dụ:

100 个源代码文件

编译生成 1 个 app.exe

app.exe 成功签名一次

1 次签名

Nếu một lần build tạo ra:

app.exe
helper.dll
installer.msi

Và cả ba tệp đều được ký riêng biệt, thì:

签名次数 = 3 次

Quy tắc cơ bản

Số lần ký chủ yếu phụ thuộc vào:

  1. Cuối cùng có những tệp hoặc đối tượng nào được ký.
  2. Mỗi đối tượng thực tế đã hoàn thành bao nhiêu lần ký.
  3. Sử dụng hình thức ký bằng client thông thường hay các cách gọi ký底层 như KSP, Jarsigner.
  4. Công cụ build có tự động ký thêm các tệp EXE, DLL, trình gỡ cài đặt hoặc gói cài đặt hay không.

Các đối tượng ký thường gặp bao gồm:

  • .exe
  • .dll
  • .msi
  • .msp
  • .sys
  • .cat
  • .jar
  • Trình gỡ cài đặt, ví dụ uninstall.exe

Chỉ cần một đối tượng thực tế hoàn tất thành công một lần ký, thì sẽ được tính theo quy tắc đếm số lần tương ứng.

Chỉ tính khi thành công

Chỉ khi dịch vụ ký mã từ xa hoàn tất việc ký thành công thì mới phát sinh số lần ký.

Các trường hợp sau thường không được tính:

  • Xác thực thất bại.
  • Tham số sai.
  • Chứng chỉ không khả dụng.
  • Yêu cầu mạng thất bại.
  • Phía máy chủ không trả về kết quả ký thành công.
  • Truy vấn chứng chỉ.
  • Truy vấn bản ghi ký.
  • Xác minh chữ ký.
  • Gỡ bỏ chữ ký hiện có.
  • Tạo tệp xác minh.

Nếu dịch vụ từ xa đã trả về kết quả ký thành công, nhưng client sau đó gặp lỗi khi ghi tệp cục bộ, thêm dấu thời gian hoặc thực hiện xử lý tiếp theo, thì lần ký từ xa đã hoàn thành vẫn được tính là ký thành công.

Dấu thời gian không được tính riêng

Dấu thời gian dùng để chứng minh chữ ký đã tồn tại tại một thời điểm cụ thể, không thuộc thao tác ký mã mới.

Do đó:

Ký mã        → Số lần ký được tạo
Thêm dấu thời gian → Không phát sinh thêm số lần ký
Xác minh chữ ký → Không phát sinh số lần ký

Dịch vụ tem thời gian có thành công hay không chỉ ảnh hưởng đến kết quả tem thời gian của tệp chữ ký cuối cùng, không có nghĩa là đã thực hiện thêm một lần ký mã.

SignTool CLI

Sử dụng sslTrus SignTool CLI:

signtool sign \
--cert-code CERT_CODE \
--file app.exe

Nếu ký thành công:

1 个文件 × 1 次成功签名 = 1 次

Ví dụ:

signtool sign --cert-code CERT_CODE --file app.exe
signtool sign --cert-code CERT_CODE --file helper.dll
signtool sign --cert-code CERT_CODE --file installer.msi

Cả ba tệp đều thành công:

合计 = 3 次

SignTool CLI ký kép

Nếu sử dụng SignTool CLI thông thường và đồng thời bật SHA-1 và SHA-2:

signtool sign \
--cert-code CERT_CODE \
--file app.exe \
--sha1=true \
--sha2=true

Ký kép CLI thông thường được tính theo một tác vụ ký của máy khách:

GUI / SignTool CLI 双签 = 1 次

Đây là điểm dễ gây nhầm lẫn nhất giữa quy trình ký của máy khách thông thường và lệnh gọi ký cấp thấp của KSP.

Windows KSP

KSP là phương thức tích hợp Windows CNG Provider.

Khi Microsoft SignTool, MSBuild, Visual Studio, công cụ đóng gói Electron hoặc phần mềm Windows khác gọi ký mã từ xa qua KSP, số lượt tính gần với:

底层远程私钥签名调用次数

Ví dụ:

Thao tácSố lần ký
Thực hiện ký SHA256 một lần cho app.exe1 lần
Thực hiện SHA256 trước, sau đó thêm SHA12 lần
Ký riêng biệt app.exe, helper.dll, uninstall.exe3 lần

Do đó:

SignTool CLI 双签 = 1 次
KSP 双签 = 2 次

Nếu công cụ thực hiện nhiều thao tác ký cơ bản trên cùng một tệp, mỗi lần ký từ xa thành công sẽ được tính riêng.

CSP

CSP là Provider CryptoAPI truyền thống của Windows.

CSP cũng được Microsoft SignTool hoặc các ứng dụng Windows khác gọi dịch vụ ký từ xa thông qua Provider.

Khi xác định số lần ký, cần căn cứ vào thao tác ký bằng khóa riêng từ xa thực tế phát sinh.

Nếu công cụ ký nhiều tệp riêng biệt hoặc ký cùng một tệp nhiều lần, cần tính riêng từng lần.

Jarsigner

Khi sử dụng Provider sslTrusJarsigner, jarsigner tiêu chuẩn sẽ gọi dịch vụ ký mã từ xa trong quá trình ký.

Thông thường:

Thao tácSố lần ký
app.jar1 lần
Ký riêng 3 tệp JAR3 lần
Ký lại cùng một JAR một lần nữathêm 1 lần
jarsigner -verify0 lần
Tạo keystore để xác minh0 lần

Do đó:

每个 JAR 每次成功完成签名 = 1 次

Gói cài đặt

Gói cài đặt cần phân biệt:

  1. Tệp thực thi bên trong gói cài đặt.
  2. Bản thân gói cài đặt.

Ví dụ:

app.exe       → ký 1 lần
installer.msi → ký 1 lần

Thì:

合计 = 2 次

Nếu còn các tệp khác:

TệpCó ký khôngSố lần ký
app.exe1
helper.dll1
driver.sys1
installer.msi1
Tổng cộng4

Gói cài đặt chứa bao nhiêu mã nguồn, tệp tài nguyên, hình ảnh hay tệp cấu hình sẽ không ảnh hưởng trực tiếp đến số lần ký.

Điểm mấu chốt là:

最终到底有哪些产物被实际签名

Electron

Các công cụ đóng gói ứng dụng desktop như Electron Builder, Electron Forge có thể tự động ký nhiều tệp trong một lần đóng gói.

Các đối tượng phổ biến bao gồm:

  • Chương trình chính .exe
  • DLL
  • Chương trình cập nhật
  • Chương trình gỡ cài đặt
  • Gói cài đặt .exe
  • MSI
  • Các tệp thực thi hỗ trợ khác

Ví dụ:

Sản phẩmSố lần ký
MyApp.exe1
ffmpeg.dll1
update.exe1
uninstall.exe1
MyApp Setup.exe1
Tổng cộng5

Do đó:

一次 Electron Build ≠ 一次签名

Nên tính toán dựa trên số lượng sản phẩm được ký thực tế và số lần ký được thực hiện trên mỗi sản phẩm.

Nếu Electron sử dụng KSP và thực hiện ký kép trên cùng một tệp, tệp đó còn có thể tạo ra hai lần ký từ xa.

Phán đoán nhanh

Khi không biết một lần build sẽ tạo ra bao nhiêu lần ký, có thể xác nhận lần lượt:

1. 最终有哪些文件被签名?
2. 每个文件签了几次?
3. 使用的是 SignTool CLI 还是 KSP / Jarsigner?
4. 构建工具有没有自动签额外文件?

Có thể hiểu đơn giản là:

签名次数 = 成功完成的签名动作数量之和

Lưu ý đặc biệt:

GUI / SignTool CLI 双签                = 1 次
KSP 对同一个文件执行两次底层签名 = 2 次
Jarsigner 每个 JAR 每次成功签名 = 1 次
时间戳 = 0 次
验证签名 = 0 次

Máy chủ tem thời gian

Ký mã thường đồng thời sử dụng dịch vụ tem thời gian.

Tem thời gian có thể chứng minh chữ ký số đã tồn tại tại một thời điểm cụ thể, từ đó cho phép bên xác minh kết hợp chứng chỉ chữ ký, chứng chỉ tem thời gian, trạng thái thu hồi và chính sách xác minh để đánh giá tính hợp lệ của chữ ký.

Ký mã thường có hai giao thức tem thời gian:

Giao thứcMô tả
AuthenticodeGiao thức tem thời gian truyền thống của Microsoft, chủ yếu dùng để tương thích với quy trình ký mã Windows phiên bản cũ
RFC 3161Giao thức tem thời gian đa dụng, phù hợp với các tình huống ký mã hiện đại

Các tình huống ký mã hiện đại thường ưu tiên sử dụng RFC 3161.

RFC 3161

Yêu cầu tem thời gian RFC 3161 gửi đi là bản tóm tắt của dữ liệu cần đóng tem thời gian, không phải tệp gốc.

Quy trình cơ bản:

代码签名

计算待时间戳数据摘要

发送摘要到 TSA

TSA 返回时间戳令牌

写入最终签名

Mã thông báo dấu thời gian thường bao gồm:

  • Tóm tắt dữ liệu.
  • Thời gian ký dấu thời gian.
  • Chính sách TSA.
  • Chữ ký số TSA.

Máy chủ dấu thời gian sẽ không tiêu tốn thêm số lần ký mã sslTrus do việc thêm dấu thời gian.

Máy chủ dấu thời gian thường dùng

Các điểm cuối sau phù hợp với các tình huống ký mã phổ biến.

Trước khi sử dụng trong môi trường production, nên xác nhận lại tài liệu chính thức mới nhất, chính sách dịch vụ và tính khả dụng của nhà cung cấp tương ứng.

Microsoft

http://timestamp.acs.microsoft.com

Chủ yếu được sử dụng cho tem thời gian RFC 3161.

Thích hợp làm ứng viên tem thời gian trong các tình huống ký mã hiện đại trên Windows.

Ví dụ:

--timestamp-rfc3161=http://timestamp.acs.microsoft.com

Microsoft SignTool:

/tr http://timestamp.acs.microsoft.com
/td SHA256

Sectigo

http://timestamp.sectigo.com

Được hỗ trợ:

  • Authenticode
  • RFC 3161

Có thể sử dụng trên Windows và các công cụ ký mã khác hỗ trợ giao thức tương ứng.

Sectigo có các yêu cầu sử dụng phía dịch vụ đối với các lệnh gọi hàng loạt, hệ thống sản xuất nên kiểm soát tần suất gọi theo chính sách chính thức hiện tại của họ.

DigiCert

http://timestamp.digicert.com

Hỗ trợ RFC 3161, có thể sử dụng trong các tình huống ký mã như Microsoft Authenticode.

Certum

http://time.certum.pl

Hỗ trợ:

  • Authenticode
  • RFC 3161

Tài liệu ký mã chính thức của Certum bao gồm các tình huống ký Windows và Java JAR.

GlobalSign

http://timestamp.globalsign.com/tsa/r45standard

Hiện tại, tài liệu ký mã GlobalSign sử dụng địa chỉ timestamp RFC 3161 này.

Không khuyến nghị tiếp tục sử dụng các địa chỉ GlobalSign cũ không còn nằm trong tài liệu ký mã chính thức hiện tại.

SSL.com

http://ts.ssl.com

Hỗ trợ RFC 3161, không hỗ trợ giao thức Authenticode timestamp truyền thống.

Nếu công cụ ký mục tiêu hoặc hệ thống cũ có hạn chế về khả năng tương thích đối với thuật toán khóa mà TSA sử dụng, cần tiến hành xác minh thực tế trước khi tích hợp vào môi trường production.

So sánh các máy chủ timestamp

Nhà cung cấpĐịa chỉAuthenticodeRFC 3161
Microsofthttp://timestamp.acs.microsoft.comChưa xác nhậnHỗ trợ
Sectigohttp://timestamp.sectigo.comHỗ trợHỗ trợ
DigiCerthttp://timestamp.digicert.comChưa xác nhậnHỗ trợ
Certumhttp://time.certum.plHỗ trợHỗ trợ
GlobalSignhttp://timestamp.globalsign.com/tsa/r45standardChưa xác nhậnHỗ trợ
SSL.comhttp://ts.ssl.comKhông hỗ trợHỗ trợ

“Hỗ trợ” trong bảng mô tả khả năng giao thức được xác nhận từ tài liệu công khai của nhà cung cấp tương ứng.

Chính sách dịch vụ timestamp có thể thay đổi, cần kiểm tra lại tài liệu chính thức hiện tại của nhà cung cấp trước khi cấu hình production.

Dịch vụ timestamp bị hạn chế

Một số máy chủ timestamp tuy cung cấp dịch vụ RFC 3161, nhưng không thể sử dụng trực tiếp như một TSA công cộng ẩn danh.

QuoVadis

Các địa chỉ RFC 3161 công khai bao gồm:

http://ts.quovadisglobal.com/eu
http://ts.quovadisglobal.com/ch

Dịch vụ này yêu cầu đăng ký trước IP đầu ra của bên gọi, do đó cần hoàn tất ủy quyền tương ứng trước khi tích hợp.

Apple

http://timestamp.apple.com/ts01

Thuộc về dịch vụ tem thời gian được sử dụng trong hệ sinh thái ký mã Apple.

Không nên trực tiếp sử dụng nó làm máy chủ tem thời gian Authenticode đa dụng cho Windows.

Dịch vụ tem thời gian dạng thử nghiệm

Một số dịch vụ RFC 3161 công khai phù hợp hơn cho việc kiểm thử giao thức, thay vì trực tiếp làm TSA ký mã trong môi trường production.

Ví dụ:

https://freetsa.org/tsr

Các dịch vụ này có thể sử dụng chứng chỉ CA và TSA của riêng chúng.

Do đó, không thể giả định rằng:

Windows
macOS
Java
其他代码签名验证器

Theo mặc định, chuỗi chứng chỉ của nó đều được tin cậy.

Môi trường production nên sử dụng nền tảng mục tiêu để xác minh thực tế sản phẩm chữ ký.

Kiểm tra môi trường production

Trước khi thêm máy chủ timestamp vào cấu hình production, khuyến nghị ít nhất xác nhận:

  1. Tài liệu chính thức của nhà cung cấp dịch vụ công bố rõ ràng endpoint này.
  2. Nhà cung cấp dịch vụ hỗ trợ rõ ràng giao thức timestamp cần thiết.
  3. Sử dụng thuật toán digest timestamp SHA-256 hoặc mạnh hơn.
  4. Hệ thống mục tiêu có thể xác minh chuỗi chứng chỉ đầy đủ của TSA.
  5. DNS, proxy, tường lửa và mạng ra ngoài có thể truy cập TSA một cách ổn định.
  6. Đã xác nhận phương thức xác thực, giới hạn tốc độ, giới hạn khu vực và điều khoản dịch vụ.
  7. Sử dụng sản phẩm chữ ký thực tế để hoàn tất kiểm tra xác minh chữ ký.

Đừng chỉ thông qua:

浏览器可以打开
HTTP 返回 200

Đánh giá xem máy chủ tem thời gian có phù hợp để ký mã hay không.

Bạn phải dùng công cụ ký thực tế để gửi yêu cầu tem thời gian và xác minh sản phẩm cuối cùng.

Gợi ý chọn tem thời gian

Đối với ký mã SHA-2 trên Windows hiện đại, thường ưu tiên các dịch vụ tem thời gian hỗ trợ RFC 3161.

Ví dụ:

Microsoft
Sectigo
DigiCert
Certum
GlobalSign

Lựa chọn cuối cùng nên được cân nhắc tổng hợp dựa trên:

  • Hệ điều hành mục tiêu.
  • Công cụ ký.
  • Chuỗi chứng chỉ TSA.
  • Khả năng kết nối mạng.
  • Hạn chế theo khu vực.
  • Giới hạn tần suất gọi.
  • Điều khoản dịch vụ.
  • Thỏa thuận mức dịch vụ.
  • Kết quả xác minh sản phẩm ký thực tế.

Nếu nhà cung cấp chứng chỉ có yêu cầu rõ ràng đối với dịch vụ tem thời gian, nên ưu tiên tuân theo chính sách chứng chỉ tương ứng và yêu cầu của nhà cung cấp dịch vụ.

Các phương thức tích hợp liên quan

Các phương thức tích hợp khác nhau sẽ sử dụng quy tắc số lần ký và tem thời gian trong trang này:

Tình huống sử dụngTài liệu
SignTool CLICông cụ máy khách
Windows KSP / CSPWindows Provider
JarsignerTích hợp Java
GitHub Actions, Electron Builder, Advanced InstallerCI/CD và công cụ build
Gọi trực tiếp giao diện ký từ xaTích hợp API