Saltar al contenido principal

Integración de API

sslTrus ofrece una API de firma de código remota, diseñada para desarrolladores que necesitan desarrollar sus propios clientes de firma, sistemas de compilación u otras integraciones de firma.

La API recibe el resumen del archivo calculado por el cliente, y el servicio de firma de código remoto utiliza el certificado de firma de código especificado para completar la firma con la clave privada, devolviendo el resultado de la firma.

El cliente es responsable de:

  • Calcular el resumen de los datos a firmar.
  • Construir la estructura de firma necesaria para el archivo de destino.
  • Llamar a la interfaz de firma remota.
  • Escribir el resultado de la firma devuelto en el archivo de destino o en la estructura de firma.
  • Reportar el resultado final del procesamiento del cliente según sea necesario.

La clave privada de firma de código siempre se almacena en el HSM en la nube y nunca se devuelve al cliente a través de la API.

Dirección de acceso​

Dirección predeterminada del entorno de producción:

https://ssl.face.racent.com

NICSRS entorno:

https://ssl.face.nicsrs.com

Interfaz de firma completa:

POST https://ssl.face.racent.com/v1/codesign/sign

Resultado de la interfaz de reporte de datos:

POST https://ssl.face.racent.com/v1/codesign/report-sign

Si el entorno de entrega real utiliza otras direcciones de servicio, prevalezca la dirección proporcionada por el equipo de entrega u operaciones.

Autenticación de identidad​

La API utiliza HTTP Basic Auth.

Correspondencia:

Username = Access Key
Password = Access Secret

Cabeceras de la solicitud:

Authorization: Basic <base64(accessKey:accessSecret)>

Por ejemplo:

printf "%s:%s" "$ACCESS_KEY" "$ACCESS_SECRET" | base64

Al usar curl en la práctica, se puede proporcionar directamente mediante el parámetro -u.

curl -u "$ACCESS_KEY:$ACCESS_SECRET"

Access Secret es una credencial confidencial y no debe incluirse en el código fuente, archivos de configuración públicos, registros ni páginas del cliente web.

Formato general de las solicitudes​

La API utiliza:

HTTPS
POST
JSON

Cabeceras de la solicitud:

Content-Type: application/json
Accept: application/json
Authorization: Basic <credentials>

Formato de respuesta general​

La API devuelve una estructura JSON unificada:

{
"code": 0,
"message": "ok",
"data": {}
}

Descripción de los campos:

CampoTipoDescripción
codeintegerCódigo de estado de la operación; 0 indica éxito
messagestringInformación de estado o de error
dataobjectDatos de la operación de la API

El cliente debe comprobar tanto el código de estado HTTP como el código de estado de la operación.

Se recomienda procesar la respuesta de la siguiente manera:

HTTP 非 2xx
↓
HTTP 请求失败

HTTP 2xx + code != 0
↓
业务失败

HTTP 2xx + code == 0
↓
读取 data

No traduzcas solo con base en HTTP 200 para determinar que una solicitud de firma fue exitosa.

Interfaz de firma​

Interfaz:

POST /v1/codesign/sign

Esta interfaz permite enviar el resumen que se va a firmar y obtener el resultado de la firma realizada con la clave privada remota.

Parámetros de la solicitud​

Ejemplo de solicitud:

{
"code": "CERT_CODE",
"digest": "BASE64_ENCODED_HASH",
"algorithm": "SHA256",
"padding": "PKCS1",
"extra": {
"platform": "windows/amd64",
"version": "1.0.0",
"revision": "abcdef0",
"time": "2026-06-12T10:00:00+08:00",
"hostname": "build-host-01",
"signing_filename": "Example.exe",
"signing_filesize": 1048576
}
}

Parámetros principales:

ParámetroTipoObligatorioDescripción
codestringSíCódigo del certificado de firma de código
digeststringSíCodificación Base64 de los bytes originales del resumen a firmar
algorithmstringSíAlgoritmo de resumen
paddingstringSíMétodo de relleno RSA, actualmente fijado en PKCS1
extraobjectNoContexto del cliente e información de auditoría

Algoritmo de resumen​

Actualmente se admiten:

SHA1
SHA256

Por ejemplo, al usar SHA-256:

{
"algorithm": "SHA256"
}

algorithm debe ser consistente con el algoritmo de resumen que digest utiliza realmente.

Formato de digest​

digest debe ser:

Bytes originales del hash → Base64

No es:

文件内容 Base64

Tampoco es:

No es tampoco:

十六进制哈希字符串

