Assinar um assembly com atraso

Uma organização pode ter um par de chaves bem protegido ao qual os desenvolvedores não têm acesso todos os dias. A chave pública normalmente está disponível, mas o acesso à chave privada é restrito a apenas algumas pessoas. Ao desenvolver assemblies com nomes fortes, cada assembly que referencia o assembly de destino com nome forte contém o token da chave pública usada para fornecer ao assembly de destino um nome forte. Isso requer que a chave pública esteja disponível durante o processo de desenvolvimento.

É possível usar a assinatura atrasada ou parcial no tempo de compilação a fim de reservar espaço no arquivo PE (executável portátil) para a assinatura de nome forte, mas atrasar a assinatura real até um estágio posterior (normalmente imediatamente antes do envio do assembly).

Para atrasar a assinatura de um assembly:

  1. Obtenha a parte da chave pública do par de chaves da organização que fará a eventual assinatura. Normalmente, essa chave está na forma de um arquivo .snk, que pode ser criado usando a ferramenta de nome forte (Sn.exe) fornecida pelo SDK do Windows.

  2. Anote o código-fonte para o assembly com dois atributos personalizados de System.Reflection:

    • AssemblyKeyFileAttribute, que passa o nome do arquivo que contém a chave pública como um parâmetro para seu construtor.

    • AssemblyDelaySignAttribute, que indica que esse atraso na assinatura está sendo usado passando true como um parâmetro para seu construtor.

    Por exemplo:

    [assembly:AssemblyKeyFileAttribute("myKey.snk")];
    [assembly:AssemblyDelaySignAttribute(true)];
    
    [assembly:AssemblyKeyFileAttribute("myKey.snk")]
    [assembly:AssemblyDelaySignAttribute(true)]
    
    <Assembly:AssemblyKeyFileAttribute("myKey.snk")>
    <Assembly:AssemblyDelaySignAttribute(True)>
    
  3. O compilador insere a chave pública no manifesto do assembly e reserva espaço no arquivo PE para a assinatura de nome forte completo. A chave pública real deve ser armazenada enquanto o assembly é compilado para que outros assemblies que referenciam esse assembly possam obter a chave para armazenar em sua própria referência do assembly.

  4. Como o assembly não tem uma assinatura de nome forte válida, a verificação dessa assinatura deve ser desativada. Você pode fazer isso usando a opção -Vr com a ferramenta Nome Forte.

    O exemplo a seguir desativa a verificação de um assembly chamado myAssembly.dll.

    sn -Vr myAssembly.dll
    

    Para desligar a verificação em plataformas em que você não pode executar a ferramenta Nome Forte, como microprocessadores ARM (Advanced RISC Machine), use a opção -Vk para criar um arquivo de Registro. Importe o arquivo de Registro para o Registro no computador em que você deseja desligar a verificação. O exemplo a seguir cria um arquivo de Registro para myAssembly.dll.

    sn -Vk myRegFile.reg myAssembly.dll
    

    Com a opção -Vr ou a -Vk, você pode, opcionalmente, incluir um arquivo .snk para a assinatura da chave de teste.

    Aviso

    Por segurança, não confie em nomes fortes. Eles apenas fornecem uma identidade exclusiva.

    Observação

    Se você usar o atraso de assinatura durante o desenvolvimento com o Visual Studio em um computador de 64 bits e compilar um assembly para Qualquer CPU, talvez seja necessário aplicar a opção -Vr duas vezes. (No Visual Studio, Qualquer CPU é um valor da propriedade de compilação Destino da plataforma, que é o padrão ao fazer compilações na linha de comando.) Para executar seu aplicativo por meio da linha de comando ou do Explorador de Arquivos, use a versão de 64 bits da ferramenta de nome forte (Sn.exe) a fim de aplicar a opção -Vr ao assembly. Para carregar o assembly no Visual Studio no tempo de design (por exemplo, se o assembly contiver componentes que são usados por outros assemblies em seu aplicativo), use a versão de 32 bits da ferramenta de nome forte. Isso ocorre porque o compilador JIT (Just-in-time) compila o assembly para código nativo de 64 bits quando o assembly é executado da linha de comando e para código nativo de 32 bits quando o assembly é carregado no ambiente de tempo de design.

  5. Posteriormente, normalmente imediatamente antes do envio, você envia o assembly para a autoridade de assinatura da sua organização para a assinatura de nome forte real usando a opção -R com a ferramenta Nome Forte.

    O exemplo a seguir assina um assembly chamado myAssembly.dll com um nome forte usando o par de chaves sgKey.snk.

    sn -R myAssembly.dll sgKey.snk
    

Confira também