다음을 통해 공유


Time Stamping Authenticode 서명

Microsoft Authenticode 서명은 이진 데이터에 대한 작성 및 무결성을 보장합니다. Authenticode 타임스탬프는 표준 PKCS #7 카운터 서명자를 기반으로 합니다. Microsoft의 서명 도구를 사용하면 개발자가 Authenticode 서명에 부착하는 것과 동시에 타임스탬프를 부착할 수 있습니다. 타임스탬프를 사용하면 서명에 사용된 인증서가 만료된 후에도 Authenticode 서명을 확인할 수 있습니다.

Authenticode에 대한 간략한 소개

Authenticode 는 디지털 서명 기술을 적용하여 설치 가능한 소프트웨어와 같은 이진 데이터의 작성 및 무결성을 보장합니다. 클라이언트 웹 브라우저 또는 다른 시스템 구성 요소는 Authenticode 서명을 사용하여 소프트웨어를 다운로드하거나 설치할 때 데이터의 무결성을 확인할 수 있습니다. authenticode 서명은 .cab, .exe, .ocx 및 .dll 비롯한 많은 소프트웨어 형식에서 사용할 수 있습니다.

Microsoft는 CA(공용 인증 기관 ) 목록을 유지 관리합니다. Authenticode 인증서 발급자는 현재 SSL.com, Digicert, Sectigo(Comodo)GlobalSign을 포함합니다.

암호화 타임스탬프 정보

