Ir al contenido

¡Se acercan los certificados de 47 días! ¿Estás preparado?

Actúa ahora →

Todo lo que necesita saber sobre la firma NuGet

Todo sobre la firma de Nuggets

¿Qué es NuGet?

NuGet es el gestor de paquetes oficial del ecosistema .Net. Proporciona plataformas y herramientas que ayudan a los desarrolladores a crear, publicar y usar paquetes .Net. Seguro que te estás preguntando qué es un paquete. Los paquetes generalmente son bibliotecas compiladas con metadatos descriptivos en una unidad fácil de compartir. La función de NuGet es hacer que estas bibliotecas sean lo más accesibles y fáciles de compartir posible en forma de paquetes. NuGet ayuda a los desarrolladores a aprovechar todo un ecosistema y a construir sobre las soluciones existentes en lugar de crear todo desde cero.

Lea el artículo a continuación para comprender mejor qué es la firma NuGet.

Firmar un paquete NuGet, en resumen: puedes seguir nuget sign <package.nupkg> -CertificatePath <cert.pfx> -Timestamper <timestamp_url> (o el más nuevo dotnet nuget sign equivalente), luego verifique con nuget verify -Signatures <package.nupkg>El certificado de firma debe ser válido para la EKU id-kp-codeSigning, tener una clave RSA de 2048 bits o superior y no debe incluir la EKU lifetime-signing.

Puntos Clave

  • Un paquete NuGet puede tener exactamente una firma principal (autor o repositorio); la especificación prohíbe explícitamente la firma conjunta.
  • El certificado NO debe tener la EKU de firma de por vida (1.3.6.1.4.1.311.10.3.13). Este es un requisito estricto, no una recomendación, y cualquier certificado con esta EKU será rechazado.

Matriz de entorno

ComponenteRequisito
Herramental:nuget.exe CLI, o dotnet nuget sign/verify (disponible en .NET SDK)
Certificado EKUid-kp-codeSigning (RFC 5280 §4.2.1.12); NO debe tener la EKU de firma de por vida
Clave del certificadoRSA, 2048 bits o superior
Algoritmos hash compatiblesSHA-2-256, SHA-2-384, SHA-2-512
Certificado con sello de tiempoid-kp-timeStamping EKU, RSA mínimo de 2048 bits
Firmas principales por paqueteExactamente uno (autor o repositorio); no se admite la firma conjunta.

Hablemos del flujo de paquetes

En su función pública, NuGet es como una gran biblioteca ( nuget.org ) con más de 100 000 paquetes diferentes. Muchos desarrolladores de .NET/.NET Core utilizan estos paquetes a diario. NuGet también permite tener una biblioteca privada en la nube (como en Azure DevOps), en una red privada o simplemente en tu ordenador. De esta forma, solo ciertos desarrolladores con acceso a la biblioteca pueden usar esos paquetes, y puedes compartirlos con un grupo específico. Puedes obtener más información sobre estas opciones alojando tus propios feeds de NuGet. Al configurarlo de una manera determinada, puedes controlar de qué bibliotecas puede obtener paquetes un ordenador, asegurándote de que provengan de fuentes específicas y no solo de la gran biblioteca pública (nuget.org).

Sea como sea, una biblioteca es como un punto de encuentro para creadores y usuarios de paquetes. Los creadores crean paquetes NuGet útiles y los incluyen en una biblioteca. Los usuarios buscan paquetes útiles en bibliotecas accesibles, los descargan y los añaden a sus proyectos. Una vez en un proyecto, las herramientas de estos paquetes están listas para usarse en el resto del código.

Antes de profundizar en la firma de NuGet, entendamos qué es la firma de código.

La firma de código es un proceso criptográfico que consiste en adjuntar una firma digital al software para verificar su origen y garantizar que no haya sido manipulado. Esta firma digital se genera mediante una clave privada y se puede verificar con la clave pública correspondiente, lo que brinda a los usuarios confianza en la autenticidad e integridad del código.

Beneficios clave de la firma de código:

  1. Autenticidad

    La firma de código verifica la identidad del editor del software, lo que garantiza que los usuarios puedan confiar en la fuente del código.

  2. Integridad

    Adjuntar una firma digital al código puede detectar modificaciones no autorizadas, protegiéndolo contra manipulaciones.

  3. Distribución a prueba de manipulaciones

    La firma de código permite a los desarrolladores distribuir su software de forma segura, reduciendo el riesgo de alteraciones maliciosas durante el tránsito.