Por ejemplo, si un resumen SHA-256 tiene 32 bytes en sí mismo, entonces se deben codificar esos 32 bytes originales en Base64 antes de pasarlos a la interfaz.

padding​

Actualmente se usa fijamente:

PKCS1

Es decir:

{
"padding": "PKCS1"
}

No pases otros métodos de relleno.

extra​

extra se utiliza para registrar el contexto del cliente, la información de auditoría y ayudar en la resolución de problemas.

Soporta:

CampoTipoDescripción
platformstringPlataforma del cliente
versionstringVersión del cliente
revisionstringRevisión de compilación del cliente
timestringHora de compilación u hora de registro en el lado de la solicitud
hostnamestringNombre de host que realiza la solicitud
signing_filenamestringNombre del archivo firmado o ruta local
signing_filesizeintegerTamaño del archivo, en bytes

Por ejemplo:

{
"extra": {
"platform": "linux/amd64",
"version": "1.2.0",
"hostname": "github-runner-01",
"signing_filename": "app.exe",
"signing_filesize": 5242880
}
}

Si signing_filename contiene directorios internos, nombres de usuario u otra información confidencial, se recomienda anonimizar o enmascarar esos datos según la política de seguridad del cliente.

Ejemplo de solicitud de firma​

Con curl:

curl -u "$ACCESS_KEY:$ACCESS_SECRET" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"code": "CERT_CODE",
"digest": "BASE64_ENCODED_HASH",
"algorithm": "SHA256",
"padding": "PKCS1",
"extra": {
"platform": "linux/amd64",
"version": "1.0.0",
"hostname": "build-host-01",
"signing_filename": "Example.exe",
"signing_filesize": 1048576
}
}' \
https://ssl.face.racent.com/v1/codesign/sign

Respuesta de firma​

Respuesta correcta:

{
"code": 0,
"message": "ok",
"data": {
"id": "735985894427246592",
"signature": "BASE64_ENCODED_SIGNATURE"
}
}

Campos devueltos:

CampoTipoDescripción
idstringID del registro de firma
signaturestringCodificación Base64 del resultado de la firma RSA

Para la capacidad de firma real, el cliente utiliza principalmente:

data.signature

Si necesita informar el estado final después de completar el procesamiento local, también debe guardar:

data.id

Flujo de procesamiento del cliente​

Flujo típico:

读取待签名文件
↓
按照目标格式生成待签名数据
↓
计算摘要
↓
Base64 编码摘要
↓
POST /v1/codesign/sign
↓
获得 signature
↓
构造最终签名结构
↓
写回目标文件
↓
POST /v1/codesign/report-sign

Tenga en cuenta lo siguiente:

/v1/codesign/sign

Solo es responsable de la firma de la clave privada remota subyacente.

La forma en que PE Authenticode, JAR, PDF u otros formatos de archivo organizan la estructura de firma, es manejada por el cliente según el formato objetivo.

Reportar el resultado de la firma​

Interfaz:

POST /v1/codesign/report-sign

El cliente, tras recibir el resultado de la firma remota, aún puede experimentar fallos en el proceso posterior, por ejemplo:

  • Fallo al construir la estructura de firma final.
  • Fallo al escribir en el archivo de destino.
  • Error de permisos en el archivo local.
  • Excepción en el procesamiento posterior del cliente.

Se puede utilizar esta interfaz para devolver el estado final del procesamiento al servidor.

Parámetros de solicitud​

{
"id": "735985894427246592",
"status": 1
}

Parámetros:

CampoTipoObligatorioDescripción
idstringSíID del registro de firma devuelto por /v1/codesign/sign
statusintegerSíEstado final del procesamiento del cliente

Valores de estado:

EstadoDescripción
1El procesamiento final del cliente se completó correctamente
2El procesamiento final del cliente falló

Ejemplo de solicitud​

curl -u "$ACCESS_KEY:$ACCESS_SECRET" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"id": "735985894427246592",
"status": 1
}' \
https://ssl.face.racent.com/v1/codesign/report-sign

Respuesta correcta​

{
"code": 0,
"message": "ok",
"data": null
}

Número de firmas​

El número de firmas de la API se determina según si la operación de firma remota es exitosa.

Cuando:

HTTP 2xx
code == 0
data.signature 非空

Cuando se cumplen todas estas condiciones, se considera que se ha completado una firma correctamente:

签名次数 +1

Los siguientes casos no consumen firmas:

  • Fallo de autenticación.
  • Error de parámetros.
  • Fallo de la solicitud de red.
  • Fallo de la solicitud de negocio.
  • El servidor no devuelve correctamente el contenido de la firma.

