2010-01-07 11 views
26

Más específicamente, un conjunto de biblioteca de clases. Mis pensamientos iniciales:¿Quién debe poseer la clave privada utilizada para firmar un ensamblado .NET cuando su proyecto es de código abierto?

  • Haga que algunos administradores designados realicen toda la firma de la asamblea. Pero luego, cuando se escriben las correcciones de fallas y las nuevas versiones, los binarios finalmente dependen de que estén cerca (incluso si es solo un pequeño cambio por razones privadas).
  • La clave podría estar públicamente disponible. Pero eso va en contra de las prácticas de criptografía de clave pública y usted pierde la ventaja de la confianza y la identidad.
  • Permita que los desarrolladores finales y los distribuidores lo firmen con sus propias claves. Pero luego pierde la modularización ya que cada nueva firma lo hace incompatible con algunas de las otras versiones.

Claro, no podría firmar el montaje. Pero si otro proyecto que requiere que su ensamblado sea firmado hace referencia a su biblioteca, obtendrá un error de compilación.

+1

Dije: "¡Dame las llaves!" –

Respuesta

11

Recientemente he encontrado el mismo problema en un proyecto de código abierto que mantengo. Así es como me dirigí a este tema:

  • fuentes son siempre disponible para dowload a través del diccionario, sino una liberación consistirá en una instantánea de las fuentes, además de una versión compilada.
  • Antes de hacer disponible la versión compilada, firmo los ensamblajes con mi clave privada.

Por lo tanto, en su caso, quien prepare el lanzamiento debe tener la llave. No es necesario que los desarrolladores de la biblioteca lo sepan en absoluto.

Si los usuarios finales quieren volver a compilar y firmar con sus propias claves, está bien. Puede distinguir entre los archivos binarios que tiene usted y los demás comparando la clave pública que está presente en los conjuntos firmados. Haga que la clave pública esté disponible y otros puedan hacer lo mismo.

La gestión de este proceso resulta un poco engorrosa cuando se usa InternalsVisibleToAttribute para referirse a ensamblajes de nombre seguro. Puede leer sobre cómo me dirigí a ese problema here.

+0

¡Buen punto, agregue InternalsVisibleAttribute a la lista de requisitos de nombre seguro! Esto podría funcionar, ya que nadie más puede suplantar a su ensamblado sin comprometer primero el código. – Joe

1

Por lo que puedo recordar, nunca me encontré con un proyecto de código abierto firmado. Si lo necesitaba firmado por alguna razón, lo firmé yo mismo. Realmente no puedo ver una ventaja al firmar una asamblea como tal. Si le preocupa que la versión binaria precompilada se haya firmado, entonces diría que la administración del proyecto debe tener esa clave. Una persona que crea un proyecto firmado a través de debe ser completamente capaz de agregar el código fuente a su proyecto, o crear la firma necesaria del proyecto y compilarlo por sí mismo.

+1

* Debe * firmar * un binario para poder instalarlo en el GAC, por lo tanto, sí, hay una ventaja para hacerlo. –

+1

Además, también debe firmarlo si otro proyecto lo hace referencia y ese otro proyecto necesita ser firmado por cualquier razón. De lo contrario, ni siquiera compilará. – Joe

2

En Código abierto, la "fuente" está abierta. Binarios generalmente se proporcionan solo para productos básicos.

No es necesario que la fuente esté firmada; si el binario está firmado, el generador del binario es también el propietario de la clave secreta (que se mantendrá en secreto).

+0

No estoy de acuerdo. Solo los ensamblados firmados pueden ser GACced. –

+1

No estoy de acuerdo. Es bastante común que el código abierto distribuya las versiones oficiales firmadas y solo una persona autorizada puede realizar el lanzamiento firmado. La fuente no debe incluir la clave privada. –

+0