Comprensión de la firma NuGet

Como se mencionó anteriormente, NuGet es un gestor de paquetes popular para el desarrollo .NET, que permite a los desarrolladores compartir y consumir código fácilmente. La firma de NuGet es una extensión de la firma de código diseñada específicamente para paquetes NuGet. Al firmar un paquete NuGet, se incluye una firma digital que ofrece las mismas ventajas que la firma de código tradicional, garantizando la autenticidad e integridad del código empaquetado.

Requisitos generales de la firma de NuGet

  1. Asegúrese de que un paquete firmado siga siendo compatible con los lectores y escritores de paquetes que no admiten la firma de paquetes.

  2. Integre la firma del paquete de forma intrincada dentro del archivo del paquete.

  3. Cumpla estrictamente la regla de que cada paquete firmado debe contener exactamente una firma principal. (La co-firma está explícitamente prohibida)

  4. Lo ideal es designar la firma principal como firma de autor o de repositorio.

  5. Al aplicar una firma de autor, asegúrese de que sea la firma principal. Elimine la firma principal existente antes de agregar una firma de autor a un paquete ya firmado.

Requisitos mínimos del certificado

Un certificado de firma de NuGet DEBE cumplir los siguientes requisitos mínimos:

  1. El certificado DEBE ser válido para el propósito id-kp-codeSigning [RFC 5280 sección 4.2.1.12].

  2. El certificado DEBE tener una longitud de clave pública RSA de 2048 bits o superior.

Un certificado de sellado de tiempo DEBE cumplir los siguientes requisitos mínimos:

  1. El certificado DEBE ser válido para el propósito id-kp-timeStamping [RFC 5280 sección 4.2.1.12].

  2. El certificado DEBE tener una longitud de clave pública RSA de 2048 bits o superior.

Al firmar el paquete, el certificado DEBE estar dentro de su período de validez según el creador del paquete y NO DEBE estar revocado. Al validar el paquete, se DEBE volver a comprobar el estado de revocación del certificado ; sin embargo, los lectores de paquetes PUEDEN fallar al abrirlo si no se dispone del estado de revocación (por ejemplo, si la lista de revocación de certificados es inaccesible).

Los certificados NO DEBEN tener el EKU de firma de por vida (1.3.6.1.4.1.311.10.3.13).

Solución de firma de código empresarial

Obtenga una solución para todas sus necesidades criptográficas de firma de código de software con nuestra solución de firma de código.

Algoritmos soportados:

Se DEBEN admitir los siguientes algoritmos hash:

Algoritmo hashAlgoritmo hash-Oid
SHA-2-2562.16.840.1.101.3.4.2.1
SHA-2-3842.16.840.1.101.3.4.2.2
SHA-2-5122.16.840.1.101.3.4.2.3

Flujo de trabajo de firma de NuGet: Firma de un paquete

A continuación se describen los pasos que debe seguir el autor para firmar un paquete.

Paso 1: Determinar si el paquete está firmado.

  1. Si el paquete está firmado y la operación de firma no debe sobrescribir una firma existente: la operación de firma falla con un mensaje que dice "el paquete ya está firmado".
  2. Si el paquete está firmado y la operación de firma debo sobrescribir una firma existente: elimine la firma existente y siga el paso 2
  3. Si el paquete no está firmado, continúe con el paso 2

Paso 2 : Verificar que el certificado de firma cumpla con los requisitos mínimos (como se mencionó anteriormente).

Paso 3: Verifique que se utilicen los algoritmos de hash , firma y marca de tiempo compatibles (como se mencionó anteriormente).

Paso 4: Generar el archivo de firma del paquete

  1. Crear firma de autor
  2. Obtener una marca de tiempo de la firma del autor

    Verifique que el certificado de firma de marca de tiempo cumpla con los requisitos mínimos del certificado (como se mencionó anteriormente) y utilice el algoritmo hash compatible.

  3. Ampliar la firma del autor a CAdES-T [RFC 5126]
  4. Codificar la firma del autor CMS SignedData
  5. Escriba la firma del autor codificada en el archivo

Paso 5: Añada el archivo de firma del paquete como un archivo sin comprimir (almacenado) al paquete que se está firmando.

Paso 6: Validar el paquete firmado

  1. Determinar si el paquete está firmado (si no está firmado, detener la validación inmediatamente)
  2. Verifique que el archivo de firma del paquete sea un archivo normal y sin comprimir.
  3. Verifique que el formato de firma del paquete sea compatible.
  4. Verificar la integridad del paquete
  5. Verificar la validez y la confianza de la firma principal
  6. Si no se han encontrado fallos, trate el paquete como un paquete firmado válido.