Debe prestar especial atención a:

/v1/codesign/report-sign

Solo se informa el estado final del procesamiento del cliente, no es una nueva operación de firma y no aumenta ni disminuye el número de firmas.

Incluso si el cliente ha obtenido exitosamente el resultado de la firma remota, pero luego falla al escribir el archivo localmente, la firma remota con clave privada que se completó exitosamente previamente ya ha generado un conteo de firma.

Para más reglas de conteo, consulte Materiales de referencia.

Manejo de errores​

El cliente debe manejar por separado:

  1. Errores de red.
  2. Errores HTTP.
  3. Errores de negocio de la API.
  4. Errores de procesamiento local del cliente.

Fallo de autenticación​

Por ejemplo:

{
"code": 401,
"message": "unauthorized",
"data": null
}

Compruebe lo siguiente:

  • Que Access Key sea correcto.
  • Que Access Secret sea correcto.
  • Que la solicitud incluya correctamente la cabecera Authorization.

Error de parámetros​

Por ejemplo:

{
"code": 400,
"message": "invalid request",
"data": null
}

Debe prestarse especial atención a:

  • code es correcto.
  • digest es un Base64 válido.
  • algorithm coincide con el resumen.
  • padding es PKCS1.

El cliente no debe depender de un:

message

Lógica de ejecución de cadenas de caracteres.

El manejo de negocios debe basarse preferentemente en el código de estado y el contrato de la interfaz.

Tiempo de espera y reintentos​

Al invocar la interfaz de firma remota, debe establecerse un tiempo de espera de red razonable.

Cuando sea necesario reintentar, se debe prestar especial atención a:

签名接口不是普通查询接口

Si el cliente no recibe una respuesta debido a un error de red, no significa necesariamente que el servidor no haya completado la firma.

Por lo tanto, al diseñar un mecanismo de reintento automático, se debe evitar reenviar solicitudes de firma de forma ilimitada o incondicional.

Se recomienda registrar por separado:

  • Hora de inicio de la solicitud.
  • Número del certificado de destino.
  • Identificador del resumen.
  • Estado HTTP.
  • Código de estado del negocio.
  • ID del registro de firma devuelto.
  • Estado final de procesamiento del cliente.

No registrar el Access Secret completo en los registros.

Registros y auditoría​

Se recomienda registrar el contexto de firma necesario, por ejemplo:

certificate code
platform
client version
hostname
filename
filesize
sign record id
result

Para:

digest
signature

Los datos de este tipo, al ser de gran tamaño, no se recomienda escribirlos completos en los registros ordinarios.

Se puede registrar:

  • La longitud.
  • El hash.
  • El prefijo y sufijo después de la desensibilización.

Las rutas de archivo también pueden contener nombres de usuario, nombres de proyecto o información de directorios internos; se debe decidir si desensibilizarlos según los requisitos de seguridad reales.

Notas de seguridad​

Al integrar la API, se recomienda seguir los siguientes principios:

  • Access Secret no debe guardarse en el código del frontend.
  • Access Secret no debe enviarse al repositorio de Git.
  • No registrar el encabezado Authorization completo en los registros ordinarios.
  • No registrar el Access Secret completo.
  • Aplicar la desensibilización necesaria en los registros para digest y signature.
  • Llamar al servicio de firma remota mediante HTTPS.
  • El cliente debe verificar el estado HTTP y el estado empresarial.
  • Establecer tiempos de espera y estrategias de reintento razonables para las solicitudes de red.

La API de firma de código remota devuelve el resultado de la firma, no la clave privada.

La clave privada de firma de código siempre se conserva en el HSM remoto.

Cuándo usar la API​

Si el método de integración existente ya satisface las necesidades, normalmente se puede usar directamente la herramienta correspondiente.

EscenarioMétodo recomendado
Firmar directamente archivos EXE, DLL, MSI, etc.Herramienta de cliente
Software de Windows como Microsoft SignTool, Visual Studio, etc.Windows Provider
Firma de archivos JARIntegración de Java
Compilación automática como GitHub Actions, Electron Builder, etc.CI/CD y herramientas de compilación
Desarrollo propio de un cliente de firmaAPI
Implementación propia del proceso de firma de formatos de archivoAPI
Necesidad de controlar directamente el resumen y el resultado de la firmaAPI

La API es más adecuada para desarrolladores que necesitan controlar el flujo de firma subyacente.

Si solo se necesita completar la firma de código para archivos comunes, priorizar el uso de clientes existentes o Providers estándar puede reducir el trabajo de procesar manualmente los formatos de archivo de firma.