Guia do Desenvolvedor de Empacotamento de Aplicativos

Criando pacotes assinados

O processo de criação de pacotes assinados abrange várias etapas e requer um pouco de compreensão sobre novos conceitos e terminologias. Esta seção oferece informações sobre pacotes assinados, sua terminologia e sobre o gerenciamento de certificados. Esta seção oferece também procedimentos detalhados sobre como criar um pacote assinado.

Pacotes assinados

Um pacote assinado é um pacote com formato de fluxo normal que possui uma assinatura digital (assinatura digital PKCS7 codificada em PEM definida abaixo) que verifica o seguinte:

Um pacote assinado é idêntico a um pacote não assinado, exceto pela assinatura. Um pacote assinado é compatível em binário com um pacote não assinado. Portanto, um pacote assinado pode ser usado com as versões mais antigas das ferramentas de empacotamento. No entanto, a assinatura é ignorada nesse caso.

A tecnologia de empacotamento assinado introduz algumas novas terminologias e abreviações, que estão descritas na tabela seguinte.

Termo 

Definição 

ASN.1 

Notação de sintaxe abstrata 1 - Um forma de representar objetos abstratos. A ASN.1 define, por exemplo, um certificado de chave pública, todos os objetos que fazem parte do certificado e a ordem na qual os objetos são coletados. No entanto, a ASN.1 não específica como os objetos são serializados para armazenamento e transmissão.

X.509 

Recomendação ITU-T X.509 - Especifica a sintaxe amplamente adotada de certificado de chave pública X.509.

DER 

Regras de codificação diferenciadas - Uma representação binária de um objeto ASN.1 e define como um objeto ASN.1 é serializado para armazenamento e transmissão em ambientes de computação. 

PEM 

Mensagem de privacidade melhorada - Uma forma de codificar um arquivo (em DER ou em outro formato binário) usando a codificação de base 64 e alguns cabeçalhos opcionais. A PEM era usada inicialmente para codificação de mensagens de e-mail de tipo MIME. A PEM também é usada amplamente para codificação de certificados e chaves privadas em um arquivo que existe em um sistema de arquivos ou em uma mensagem de e-mail.

PKCS7 

Criptografia de chave pública de padrão #7 - Este padrão descreve uma sintaxe geral de dados que pode apresentar criptografia aplicada a eles, tal como assinaturas e envelopes digitais. Um pacote assinado contém uma assinatura PKCS7 integrada. Esta assinatura contém como mínimo a síntese criptografada do pacote, junto com o certificado de chave pública X.509 do assinante. O pacote assinado também pode conter cadeia de certificados. A cadeia de certificados pode ser usada ao formar uma cadeia de confiança a partir do certificado do assinante até um certificado de confiança armazenado localmente. 

PKCS12 

Criptografia de chave pública de padrão #12 - Este padrão descreve uma sintaxe para armazenamento de objetos criptografados em disco. A chave de armazenamento de pacote é mantida neste formato. 

Chave de armazenamento de pacote 

Um repositório de certificados e chaves que pode ser consultado pelas ferramentas do pacote. 

Gerenciamento de certificado

Antes de criar um pacote assinado, você deve ter uma chave de armazenamento de pacote. Esta chave de armazenamento de pacote contém certificados na forma de objetos. Existem dois tipos de objetos em uma chave de armazenamento de pacote:

Certificados de confiança

Um certificado de confiança que contém um certificado único de chave pública que pertence a outra entidade. O certificado de confiança tem essa denominação porque o proprietário da chave de armazenamento confia realmente que a chave pública do certificado pertence à identidade indicada pelo “sujeito” (proprietário) do certificado. O emissor do certificado se responsabiliza por esta confiança assinando o certificado.

Os certificados de confiança são usados na verificação de assinaturas e ao iniciar uma conexão a um servidor seguro (SSL).

Chave de usuário

Uma chave de usuário conserva informações criptográficas importantes que diferenciam maiúsculas e minúsculas. Esta informação é armazenada em um formato protegido para evitar acesso não autorizado. Uma chave de usuário está formada pela chave privada do usuário e pelo certificado de chave pública que corresponde à chave privada.

