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.
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:
O pacote vem da entidade que o assinou
A entidade o assinou realmente
O pacote não foi modificado depois que a entidade o assinou
A entidade que o assinou é de confiança
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.
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:
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).
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.
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.
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 . |
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.
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" |
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.
O processo de criação de pacotes assinados apresenta três etapas básicas:
A criação de um pacote não assinado no formato de diretório.
A importação do certificado assinado, certificados CA, e da chave privada para a chave de armazenamento de pacote.
A assinatura do pacote da Etapa 1 com os certificados da Etapa 2.
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.
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.
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 |
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 |
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 |
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.
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.
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.
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> |
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 |
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.
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.