VB 2005 - Assinando Assemblies com nomes fortes


Quando você cria um projeto .NET no Visual Studio 2005 ele é compilado na forma de um assembly. Por padrão este assembly esta aberto e não possui nenhuma segurança que assegure aos usuários da aplicação que eles estão usando a versão correta do arquivo binário.

Você contorna este problema assinando o seu assembly através da atribuição de  um 'nome forte' para a aplicação compilada ou componente a qual pode desta forma ser identificada de forma única por outras aplicações e administradores de sistemas que podem então aplicar uma política de segurança para a aplicação. Assim você pode garantir que um nome seja globalmente exclusivo assinando um assembly com um nome forte.

Antes de mostrar diretamente como você pode assinar os seus assemblies, tornando-os assim mais seguros e confiáveis, vamos abordar alguns conceitos básicos como: Global Assembly Cache e assemblies fortemente nomeados.

Assembly fortemente assinados

Um nome forte consiste de partes que identificam de forma única a identidade de um assembly. Isto inclui seu nome de texto simples, número de versão, e informações de cultura (se fornecido) . A estes elementos é adicionada uma chave pública e uma assinatura digital.

Esta assinatura digital será gerada a partir de um arquivo Assembly (o arquivo que contém o manifesto do Assembly, que por sua vez contém os nomes e hashes de todos os arquivos que compõem o assembly), usando a chave particular correspondente. A utilização da chave privada/pública com a assinatura digital tornam os nomes fortes altamente confiáveis de forma a serem únicos.

Você pode usar o Visual Studio 2005 ou outras ferramentas fornecidas pela plataforma .NET para atribuir nomes fortes para um Assembly.

Quando você usa um nome forte você pode ter a certeza que a versão do seu assembly é realmente aquela que foi distribuída além de que nenhuma alteração pode ser feita sem que isto venha afetar a assinatura do assembly e assim quebrar a sua compatibilidade com o nome forte gerado.

Segundo a Microsoft a utilização de assembly com nomes fortes apresentam os seguintes benefícios:

A utilização dos nomes fortes permitem aos administradores de sistema definir uma política de segurança para a sua aplicação usando a referência de nome único criada. Desta forma existe a certeza que uma vez criada e distribuída, a aplicação irá se comportar de forma esperada pois o código não pode ser contaminado sem afetar a assinatura do nome forte.

O Global Assembly Cache (GAC)

Cada computador que possui a plataforma .NET instalada possui um cache que armazena todos os assemblies que serão compartilhados com aplicações múltiplas. Neste cache (armazenado em uma pasta no diretório do Windows) você vai encontrar os componentes da Common language runtime- CLR bem como outros arquivos binários registrados que você ou qualquer outra pessoa pode utilizar.

Se um assembly é usado somente por uma aplicação então ele será disponibilizado na pasta da aplicação, porém se você estiver compartilhando o assembly entre muitas aplicações e deseja armazenar o assembly no GAC então o seu assembly precisa ser fortemente assinado. Você não tem escolha pois o GAC investiga todos os arquivos para ter certeza de que sua integridade é válida.

Assinando um Assembly. (Fonte Microsoft)

Você pode assinar um conjunto com um  nome de alta segurança de duas maneiras:

Você deve ter um par de chaves de criptografia para assinar um conjunto com um nome de alta segurança.

1- Para criar e assinar um conjunto com um nome de alta segurança usando o vinculador assembly

O exemplo a seguir assina o conjunto MyAssembly.dll com um nome de alta segurança usando o arquivo sgKey.snk de chave.

al /out:MyAssembly.dll MyModule.netmodule /keyfile:sgKey.snk

2- Para assinar um conjunto com um nome de alta segurança com atributos

Do AssemblyKeyFileAttribute exemplo usa o seguinte código com um arquivo de chave chamado sgKey.snk, localizado na pasta onde o conjunto é compilado. Isso pressupõe que o conjunto é compilado usando o vbc.exe Compiladores de linha de comando e csc.exe.

Então antes de assinar um assembly no Visual Studio você precisa gerar um arquivo chave de nome forte (.snk) através de um utilitário externo e a seguir editar os atributos do assembly do arquivo de configuração de sua aplicação.

Assinando um Assembly no VS 2005

O VS 2005 realiza estas alterações para os projetos de código gerenciado pela introdução de uma página adicional no descritor do projeto especificamente para assinar a saída do seu projeto.

Na figura abaixo temos a exibição da guia Signing da opção My Project para um projeto onde estamos assinando fortemente o assembly atribuindo um nome e uma senha.

Para isto basta marcar a caixa de verificação - Sign the Assembly - e a seguir selecionando a opção New na caixa de combinação - Choose a strong name key file.  Escolhendo esta opção você estará criando um novo arquivo de nome forte .pfx.

 Após efetuar este processo o arquivo .pfx será incluído ao seu projeto na janela Solution Explorer permitindo que a você facilmente adicioná-lo ao projeto de distribuição.

A plataforma .NET fornece diversas ferramentas para gerenciar este processo dentre elas citamos:

a-) O ferramenta : Strong Name (Sn.exe) ajuda os conjuntos de módulos (assemblies) com Nomes de alta segurança sinal. Sn.exe fornece opções para gerenciamento de chaves, geração assinatura, e verificação de assinatura.

sn [-quiet][option [parameter(s)]]

b-) A ferramenta : Vinculador do conjunto (AL.exe) 

O vinculador assembly gera um arquivo com um manifesto de conjunto de módulos (assembly) de um ou mais arquivos que estão em módulos ou arquivos de recurso. Um módulo é um arquivo Microsoft Intermediate Language (MSIL) que não tenha um manifesto de conjunto de módulos (assembly).

al sources options

c-) A ferramenta cache assembly (Gacutil.exe) 

A ferramenta Global Assembly Cache permite que você possa exibir e manipular o conteúdo do cache de assembly globais e também permite  o download desses arquivos.

d-)  A ferramenta Prompt de comando SDK 

O prompt de comando SDK disponível no 2.0 SDK Framework .NET, define automaticamente as variáveis de ambiente SDK que permitem a você usar facilmente as ferramentas .NET Framework.

Para iniciar o prompt de comando SDK  Clique em Iniciar, aponte para Programas, aponte para Microsoft .NET Framework SDK v2.0, e clique em SDK Command Prompt.

Com esta pequena introdução tocamos no assunto complexo e vasto dos assemblys e assinaturas com nomes fortes. Com certeza voltarei ao assunto em artigos futuros.

Até breve...

referências:

http://msdnwiki.microsoft.com/pt-br/mtpswiki/6f05ezxy(VS.80).aspx
http://msdnwiki.microsoft.com/pt-br/mtpswiki/c405shex(VS.80).aspx
http://msdnwiki.microsoft.com/pt-br/mtpswiki/ex0ss12c(VS.80).aspx


José Carlos Macoratti