As chaves de usuário são usadas ao criar um pacote assinado.

Por padrão, a chave de armazenamento de pacote é armazenada no diretório /var/sadm/security. Os usuários individuais também podem ter suas próprias chaves de armazenamento armazenadas por padrão no diretório $HOME/.pkg/security.

No disco, uma chave de armazenamento de pacote pode se apresentar em dois formatos: formato de vários arquivos e formato de arquivo único. O formato de vários arquivos armazena seus objetos em vários arquivos. Cada tipo de objeto é armazenado em um arquivo diferente. Todos os arquivos devem ser criptografados usando a mesma frase-senha. Uma chave de armazenamento de arquivo único armazena todos os seus objetos em um único arquivo no sistema de arquivos.

O principal utilitário usado para gerenciar os certificados e a chave de armazenamento de pacote é o comando pkgadm. As subseções seguintes descrevem as tarefas mais comuns usadas para gerenciamento de chaves de armazenamento de pacote.

Adicionando certificados de confiança à chave de armazenamento de pacote

Um certificado de confiança pode ser adicionado à chave de armazenamento de pacote usando o comando pkgadm. O certificado pode estar no formato PEM ou DER. Por exemplo:


$ pkgadm addcert -t /tmp/mytrustedcert.pem

Neste exemplo, o certificado em formato PEM denominado mytrustedcert.pem é adicionado à chave de armazenamento de pacote.

Adicionando um certificado de usuário e chave privada à chave de armazenamento de pacote

O comando pkgadm não gera certificados de usuário nem chaves privadas. Os certificados de usuário e chaves privadas são obtidos normalmente de uma Autoridade de certificado, tal como Verisign. Ou, são gerados localmente tal como um certificado auto-assinado. Uma vez a chave e o certificado tenham sido obtidos, eles podem ser importados para a chave de armazenamento de pacote usando o comando pkgadm. Por exemplo:


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

Neste exemplo, são usadas as seguintes opções:

-n myname

Identifica a entidade (myname) da chave de armazenamento de pacote na qual você deseja operar. A entidade myname se torna o alias no qual os objetos são armazenados.

-e /tmp/myprivkey.pem

Especifica o arquivo que contém a chave privada. Neste caso, o arquivo é myprivkey.pem, que está localizado no diretório /tmp.

/tmp/mypubcert.pem

Especifica o arquivo de certificado no formato PEM denominado mypubcert.pem .

Verificando o conteúdo na chave de armazenamento de pacote

O comando pkgadm também é usado para visualizar o conteúdo da chave de armazenamento de pacote. Por exemplo:


$ pkgadm listcert

Este comando exibe os certificados de confiança e as chaves privadas da chave de armazenamento de pacote.

Excluindo certificados de usuário e chaves privadas da chave de armazenamento de pacote

O comando pkgadm pode ser usado para excluir certificados de confiança e chaves privadas da chave de armazenamento de pacote.

Ao excluir os certificados de usuários, o alias do par certificado/chave deve ser especificado. Por exemplo:


$ pkgadm removecert -n myname

O alias do certificado é o nome comum do certificado, que pode ser identificado usando o comando pkgadm listcert. Por exemplo, este comando exclui um certificado de confiança intitulado Trusted CA Cert 1:


$ pkgadm removecert -n "Trusted CA Cert 1"

Observação –

Se você possuir tanto um certificado de confiança quanto um certificado de usuário armazenado usando o mesmo alias, ambos são excluídos quando a opção -n for especificada.


Criação de pacotes assinados

O processo de criação de pacotes assinados apresenta três etapas básicas:

  1. A criação de um pacote não assinado no formato de diretório.

  2. A importação do certificado assinado, certificados CA, e da chave privada para a chave de armazenamento de pacote.

  3. A assinatura do pacote da Etapa 1 com os certificados da Etapa 2.


Observação –

As ferramentas de empacotamento não criam certificados. Estes certificados devem ser obtidos de uma Autoridade de certificado, tal como Verisign ou Thawte.


Cada etapa da criação de pacotes assinados está descrita nos procedimentos seguintes.

ProcedureComo criar um pacote não assinado no formato de diretório

