Guía del desarrollador para la creación de paquetes de aplicaciones

Creación de paquetes firmados

El proceso de creación de paquetes firmados implica varios pasos y requiere cierta comprensión de los nuevos conceptos y la terminología. En esta sección se ofrece información sobre paquetes firmados, su terminología, así como información sobre administración de certificados. Esta sección también ofrece procedimientos detallados sobre cómo crear un paquete firmado.

Paquetes firmados

Un paquete firmado tiene formato de flujo normal que cuenta con una firma digital (firma digital PKCS7 con código PEM que se define a continuación) que verifica lo siguiente:

La firma es la única diferencia entre un paquete firmado y otro sin firmar. Un paquete firmado es compatible en el nivel binario con un paquete sin firmar. Por ello se puede usar un paquete firmado con versiones anteriores de las herramientas de creación de paquetes. Sin embargo, la firma se ignora en este caso.

La tecnología de creación de paquetes firmados presenta nueva terminología y abreviaturas que se describen en la tabla siguiente.

Término 

Definición 

ASN.1 

Notación de sintaxis abstracta 1: modo de expresar objetos abstractos. Por ejemplo, ASN.1 define un certificado de clave pública, todos los objetos que componen el certificado, y el orden en el que los objetos se recogen. Sin embargo, ASN.1 no especifica cómo los objetos se serializan para el almacenamiento o la transmisión.

X.509 

Recomendación ITU-T X.509: especifica la sintaxis del certificado de clave pública X.509 ampliamente adoptado.

DER 

Normas de codificación distinguidas: representación binaria de un objeto ASN.1 y define cómo un objeto ASN.1 se serializa para el almacenamiento o la transmisión en los entornos computacionales. 

PEM 

Mensaje de privacidad mejorada: forma de codificar un archivo (en DER u otro formato binario) mediante codificación base 64 y algunos encabezados optativos. PEM se utilizaba inicialmente para codificar mensajes de correo electrónico de tipo MIME. PEM también se usa ampliamente para codificar certificados y claves privadas en un archivo que existe en un sistema de archivos o en un mensaje de correo electrónico.

PKCS7 

Estándar de criptografía de clave pública n.º 7: este estándar describe una sintaxis general para datos a los que se ha aplicado criptografía, como firmas y sobres digitales. Un paquete firmado contiene una firma PKCS7 incorporada. Esta firma contiene como mínimo la recopilación cifrada del paquete, junto con el certificado de clave pública X.509 del firmante. El paquete firmado también puede contener certificados en cadena. Se pueden usar los certificados en cadena al formar una cadena de confianza del certificado del firmante a un certificado de confianza almacenado localmente. 

PKCS12 

Estándar de criptografía de clave pública n.º 12: este estándar describe una sintaxis para almacenar objetos criptográficos en el disco. El almacén de claves de paquetes se mantiene en este formato. 

Almacén de claves de paquetes 

Depósito de certificados y claves que las herramientas de paquetes pueden consultar. 

Administración de certificados

Antes de crear un paquete firmado, debe tener un almacén de claves de paquetes. Este almacén de claves de paquetes contiene certificados en forma de objetos. Hay dos tipos de objetos en un almacén de claves de paquetes:

Certificado de confianza

Un certificado de confianza contiene un único certificado de clave pública que pertenece a otra entidad. El certificado de confianza se nombra de este modo porque el propietario del almacén de claves confía en que la clave pública del certificado pertenece en realidad a la identidad indicada por el "sujeto" (propietario) del certificado. El emisor del certificado da fe de esta confianza al firmar el certificado.

Los certificados de confianza se usan al verificar firmas y al iniciar una conexión con un servidor (SSL) seguro.

Clave de usuario

Una clave de usuario contiene información de clave criptográfica sensible. Esta información se almacena con un formato protegido para impedir el acceso no autorizado. Una clave de usuario se compone de la clave privada del usuario y el certificado de clave pública que se corresponde con la clave privada.

Las claves de usuario se usan al crear un paquete firmado.

De forma predeterminada, el almacén de claves de paquetes se encuentra en el directorio /var/sadm/security. Cada uno de los usuarios también puede tener su propio almacén de claves guardado de forma predeterminada en el directorio $HOME/.pkg/security.

En el disco, un almacén de claves de paquetes puede estar en dos formatos: formato de varios archivos y formato de un único archivo. Un formato de varios archivos almacena sus objetos en varios archivos. Cada tipo de objeto se almacena en un archivo aparte. Todos estos archivos se deben cifrar mediante las mismas frases de contraseña. Un almacén de claves de un único archivo guarda todos sus objetos en un único archivo del sistema de archivos.