Los comandos reales de firma y verificación

Utilizar un archivo de certificado directamente:

nuget sign MyPackage.nupkg -CertificatePath cert.pfx -CertificatePassword -Timestamper http://timestamp.digicert.com

Utilizar un certificado ya instalado en el almacén de certificados (lo cual es habitual cuando el KSP registra allí una clave respaldada por HSM):

nuget sign MyPackage.nupkg -CertificateStoreName My -CertificateStoreLocation CurrentUser -CertificateSubjectName " " -Timestamper http://timestamp.digicert.com

El SDK .NET más reciente expone la misma funcionalidad a través de dotnet nuget sign <package.nupkg> --certificate-path cert.pfx --timestamper http://timestamp.digicert.com. Verifique un paquete firmado con:

nuget verify -Signatures MyPackage.nupkg

Una verificación exitosa indica que la firma es válida y especifica el certificado de firma; un fallo indica el paso de validación específico que falló (formato de firma, integridad del paquete o confianza) en lugar de un error genérico, lo cual es útil para diagnosticar qué requisito anterior no se cumplió.

Errores comunes

ErrorCausa probableSolución
“El paquete ya está firmado”Intentar firmar un paquete que ya tiene una firma principal sin eliminarla primero.Elimine la firma existente antes de volver a firmar, ya que no se admite la firma conjunta.
Certificado rechazado durante la firmaEl certificado tiene la EKU de firma de por vida, una clave RSA de menos de 2048 bits, o carece de la EKU id-kp-codeSigning.Confirme que el certificado cumple con los tres requisitos mínimos antes de intentar firmarlo.
La verificación falla con un error de confianza.La cadena de certificados no se resuelve en una raíz de confianza, o el certificado fue revocado después de la firma.Confirme que la autoridad de certificación sea de confianza para el entorno que verifica el paquete y compruebe el estado de revocación.

Uso y limpieza de CI/CD

Para la firma repetida en una canalización, proporcione la ruta del certificado y la URL de la marca de tiempo como variables de canalización en lugar de codificarlas de forma fija, y agregue nuget verify -Signatures Como paso obligatorio inmediatamente después de la firma, para que la compilación falle en lugar de publicar un paquete no verificable. Si se copió un archivo de certificado .pfx a un agente de compilación para realizar pruebas, elimínelo una vez que se confirme que la canalización funciona correctamente y, en las canalizaciones de producción, prefiera la firma basada en el almacén de certificados (que mantiene la clave respaldada por HSM) a la firma basada en archivos.

Preguntas frecuentes

¿Puedo firmar un paquete NuGet con más de un certificado?

No. La firma conjunta está explícitamente prohibida por la especificación de firma de NuGet; un paquete puede tener exactamente una firma principal, ya sea la del autor o la del repositorio.

¿Por qué la especificación prohíbe la EKU de firma de por vida?

La EKU de firma de por vida está diseñada para que una firma permanezca válida indefinidamente, independientemente de la expiración del certificado, lo que entra en conflicto con el modelo de NuGet de validar los certificados según su período de validez declarado y su estado de revocación en el momento de la firma.

Conclusión

NuGet es un gestor de paquetes gratuito y de código abierto para el ecosistema .NET. En un mundo donde los ataques a la cadena de suministro de software van en aumento, implementar medidas de seguridad robustas como la firma de código y la firma de NuGet es fundamental. Estas prácticas generan confianza en la cadena de suministro de software, brindando a desarrolladores y usuarios finales seguridad sobre la autenticidad e integridad del código que consumen.

CodeSign Secure facilita la firma de paquetes NuGet sin complicaciones. Con la solución CodeSign Secure de Encryption Consulting, ofrecemos un método altamente eficaz y eficiente para firmar paquetes NuGet. Nuestra solución no solo garantiza la seguridad de sus paquetes mediante sólidas medidas criptográficas, sino que también agiliza el proceso de firma, mejorando la eficiencia general del ciclo de vida del desarrollo de software.

Referencias:

RFC 5126 – Firmas electrónicas avanzadas de CMS (CAdES) (ietf.org)

RFC 5280 – Perfil de certificado de infraestructura de clave pública de Internet X.509 y lista de revocación de certificados (CRL) (ietf.org)

RFC 3161 – Protocolo de marca de tiempo de infraestructura de clave pública (TSP) de Internet X.509 (ietf.org)