¿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.
Un paquete NuGet es un archivo comprimido, identificable por la extensión .nupkg, que incluye código compilado (DLL), archivos asociados y un manifiesto descriptivo que detalla atributos como la versión del paquete. Los desarrolladores que desean compartir su código generan estos paquetes y los publican en un host público o privado. Los usuarios de estos paquetes los recuperan de los hosts adecuados, los integran en sus proyectos y, posteriormente, invocan la funcionalidad del paquete en el código de su proyecto. NuGet gestiona todos los detalles intermedios sin problemas.
La versatilidad de NuGet se extiende tanto al alojamiento público de nuget.org como a la compatibilidad con hosts privados. Esta flexibilidad permite utilizar paquetes NuGet para compartir código exclusivamente dentro de una organización o grupo de trabajo. Además, los desarrolladores pueden emplear paquetes NuGet como un método optimizado para modularizar su código y usarlo exclusivamente en sus proyectos. Un paquete NuGet es una unidad de código distribuible sin requisitos ni implicaciones especÃficas en cuanto al modo de uso compartido.
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:
-
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.
-
Integridad
Adjuntar una firma digital al código puede detectar modificaciones no autorizadas, protegiéndolo contra manipulaciones.
-
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
-
Asegúrese de que un paquete firmado siga siendo compatible con los lectores y escritores de paquetes que no admiten la firma de paquetes.
-
Integre la firma del paquete de forma intrincada dentro del archivo del paquete.
-
Cumpla estrictamente la regla de que cada paquete firmado debe contener exactamente una firma principal. (La co-firma está explÃcitamente prohibida)
-
Lo ideal es designar la firma principal como firma de autor o de repositorio.
-
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:
-
El certificado DEBE ser válido para el propósito id-kp-codeSigning [RFC 5280 sección 4.2.1.12].
-
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:
-
El certificado DEBE ser válido para el propósito id-kp-timeStamping [RFC 5280 sección 4.2.1.12].
-
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).
Algoritmos soportados:
Se DEBEN admitir los siguientes algoritmos hash:
| Algoritmo hash | Algoritmo hash-Oid |
| SHA-2-256 | 2.16.840.1.101.3.4.2.1 |
| SHA-2-384 | 2.16.840.1.101.3.4.2.2 |
| SHA-2-512 | 2.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.
- 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".
- 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
- 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
- Crear firma de autor
- 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.
- Ampliar la firma del autor a CAdES-T [RFC 5126]
- Codificar la firma del autor CMS SignedData
- 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
- Determinar si el paquete está firmado (si no está firmado, detener la validación inmediatamente)
- Verifique que el archivo de firma del paquete sea un archivo normal y sin comprimir.
- Verifique que el formato de firma del paquete sea compatible.
- Verificar la integridad del paquete
- Verificar la validez y la confianza de la firma principal
- Si no se han encontrado fallos, trate el paquete como un paquete firmado válido.
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)