La utilidad principal que se usa para administrar los certificados y el almacén de claves de paquetes es el comando pkgadm. Las subsecciones siguientes describen las tareas más habituales utilizadas par administrar el almacén de claves de paquetes.

Adición de certificados de confianza al almacén de claves de paquetes

Se puede agregar un certificado de confianza al almacén de claves de paquetes mediante el comando pkgadm. El certificado puede tener formato PEM o DER. Por ejemplo:


$ pkgadm addcert -t /tmp/mytrustedcert.pem

En este ejemplo, el certificado con formato PEM llamado mytrustedcert.pem se agrega al almacén de claves de paquetes.

Adición de un certificado de usuario y de una clave privada al almacén de claves de paquetes

El comando pkgadm no genera certificados de usuarios o claves privadas. Los certificados de usuario y las claves privadas se obtienen normalmente de una autoridad de certificados, como Verisign. O bien, se generan localmente como certificado autofirmado. Tras obtener la clave y el certificado, se pueden importar al almacén de claves de paquetes mediante el comando pkgadm. Por ejemplo:


pkgadm addcert -n myname -e /tmp/myprivkey.pem /tmp/mypubcert.pem

En este ejemplo se usan las opciones siguientes:

-n mi_nombre

Identifica a la entidad (mi_nombre) en el almacén de claves de paquetes donde desea trabajar. La entidad myname se convierte en alias en el que se almacenan los objetos.

-e /tmp/mi_clave_privada.pem

Especifica el archivo que contiene la clave privada. En este caso, el archivo es myprivkey.pem y se encuentra en el directorio /tmp.

/tmp/mi_certificado_público.pem

Especifica el archivo de certificado con formato PEM llamado mi_certificado_público.pem.

Comprobación del contenido en el almacén de claves de paquetes

El comando pkgadm también se usa para ver el contenido del almacén de claves de paquetes. Por ejemplo:


$ pkgadm listcert

Este comando muestra los certificados de confianza y las claves privadas en el almacén de claves de paquetes.

Eliminación de certificados de confianza y claves privadas del almacén de claves de paquetes

El comando pkgadm se puede usar para suprimir certificados de confianza y claves privadas del almacén de claves de paquetes.

Cuando suprime certificados de usuarios, debe especificarse el alias del par certificado/clave. Por ejemplo:


$ pkgadm removecert -n myname

El alias del certificado es el nombre habitual del certificado que se puede identificar mediante el comando pkgadm listcert. Por ejemplo, este comando suprime un certificado de confianza de nombre Trusted CA Cert 1:


$ pkgadm removecert -n "Trusted CA Cert 1"

Nota –

Si tiene un certificado de confianza y un certificado de usuario almacenados con el mismo alias se suprimen cuando especifica la opción -n.


Creación de paquetes firmados

El proceso de crear paquetes firmados implica tres pasos básicos:

  1. Creación de un paquete con formato de directorio sin firmar.

  2. Importación del certificado de firma, certificados de AC y clave privada en el almacén de claves de paquetes.

  3. Firma del paquete del paso 1 con los certificados del paso 2.


Nota –

Las herramientas de creación de paquetes no crean certificados. Estos certificados se deben obtener de una autoridad de certificados, como Verisign o Thawte.


Cada uno de los pasos para crear paquetes firmados se describe en los procedimientos siguientes.

ProcedureCómo crear un paquete con formato de directorio sin firmar

El procedimiento para crear un paquete con formato de directorio sin firmar es el mismo que para crear un paquete normal, tal como se ha descrito previamente en este manual. El procedimiento siguiente describe el proceso de crear este paquete con formato de directorio sin firmar. Si necesita más información, consulte las secciones anteriores sobre la construcción de paquetes.

  1. Cree el archivo pkginfo.

    El archivo pkginfo debe tener el siguiente contenido básico:


    PKG=SUNWfoo
    BASEDIR=/
    NAME=My Test Package
    ARCH=sparc
    VERSION=1.0.0
    CATEGORY=application
  2. Cree el archivo prototype.

    El archivo prototype debe tener el siguiente contenido básico:


    $cat prototype
    i pkginfo
    d none usr 0755 root sys
    d none usr/bin 0755 root bin
    f none usr/bin/myapp=/tmp/myroot/usr/bin/myapp 0644 root bin
  3. Enumere el contenido del directorio de origen de objetos.

    Por ejemplo:


    $ ls -lR /tmp/myroot
    

    La salida tendría un aspecto similar al siguiente:


    /tmp/myroot:
    total 16
    drwxr-xr-x   3 abc      other        177 Jun  2 16:19 usr
    
    /tmp/myroot/usr:
    total 16
    drwxr-xr-x   2 abc      other        179 Jun  2 16:19 bin
    
    /tmp/myroot/usr/bin:
    total 16
    -rw-------   1 abc      other       1024 Jun  2 16:19 myapp
  4. Cree el paquete sin firma.


    pkgmk -d `pwd`
    

    La salida tendría un aspecto similar al siguiente:


    ## Building pkgmap from package prototype file.
    ## Processing pkginfo file.
    WARNING: parameter <PSTAMP> set to "syrinx20030605115507"
    WARNING: parameter <CLASSES> set to "none"
    ## Attempting to volumize 3 entries in pkgmap.
    part  1 -- 84 blocks, 7 entries
    ## Packaging one part.
    /tmp/SUNWfoo/pkgmap
    /tmp/SUNWfoo/pkginfo
    /tmp/SUNWfoo/reloc/usr/bin/myapp
    ## Validating control scripts.
    ## Packaging complete.

    El paquete existe en el directorio actual.

