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 lưu ý khi lựa 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 số hành động ký thực tế đã hoàn tất.

Có thể 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 được tính theo một lần build, một lần đóng gói hay 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, 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 ký từ máy khách thông thường hay các phương thức ký tầng thấp như KSP, Jarsigner.
  4. Công cụ build có tự động ký thêm EXE, DLL, trình gỡ cài đặt hoặc gói cài đặt hay không.

Các đối tượng ký phổ biến 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 thành thành công một lần ký, thì sẽ được tính theo quy tắc tính 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 thành thành công việc ký 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.
  • Lỗi tham số.
  • Chứng chỉ không khả dụng.
  • Yêu cầu mạng thất bại.
  • 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 máy khách sau đó ghi tệp cục bộ, thêm dấu thời gian hoặc thực hiện xử lý tiếp theo bị lỗi, thì chữ ký từ xa đã hoàn thành vẫn được tính theo chữ ký thành công.

Dấu thời gian không tính riêng số lần​

Dấu thời gian được 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 tạo chữ ký
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ụ đóng dấu thời gian có thành công hay không chỉ ảnh hưởng đến kết quả dấu thời gian của tệp đã 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ễ 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 thông qua KSP, số lần 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 Windows truyền thống.

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ý khóa riêng từ xa thực tế đã diễn ra.

Nếu công cụ ký nhiều tệp riêng biệt hoặc thực hiện nhiều lần ký trên cùng một tệp, 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ý
Ký app.jar1 lần
Ký riêng 3 tệp JAR3 lần
Thực hiện ký lại một lần nữa trên cùng một JARTăng thê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.exeCó1
helper.dllCó1
driver.sysCó1
installer.msiCó1
Tổng cộng4

Số lượng mã nguồn, tệp tài nguyên, hình ảnh hoặc tệp cấu hình trong gói cài đặt sẽ không ảnh hưởng trực tiếp đến số lần ký.

Điều quan trọng 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 phụ 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 thực tế được ký và số lần ký được thực hiện cho 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ể phát sinh hai lần ký từ xa.

Xác định nhanh​

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

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ủ đóng dấu thời gian​

Chữ ký mã thường đồng thời sử dụng dịch vụ đóng dấu thời gian.

Dấu 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ể, nhờ đó cho phép bên xác minh kết hợp chứng chỉ chữ ký, chứng chỉ dấu thời gian, trạng thái thu hồi và chính sách xác minh để phán đoán tính hợp lệ của chữ ký.

Hai giao thức đóng dấu thời gian phổ biến trong chữ ký mã:

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

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

RFC 3161​

Yêu cầu đóng dấu thời gian RFC 3161 gửi đi là phần tóm tắt của dữ liệu cần đóng dấu thời gian, chứ 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 phát hành 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 sản xuất, 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 dùng cho tem thời gian RFC 3161.

Phù 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

Hỗ trợ:

  • Authenticode
  • RFC 3161

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

Sectigo 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 hành.

SSL.com​

http://ts.ssl.com

Hỗ trợ RFC 3161, không hỗ trợ giao thức timestamp Authenticode 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 với thuật toán khóa mà TSA sử dụng, cần thực hiện 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 theo 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, trước khi cấu hình production 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.

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ư 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, vì vậy 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ụ đóng dấu thời gian được sử dụng trong hệ sinh thái ký mã Apple.

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

Dịch vụ đóng dấu thời gian dạng kiểm thử​

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

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ột máy chủ timestamp vào cấu hình production, bạn nên xác nhận ít nhất:

  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出口 có thể truy cập ổn định vào TSA.
  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

Xác định xem máy chủ dấu thời gian có phù hợp để ký mã hay không.

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

Gợi ý chọn dấu thời gian​

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

Ví dụ:

Microsoft
Sectigo
DigiCert
Certum
GlobalSign

Lựa chọn cuối cùng cần cân nhắc tổng hợp:

  • 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ụ dấu 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 số lần ký và quy tắc dấu 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