O procedimento para a criação de um pacote não assinado no formato de diretório é igual ao procedimento para a criação de um pacote normal, conforme descrito previamente neste manual. O procedimento seguinte descreve o processo de criação do pacote não assinado no formato de diretório. Se você precisar de mais informações, consulte as seções anteriores sobre a construção de pacotes.

  1. Crie o arquivo pkginfo.

    O arquivo pkginfo deve ter o seguinte conteúdo básico:


    PKG=SUNWfoo
    BASEDIR=/
    NAME=My Test Package
    ARCH=sparc
    VERSION=1.0.0
    CATEGORY=application
  2. Crie um arquivo prototype.

    O arquivo prototype deve ter o seguinte conteúdo 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. Liste o conteúdo do diretório de origem do objeto.

    Por exemplo:


    $ ls -lR /tmp/myroot
    

    A saída seria semelhante à seguinte:


    /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. Crie o pacote não assinado.


    pkgmk -d `pwd`
    

    A saída seria semelhante à seguinte:


    ## 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.

    O pacote existe agora no diretório atual.

ProcedureComo importar os certificados para a chave de armazenamento de pacote

O certificado e a chave privada que serão importados devem existir como chave privada e certificado X.509 codificado em DER ou PEM. Além disso, o intermediário ou a “cadeia” de certificados que unem seu certificado assinado à Autoridade de certificado devem ser importados para a chave de armazenamento de pacote antes que um pacote seja assinado.


Observação –

Cada Autoridade de certificado pode emitir certificados em vários formatos. Para extrair os certificados e a chave privada do arquivo PKCS12 e colocar no arquivo X.509 codificado em PEM (apropriado para a importação à chave de armazenamento de pacote), use um utilitário de conversão de software gratuito como o OpenSSL.


Se a sua chave privada estiver criptografada (que deveria ser geralmente o caso), você é solicitado a introduzir uma frase-senha. Você também será solicitado a introduzir uma senha para proteger a chave de armazenamento de pacote resultante. Você tem a opção de não fornecer a senha, mas como conseqüência a chave de armazenamento de pacote não será criptografada.

O procedimento seguinte descreve como importar os certificados usando o comando pkgadm uma vez o certificado esteja no formato apropriado.

  1. Importe todos os certificados de Autoridade de certificado encontrados no seu arquivo de certificado X.509 codificado em DER ou PEM.

    Por exemplo, para importar todos os certificados de Autoridade de certificado encontrados no arquivo ca.pem, você deve digitar o seguinte:


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

    A saída seria semelhante à seguinte:


    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

    A fim de importar sua chave assinada para a chave de armazenamento de pacote, você deve fornecer um alias que será usado mais tarde ao assinar o pacote. Este alias também pode ser usado se quiser excluir a chave da chave de armazenamento de pacote.

    Por exemplo, para importar sua chave assinada do arquivo sign.pem, você deve digitar o seguinte:


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

    A saída seria semelhante à seguinte:


    Enter PEM passphrase:
    Enter Keystore Password: 
    Successfully added Certificate <sign.pem> with alias <mycert>
  2. Verifique se os certificados estão na chave de armazenamento de pacote.

    Por exemplo, para visualizar os certificados na chave de armazenamento criada na etapa anterior, você deve digitar o seguinte:


    $ pkgadm listcert -k ~/mykeystore
    

ProcedureComo assinar o pacote

Uma vez os certificados tenham sido importados para a chave de armazenamento de pacote, você pode assinar o pacote. A assinatura real do pacote é realizada com o comando pkgtrans.

  1. Assine o pacote usando o comando pkgtrans. Forneça o local do pacote não assinado e o alias da chave para assinar o pacote.

    Por exemplo, usando os exemplos dos procedimentos anteriores, você deve digitar o seguinte para criar um pacote assinado denominado SUNWfoo.signed:


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

    A saída deste comando seria semelhante à seguinte:


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

    O pacote assinado é criado no arquivo SUNWfoo.signed e está no formato de fluxo de pacote. Este pacote assinado é apropriado para copiar em um site da Web e ser instalado usando o comando pkgadd e um URL.