ProcedureCómo importar certificados al almacén de claves de paquetes

El certificado y la clave privada que se vayan a importar deben existir como certificado X.509 con codificación PEM o DER y clave privada. Asimismo, los certificados intermedios o de cadena que vinculen el certificado con firma al certificado de Autoridad de certificados se debe importar al almacén de claves de paquetes antes de que un paquete se pueda firmar.


Nota –

Cada autoridad de certificados puede emitir certificados en diversos formatos. Para extraer los certificados y la clave privada del archivo PKCS12 a un archivo X.509 con codificación PEM (adecuado para importar al almacén de claves de paquetes), use una utilidad de conversión de software gratuito como OpenSSL.


Si la clave privada se cifra (lo cual sería normal), se le pedirá la frase de contraseña. Asimismo, se le pedirá una contraseña para proteger el almacén de claves de paquetes resultante. Si lo desea puede evitar el uso de una contraseña, pero con ello obtendrá un almacén de claves de paquetes sin cifrar.

El procedimiento siguiente describe cómo importar los certificados mediante el comando pkgadm una vez que el certificado tenga el formato adecuado.

  1. Importe todos los certificados de Autoridad de certificados que se encuentren en el archivo de certificado X.509 con codificación PEM o DER.

    Por ejemplo, para importar todos los certificados de Autoridad de certificados que se encuentren en el archivo ca.pem, debería escribir lo siguiente:


    $ pkgadm addcert -k ~/mykeystore -ty ca.pem
    

    La salida tendría un aspecto similar al siguiente:


    Trusting certificate <VeriSign Class 1 CA Individual \
    Subscriber-Persona Not Validated>
    Trusting certificate </C=US/O=VeriSign, Inc./OU=Class 1 Public \
    Primary Certification Authority
    Type a Keystore protection Password.
    Press ENTER for no protection password (not recommended): 
    For Verification: Type a Keystore protection Password.
    Press ENTER for no protection password (not recommended): 
    Certificate(s) from <ca.pem> are now trusted

    Con el fin de importar la clave de firma al almacén de claves de paquetes, debe proporcionar un alias que se utilice posteriormente al firmar el paquete. Este alias también se puede usar si desea suprimir la clave del almacén de claves de paquetes.

    Por ejemplo, para importar la clave de firma del archivo sign.pem, debería escribir lo siguiente:


    $ pkgadm addcert -k ~/mykeystore -n mycert sign.pem
    

    La salida tendría un aspecto similar al siguiente:


    Enter PEM passphrase:
    Enter Keystore Password: 
    Successfully added Certificate <sign.pem> with alias <mycert>
  2. Compruebe que los certificados se encuentren en el almacén de claves de paquetes.

    Por ejemplo, para ver los certificados del almacén de claves creados en el paso anterior, debería escribir lo siguiente:


    $ pkgadm listcert -k ~/mykeystore
    

ProcedureCómo firmar el paquete

Cuando los certificados se importan al almacén de claves de paquetes puede firmar el paquete. La firma real del paquete se lleva a cabo mediante el comando pkgtrans.

  1. Firme el paquete mediante el comando pkgtrans. Indique la ubicación del paquete sin firmar y el alias de la clave para firmar el paquete.

    Por ejemplo, de acuerdo con los procedimientos anteriores, debería escribir lo siguiente para crear un paquete firmado llamado SUNWfoo.signed:


    $ pkgtrans -g -k ~/mykeystore -n mycert . ./SUNWfoo.signed SUNWfoo
    

    La salida de este comando tendría un aspecto similar al siguiente:


    Retrieving signing certificates from keystore </home/user/mykeystore>
    Enter keystore password:
    Generating digital signature for signer <Test User>
    Transferring <SUNWfoot> package instance

    El paquete firmado se crea en el archivo SUNWfoo.signed y se encuentra en el formato de flujo de paquete. Este paquete firmado es adecuado para copiarlo en un sitio web e instalarse mediante el comando pkgadd y un URL.