Sí, por productos básicos que hacen, y cuando lo hacen, el mantenedor oficial del binario lo firma. Pero si es realmente de código abierto, puede descargar el código fuente, generar su ensamblaje y firmarlo con su propia clave privada. Las claves privadas son privadas, nunca se distribuirán a ninguna fuente no confiable (como internet) o yo podría simplemente suplantar su identidad para que usted crea que el binario que le estoy dando puede ser confiable cuando no puede. –

2

La pregunta realmente gira en torno a quién decide qué es un lanzamiento, ¿no es así? Si eso es así, creo que los lanzamientos deben estar firmados con una clave personal del que realmente es responsable del lanzamiento. Si hay varias personas responsables de crear comunicados, no hay nada de malo en que compartan la clave, excepto por los mayores riesgos de tener que revocar/volver a emitir la clave si uno de los miembros de este grupo se va.

En un ámbito más amplio, hay que admitir que .net realmente no se ocupa de volver a utilizar ensamblajes entre varias aplicaciones instaladas. Mira en tu carpeta SxS! Entonces, otra forma siempre sería que el distribuidor del ensamble lo firme con su propia llave. p.ej. si un proyecto usa log4net, debe firmar el ensamblaje log4net con su propia clave para asumir la responsabilidad de su contenido.

4

Por mi parte, no me importaría si más proyectos que probablemente solo utilizará como referencia en lugar de editar y volver a compilar ofrecerían una versión "firmada" de la dll. Eso ayudaría a confiar en una referencia a .dll existente más rápido que al verificar el código y compilar el suyo.

En una gran cantidad de proyectos de código abierto hay una especie de "padre" del esfuerzo, piensa Linus o incluso John Gruber para ver ejemplos. Estas personas podrían tener la clave o distribuirla a un administrador de confianza para firmar las principales versiones.

+0

Muchos proyectos de software libre/de código abierto le proporcionan un archivo tarball o .zip o lo que sea para descargar, junto con una suma de comprobación. De esa forma, puedes saber si estás obteniendo la verdadera fuente. Eso suena como una forma primitiva de firmar para mí. –

+0

La suma de comprobación es una gran manera de verificar que obtenga lo que se proporcionó sin alteración ni pérdida de datos. Firmar un ensamble también asegura que no haya sido manipulado. Pero también se usa como un nivel de identidad por proyecto/compañía, mientras que una suma de comprobación es una firma en el nivel por binario. – Joe

1

Almacene la clave privada fuera de la raíz del control de origen pero a la que se hace referencia con una ruta relativa. De esa forma, otros pueden construir usando su propia clave. Van a estar fuertemente firmados, pero no en versiones oficiales.

Configura una construcción automática que tiene el árbol de fuente completo y la clave privada.La construcción automática puede hacer construcciones oficiales firmadas que se pueden lanzar todas las noches o lo que sea. De esta forma, hacer compilaciones oficiales es automático, por lo que la persona autorizada que tenga la clave privada no necesariamente debe participar (aunque debe tener algún mecanismo para validar los parches aportados por la comunidad antes de incluirlo en una compilación oficial, pero eso es un problema aparte De Verdad).

3

El nombre fuerte no está destinado a proporcionar autenticidad, validación, protección ni nada por el estilo. Su único objetivo es proporcionar una identificación única a un conjunto o serie de conjuntos. Esto es para que pueda tener muchos ensamblajes llamados "Biblioteca" en el GAC, y cuando su aplicación le pida al motor de ejecución que cargue "Biblioteca", el sistema sabe que esto significa su ensamblado "Biblioteca" y no el de otra persona.

En vista de esto, simplemente incluiría la clave de nombre seguro en el árbol de fuentes. Si por alguna razón su proyecto quiere proporcionar autenticidad o cualquiera de esas otras cosas, entonces probablemente desee la firma de Authenticode, que no es gratuita y que probablemente sea innecesaria para un proyecto de código abierto. Si decides seguir esa ruta y te preguntas quién debería poseer la clave de firma de código, eso se convierte en una cuestión más política.

Cuestiones relacionadas