어셈블리 서명 연기

업데이트: 2007년 11월

특정 조직에서는 개발자의 경우에도 일상적으로 액세스하지 못하도록 철저히 보호하는 키 쌍이 존재할 수 있습니다. 대개 공개 키는 누구나 사용할 수 있지만, 개인 키는 소수의 몇몇 개인만 액세스할 수 있도록 제한됩니다. 강력한 이름의 어셈블리를 개발하는 경우, 이 강력한 이름의 대상 어셈블리를 참조하는 각 어셈블리에는 공개 키 토큰이 들어 있습니다. 이 공개 키 토큰은 대상 어셈블리에 강력한 이름을 지정합니다. 이렇게 하려면 개발 프로세스에서 공개 키를 사용할 수 있어야 합니다.

빌드 시에 지연 서명이나 부분 서명을 사용하면 강력한 이름 서명에 필요한 공간을 PE 파일에서 예약할 수 있습니다. 하지만 실제 서명은 어셈블리를 공급하기 바로 직전의 단계로 지연됩니다.

다음 단계는 어셈블리 서명을 연기하는 과정에 대해 설명합니다.

  1. 실제 서명을 수행할 조직으로부터 키 쌍의 공개 키 부분을 구합니다. 일반적으로 이 키는 .snk 파일 형식으로 되어 있으며 Windows SDK(소프트웨어 개발 키트)에서 제공되는 강력한 이름 도구(Sn.exe)를 사용하여 만들 수 있습니다.

  2. System.Reflection의 두 사용자 지정 특성을 사용하여 어셈블리의 소스 코드에 주석을 답니다. 이 두 특성은 다음과 같습니다.

    • AssemblyKeyFileAttribute 특성은 공개 키가 포함된 파일의 이름을 생성자에 매개 변수로 전달합니다.

    • AssemblyDelaySignAttribute 특성은 true를 생성자에 매개 변수로 전달하여 서명 연기가 사용 중임을 나타냅니다. 예를 들면 다음과 같습니다.

          <Assembly:AssemblyKeyFileAttribute("myKey.snk")>
          <Assembly:AssemblyDelaySignAttribute(true)>
      
          [assembly:AssemblyKeyFileAttribute("myKey.snk")]
          [assembly:AssemblyDelaySignAttribute(true)]
      
  3. 컴파일러는 이 공개 키를 어셈블리 매니페스트에 삽입하고, 강력한 이름 서명에 필요한 공간을 PE 파일에서 예약합니다. 실제 공개 키는 어셈블리가 작성되는 중에 저장되어야 합니다. 그러면 이 어셈블리를 참조하는 다른 어셈블리에서 이 키를 가져가서 자체의 어셈블리 참조에 저장할 수 있습니다.

  4. 이 어셈블리에는 유효한 강력한 이름 서명이 없으므로, 서명 확인을 해제해야 합니다. 이 동작은 강력한 이름 도구에서 –Vr 옵션을 사용하여 수행할 수 있습니다.

    다음 예제는 myAssembly.dll 어셈블리에 대해 확인을 해제합니다.

    sn –Vr myAssembly.dll
    
    주의:

    개발하는 동안에만 -Vr 옵션을 사용하십시오. 어셈블리를 확인 생략 목록에 추가하면 보안상 허점이 발생합니다. 악의적인 어셈블리가 확인 생략 목록에 추가된 어셈블리의 정규화된 어셈블리 이름(어셈블리 이름, 버전, 문화권 및 공개 키 토큰)을 사용하여 해당 어셈블리의 ID를 모방할 수 있습니다. 이렇게 되면 악의적인 어셈블리도 확인을 건너뛸 수 있습니다.

  5. 일반적으로 어셈블리를 공급하기 바로 직전에 이 어셈블리를 조직의 서명 기관에 제출하면, Strong Name 도구에서 –R 옵션을 사용하여 강력한 이름 서명을 실제로 수행합니다.

    다음 예제는 sgKey.snk 키 쌍을 사용하여 강력한 이름으로 myAssembly.dll 어셈블리를 서명합니다.

    sn -R myAssembly.dll sgKey.snk
    

참고 항목

작업

방법: 공개/개인 키 쌍 만들기

개념

어셈블리 만들기

참조

강력한 이름 도구(Sn.exe)

기타 리소스

어셈블리를 사용한 프로그래밍