과거에는 다양한 암호화 타임스탬프 방법이 제안되었습니다. 예를 들어, 컴퓨터 과학 vol. 765(EUROCRYPT '93)의 Springer-Verlag 강의 노트에서 Haber와 Stornetta "디지털 문서를 타임스탬프하는 방법"(1991)과 베날로와 드 마레 "단방향 누적자: 디지털 서명에 대한 탈중앙화 대안"을 참조하세요. 이 문서의 확장된 추상은 Microsoft Research에서 사용할 수 있습니다. (일부 언어 및 국가 또는 지역에서는 이러한 리소스를 사용할 수 없습니다.) 시간은 수학적 수량이 아닌 물리적이기 때문에 이러한 메서드는 일반적으로 개체를 연결하여 생성 순서를 결정할 수 있도록 하는 방법 또는 동시에 생성된 것으로 설명할 수 있는 개체를 효율적으로 그룹화하는 방법에 대해 설명합니다.

시간을 수량으로 인증하려는 시스템에는 항상 일종의 신뢰가 필요합니다. 강력한 적대적 설정에서 복잡한 프로토콜을 사용하여 어느 정도의 동기화를 보장할 수 있습니다. 그러나 이러한 프로토콜에는 영향을 받는 당사자 간의 광범위한 상호 작용이 필요합니다. 실제로 신뢰할 수 있는 원본의 시간 인증만 필요한 경우 원본은 지정된 시간에 서명에 대해 개체가 제시된 서명된 문(인증)을 제공하여 공증인 역할을 할 수 있습니다.

아래에 구현된 타임스탬핑의 반대 서명 메서드를 사용하면 서명 인증서가 만료되거나 해지된 후에도 서명을 확인할 수 있습니다. 타임스탬프를 사용하면 검증 도구에서 서명이 부착된 시간을 안정적으로 파악할 수 있으며, 그 당시 유효한 경우 서명을 신뢰할 수 있습니다. 타임스탬퍼에는 안정적이고 보호된 시간 원본이 있어야 합니다.

PKCS #7 서명된 문서 및 반대 서명

PKCS #7은 서명된 데이터, 인증서 및 CRL(인증서 해지 목록 )을 비롯한 암호화 데이터의 표준 형식입니다. 타임스탬핑 컨텍스트에서 관심 있는 특정 PKCS #7 형식은 PKCS #7 정의된 SignedData 콘텐츠 형식에 해당하는 서명된 데이터입니다.

PKCS #7 패키지는 실제 콘텐츠와 해당 콘텐츠 및 SignerInfo 서명 블록에 대한 특정 정보를 식별하는 SignedData로 구성됩니다. SignerInfo 자체에는 다른 SignerInfo인 카운터 서명자가 포함될 수 있습니다. 원칙적, 이러한 반대 서명의 시퀀스가 있을 수 있습니다. 카운터 서명은 SignerInfo의 서명과 관련하여 인증되지 않은 특성입니다. 즉, 원래 서명 이후에 부착될 수 있습니다. 개요 형식:

SignedData (PKCS #7)

  • 버전(PKCS #7, 일반 버전 1)
  • DigestAlgorithms(최적화된 처리를 위해 SignerInfo 서명 블록에서 사용하는 모든 알고리즘의 컬렉션)
  • ContentInfo(contentType이 SignedData같으며 콘텐츠 또는 콘텐츠에 대한 참조)
  • OPTIONAL 인증서(사용된 모든 인증서의 컬렉션)
  • 선택적 CRL(모든 CRL의 컬렉션)
  • SignerInfo 서명 블록(하나 이상의 SignerInfo 서명 블록으로 구성된 실제 서명)

SignerInfo(서명 블록)

  • 버전(PKCS #7, 일반 버전 1)
  • 인증서(SignedData에서 서명자의 인증서를 고유하게 식별하는 발급자 및 일련 번호)
  • DigestAlgorithm과 DigestEncryptionAlgorithm 및 다이제스트(해시) 및 EncryptedDigest(실제 서명)
  • OPTIONAL AuthenticatedAttributes(예: 이 서명자가 서명한)
  • OPTIONAL UnauthenticatedAttributes(예: 이 서명자가 서명하지 않음)

인증된 특성의 예로 서명 시간(OID 1.2.840.113549.1.9.5)이 타임스탬프를 통해 서명됩니다. 인증되지 않은 특성의 예는 서명 후에 부착할 수 있으므로 카운터 서명(OID 1.2.840.113549.1.9.6)입니다. 이 경우 SignerInfo 자체에는 SignerInfo(Countersignature)가 포함됩니다.

참고 항목

카운터 서명에 서명된 개체는 원래 서명(즉, 원래 SignerInfo의 EncryptedDigest)입니다.

 

SignTool 및 Authenticode 프로세스

SignTool 은 Authenticode 서명 및 타임스탬핑 이진 데이터에 사용할 수 있습니다. 이 도구는 Microsoft SDK(Windows 소프트웨어 개발 키트) 설치 경로의 \Bin 폴더에 설치됩니다.

SignTool을 사용하면 서명 및 타임스탬핑 이진 데이터가 비교적 간단합니다. 게시자는 상용 코드 서명 CA에서 코드 서명 인증서를 가져와야 합니다. 편의를 위해 Microsoft는 Authenticode 인증서를 발급하는 CA를 포함하여 공용 CA 목록을 게시하고 업데이트합니다. 게시할 준비가 되면 SignTool 도구에서 적절한 명령줄 매개 변수를 사용하여 개체 파일에 서명되고 타임스탬프를 지정합니다. SignTool 작업의 결과는 항상 PKCS #7 형식 SignedData입니다.

SignTool은 서명할 원시 이진 데이터와 타임스탬프를 입력하거나 타임스탬프를 적용하기 위해 이전에 서명된 이진 데이터를 입력으로 허용합니다. 이전에 서명된 데이터는 signtool 타임스탬프 명령을 사용하여 타임스탬프를을 수 있습니다.

인수 설명
/t HTTPAddress 파일이 타임스탬프를 찍을 것임을 나타냅니다. 타임스탬핑 서버의 주소를 지정하는 URL을 제공해야 합니다. /t는 signtool 기호signtool 타임스탬프 명령 모두에 사용할 수 있습니다.

 

이 컨텍스트에서 유용할 수 있는 도구에 대한 자세한 내용은 암호화 도구SignTool을 참조하세요.

구현 세부 정보 및 와이어 형식

SignTool 은 Windows Authenticode 구현을 사용하여 서명 및 타임스탬프를 만듭니다. Authenticode 는 .cab, .exe, .dll 또는 .ocx와 같은 이진 파일에서 작동합니다. Authenticode는 먼저 서명을 만들어 PKCS #7 SignedData를 생성합니다. PKCS #9에 설명된 대로 서명해야 하는 SignedData입니다.

카운터 서명 프로세스는 다음 네 단계로 수행됩니다.

  1. PKCS #7 SignedData의 SignerInfo에서 서명(즉, encryptedDigest)을 복사합니다.
  2. 콘텐츠가 원래 서명인 타임스탬프를 생성합니다. TimeStampRequest로 인코딩된 타임스탬프 서버 ASN.1(추상 구문 표기법 1)에 보냅니다.
  3. 타임스탬프를 받습니다. 두 번째 PKCS #7 SignedData 형식으로 타임스탬프는 타임스탬프를 서버에서 반환합니다.
  4. 타임스탬프의 SignerInfo를 원래 PKCS #7 SignedData에 PKCS #9 카운터 서명(즉, 원본의 SignerInfo에서 인증되지 않은 특성)으로 복사합니다.

타임스탬프를 요청합니다.

타임스탬프는 HTTP 1.1 POST 메시지 내에서 전송됩니다. HTTP 헤더에서 CacheControl 지시문은 no-cache로 설정되고 Content-Type 지시문은 application/octet-stream으로 설정됩니다. HTTP 메시지의 본문은 타임스탬프를 요청하는 DER(고유 인코딩 규칙) 인코딩의 base64 인코딩입니다.

현재 사용되지는 않지만 타임스탬프를 통해 요청이 HTTP POST 내에 있는 위치를 찾는 데 도움이 되므로 Content-Length 지시문을 사용하여 HTTP 메시지를 생성해야 합니다.

다른 HTTP 헤더도 있을 수 있으며 요청자 또는 타임스탬프를 서버에서 이해하지 못하는 경우 무시해야 합니다.

타임스탬프는 ASN.1로 인코딩된 메시지입니다. 요청의 형식은 다음과 같습니다.

TimeStampRequest ::= SEQUENCE {
   countersignatureType OBJECT IDENTIFIER,
   attributes Attributes OPTIONAL, 
   content  ContentInfo
}

countersignatureType은 이를 타임스탬프를 카운터 서명으로 식별하는 OID(개체 식별자 )이며 정확한 OID 1.3.6.1.4.1.311.3.2.1이어야 합니다.

현재 타임스탬드 요청에는 특성이 포함되지 않습니다.

콘텐츠는 PKCS #7에 정의된 ContentInfo입니다. 콘텐츠는 서명할 데이터입니다. 서명 타임 스탬프의 경우 ContentType은 데이터여야 하며, 콘텐츠는 타임스탬프를 적용할 PKCS #7 콘텐츠의 SignerInfo에서 encryptedDigest(서명)여야 합니다.

타임스탬프를 응답합니다.

타임스탬프는 HTTP 1.1 메시지 내에서도 전송됩니다. HTTP 헤더에서 Content-Type 지시문도 application/octet-stream으로 설정됩니다. HTTP 메시지의 본문은 타임스탬프를 응답하는 DER 인코딩의 base64 인코딩입니다.

타임스탬프는 타임스탬퍼가 서명한 PKCS #7 서명된 메시지입니다. PKCS #7 메시지의 ContentInfo는 타임스탬프를 통해 받은 ContentInfo와 동일합니다. PKCS #7 콘텐츠에는 서명 시간 인증 특성(PKCS #99, OID 1.2.840.113549.9.5에 정의됨)이 포함됩니다.

Authenticode가 서버에서 타임스탬프를 받은 후 Authenticode는 타임스탬프를 원래 PKCS #7 SignedData 에 카운터 서명으로 통합합니다. 이를 위해 반환된 PKCS #7 SignedData 의 ContentInfo가 삭제되고 반환된 타임스탬프를 SignerInfo가 원래 PKCS #7 SignedData의 SignerInfo에 카운터 서명으로 복사됩니다. 또한 타임스탬프의 인증서 체인은 원래 서명자의 인증되지 않은 특성으로 원래 PKCS #7 SignedData 의 인증서에 복사됩니다.