更新日:2014年02月12日
2013年8月中旬、マイクロソフトから MD5 ハッシュ付き証明書の使用を制限 (廃止) する更新プログラムがリリースされました。 そして、2014年2月12日、更新プログラムの Microsoft Update 経由での自動更新が始まりました。
更新プログラムを適用した場合、CertGetCertificateChain 関数を呼び出すマイクロソフト製品またはサードパーティ製品は、MD5 ハッシュが含まれる証明書を信頼しなくなります。 CertGetCertificateChain 関数は、終端証明書から開始される証明書チェーンコンテキストを構築し、チェーンを検証するときに、チェーン内のすべての証明書を調べ、MD5 ハッシュが含まれていないことを確認します。 チェーン内のいずれかの証明書に MD5 ハッシュが含まれている場合、終端証明書は信頼されません。
このため、事前に、証明書で使用している署名ハッシュアルゴリズムの確認、更新プログラムを適用した環境での動作確認などを実施しておくこと必要があります。 HIRT-PUB14002 では、Windows 環境でファイルに格納されている Authenticode 署名には、どのような情報が格納されているのか、 また、Authenticode 署名の証明書で使用している署名ハッシュアルゴリズムの確認方法を紹介します。
なお、署名ハッシュアルゴリズムを確認する際に、留意しておくべき点があります。
「信頼されたルート証明書機関 (図10:証明書マネージャ)」などポリシー設定で信頼されている証明書については、署名ハッシュアルゴリズムに関係なく信頼されます。
更新プログラムのチェックは、上記以外の証明書(ポリシー設定で信頼されている証明書以外) を対象に、MD5 による署名ハッシュアルゴリズムが含まれているかどうかを確認することになります。
Windows 環境でファイルに格納されている Authenticode 署名は、PKCS #7 の signedData の形式で構成され、ASN.1 (Abstract Syntax Notation One) 記述でファイルに格納されています。
SignedData ::= SEQUENCE { version Version, digestAlgorithms DigestAlgorithmIdentifiers, contentInfo ContentInfo, certificates [0] IMPLICIT ExtendedCertificatesAndCertificates OPTIONAL, Crls [1] IMPLICIT CertificateRevocationLists OPTIONAL, signerInfos SignerInfos }
contentInfo には、PKCS #7 の signedData の形式で格納されているコンテンツに関する情報を記載します。 certificates には証明書群を格納し、Crls には証明書失効リスト(CRL: Certificate Revocation List)、 signerInfos には署名群(コード署名、タイムスタンプ署名など)を格納します。
ここでは、ファイル winsdk_web.exe (Microsoft Windows SDK for Windows 7.1 Setup) (図1) を例題として取り上げ、 PE ファイルに格納されている Authenticode 署名をみていきます。
ファイル winsdk_web.exe の場合、Authenticode 署名は、ASN.1 記述でファイルの後方(0x7AE1B〜0x7C54E)に格納されています (図2)。
図2:ファイル winsdk_web.exe に格納されている Authenticode 署名
格納されている Authenticode 署名については、[ファイルのプロパティ|デジタル署名] から辿っていくことで、 コード署名(図3 コード署名C)、コード署名に関する X.509 証明書(図3 コード署名C1〜C3)、タイムスタンプ署名(図3 タイムスタンプ署名T)、タイムスタンプ署名に関する X.509 証明書(図3 タイムスタンプ署名T1〜T3)として、その内容を確認できます(図3)。
ここからは、ファイル winsdk_web.exe に格納されている Authenticode 署名をバイナリデータとして抽出し、ASN.1を解釈して表示する ASN.1ビューアを使って内容をみていきます。
-- pkcs7-signedData --- 1
--+ sha1 NULL
-- 1.3.6.1.4.1.311.2.1.4 (SPC_INDIRECT_DATA_OBJID) ・・・マイクロソフト暗号化の Oid ---- 1.3.6.1.4.1.311.2.1.15 (SPC_PE_IMAGE_DATAOBJ OID) ・・・マイクロソフト暗号化の Oid -- BIT STRING --- CONTEXT [0] --+ sha1 NULL - OCTET STRING
マイクロソフト暗号化の Oid のうち、Authenticode 関連の Software Publishing として、次の Oid が定義されています。 contentInfo には、 PE ファイルの場合、SPC_INDIRECT_DATA_OBJID, SPC_PE_IMAGE_DATAOBJ OID が格納され、 CAB ファイルの場合、SPC_INDIRECT_DATA_OBJID, SPC_CAB_DATA_OBJID (1.3.6.1.4.1.311.2.1.25)が格納されます。
Authenticode....................................1.3.6.1.4.1.311.2 Software Publishing (with associated encoders/decoders) SPC_INDIRECT_DATA_OBJID 1.3.6.1.4.1.311.2.1.4 SPC_STATEMENT_TYPE_OBJID 1.3.6.1.4.1.311.2.1.11 SPC_SP_OPUS_INFO_OBJID 1.3.6.1.4.1.311.2.1.12 SPC_PE_IMAGE_DATA_OBJID 1.3.6.1.4.1.311.2.1.15 SPC_SP_AGENCY_INFO_OBJID 1.3.6.1.4.1.311.2.1.10 SPC_MINIMAL_CRITERIA_OBJID 1.3.6.1.4.1.311.2.1.26 SPC_FINANCIAL_CRITERIA_OBJID 1.3.6.1.4.1.311.2.1.27 SPC_LINK_OBJID 1.3.6.1.4.1.311.2.1.28 SPC_HASH_INFO_OBJID 1.3.6.1.4.1.311.2.1.29 SPC_SIPINFO_OBJID 1.3.6.1.4.1.311.2.1.30 Software Publishing (with NO associated encoders/decoders) SPC_CERT_EXTENSIONS_OBJID 1.3.6.1.4.1.311.2.1.14 SPC_RAW_FILE_DATA_OBJID 1.3.6.1.4.1.311.2.1.18 SPC_STRUCTURED_STORAGE_DATA_OBJID 1.3.6.1.4.1.311.2.1.19 SPC_JAVA_CLASS_DATA_OBJID 1.3.6.1.4.1.311.2.1.20 SPC_INDIVIDUAL_SP_KEY_PURPOSE_OBJID 1.3.6.1.4.1.311.2.1.21 SPC_COMMERCIAL_SP_KEY_PURPOSE_OBJID 1.3.6.1.4.1.311.2.1.22 SPC_CAB_DATA_OBJID 1.3.6.1.4.1.311.2.1.25 SPC_GLUE_RDN_OBJID 1.3.6.1.4.1.311.2.1.25
certificates には、4 つの証明書が格納されています。
----- 2 - INTEGER (2E AB 11 DC 50 FF 5C 9D CB C0) ・・・シリアル番号 -+ sha1WithRSA NULL ---+ organizationalUnitName Copyright (c) 1997 Microsoft Corp. --+ organizationalUnitName Microsoft Corporation --+ commonName Microsoft Root Authority ・・・発行者 -+ 070822223102Z (2007/08/23 07:31:02 JST) ・・・有効期間の開始 120825070000Z (2012/08/25 16:00:00 JST) ・・・有効期間の終了 ---+ countryName US --+ stateOrProvinceName Washington --+ localityName Redmond --+ organizationName Microsoft Corporation --+ commonName Microsoft Code Signing PCA ・・・サブジェクト(発行先) --+ rsaEncryption NULL - BIT STRING ---+ X509v3 Extended Key Usage ・・・拡張キー使用方法 OCTET STRING (1.3.6.1.5.5.7.3.3) ・・・コード署名 -+ 2.5.29.1 (old Authority Key Identifier) ・・・機関キー識別子 OCTET STRING -+ X509v3 Basic Constraints ・・・基本制限 true OCTET STRING -+ X509v3 Subject Key Identifier ・・・サブジェクトキー識別子 OCTET STRING -+ X509v3 Key Usage ・・・キー使用方法 OCTET STRING (86) ・・・Digital Signature, Certificate Signing, Off-line CRL Signing, CRL Signing -+ sha1WithRSA NULL - BIT STRING
図4:シリアル番号:2EAB11DC50FF5C9DCBC0
[X.509 証明書(図3 コード署名C2)]
---- 2 - INTEGER (61 01 CF 3E 00 00 00 00 00 0F) ・・・シリアル番号 -+ sha1WithRSAEncryption NULL ---+ countryName US --+ stateOrProvinceName Washington --+ localityName Redmond --+ organizationName Microsoft Corporation --+ commonName Microsoft Code Signing PCA ・・・発行者 -+ 091207224029Z (2009/12/08 07:40:29 JST) ・・・有効期間の開始 110307224029Z (2011/03/08 07:40:29 JST) ・・・有効期間の終了 ---+ countryName US --+ stateOrProvinceName Washington --+ localityName Redmond --+ organizationName Microsoft Corporation --+ organizationalUnitName MOPR --+ commonName Microsoft Corporation ・・・サブジェクト(発行先) --+ rsaEncryption NULL - BIT STRING ---+ X509v3 Extended Key Usage ・・・拡張キー使用方法 OCTET STRING (1.3.6.1.5.5.7.3.3) ・・・コード署名 -+ X509v3 Subject Key Identifier ・・・サブジェクトキー識別子 OCTET STRING -+ X509v3 Key Usage ・・・キー使用方法 true OCTET STRING (80) ・・・Digital Signature -+ X509v3 Authority Key Identifier ・・・機関キー識別子 OCTET STRING -+ X509v3 CRL Distribution Points ・・・CRL 配布ポイント OCTET STRING -+ Authority Information Access ・・・機関情報アクセス OCTET STRING -+ sha1WithRSAEncryption NULL - BIT STRING
図5:シリアル番号:6101CF3E00000000000F
[X.509 証明書(図3 コード署名C3)]
---- 2 - INTEGER (6A 0B 99 4F C0 00 25 AB 11 DB 45 1F 58 7A 67 A2) ・・・シリアル番号 -+ sha1WithRSAEncryption NULL ---+ organizationalUnitName Copyright (c) 1997 Microsoft Corp. --+ organizationalUnitName Microsoft Corporation --+ commonName Microsoft Root Authority ・・・発行者 -+ 060916010447Z (2006/09/16 10:04:47 JST) ・・・有効期間の開始 190915070000Z (2019/09/15 16:00:00 JST) ・・・有効期間の終了 ---+ countryName US --+ stateOrProvinceName Washington --+ localityName Redmond --+ organizationName Microsoft Corporation --+ commonName Microsoft Timestamping PCA ・・・サブジェクト(発行先) --+ rsaEncryption NULL - BIT STRING ---+ X509v3 Extended Key Usage ・・・拡張キー使用方法 OCTET STRING (1.3.6.1.5.5.7.3.8) ・・・タイムスタンプ -+ 2.5.29.1 (old Authority Key Identifier) ・・・機関キー識別子 OCTET STRING -+ 1.3.6.1.4.1.311.21.1 (szOID_CERTSRV_CA_VERSION) ・・・CA バージョン OCTET STRING -+ X509v3 Subject Key Identifier ・・・サブジェクトキー識別子 OCTET STRING -+ 1.3.6.1.4.1.311.20.2 (szOID_ENROLL_CERTTYPE_EXTENSION) ・・・証明書テンプレート名 OCTET STRING -+ X509v3 Key Usage ・・・キー使用方法 OCTET STRING (86) ・・・Digital Signature, Certificate Signing, Off-line CRL Signing, CRL Signing -+ X509v3 Basic Constraints ・・・基本制限 true OCTET STRING -+ sha1WithRSAEncryption NULL - BIT STRING
図6:シリアル番号:6A0B994FC00025AB11DB451F587A67A2
[X.509 証明書(図3 タイムスタンプ署名T2)]
---- 2 - INTEGER (61 06 94 2D 00 00 00 00 00 09) ・・・シリアル番号 -+ sha1WithRSAEncryption NULL ---+ countryName US --+ stateOrProvinceName Washington --+ localityName Redmond --+ organizationName Microsoft Corporation --+ commonName Microsoft Timestamping PCA ・・・発行者 -+ 080725190217Z (2008/07/26 04:02:17 JST) ・・・有効期間の開始 130725191217Z (2013/07/26 04:12:17 JST) ・・・有効期間の終了 ---+ countryName US --+ stateOrProvinceName Washington --+ localityName Redmond --+ organizationName Microsoft Corporation --+ organizationalUnitName MOPR --+ organizationalUnitName nCipher DSE ESN:7A82-688A-9F92 --+ commonName Microsoft Time-Stamp Service ・・・サブジェクト(発行先) --+ rsaEncryption NULL - BIT STRING ---+ X509v3 Subject Key Identifier ・・・サブジェクトキー識別子 OCTET STRING -+ X509v3 Authority Key Identifier ・・・機関キー識別子 OCTET STRING -+ X509v3 CRL Distribution Points ・・・CRL 配布ポイント OCTET STRING -+ Authority Information Access ・・・機関情報アクセス OCTET STRING -+ X509v3 Extended Key Usage ・・・拡張キー使用方法 OCTET STRING (1.3.6.1.5.5.7.3.8) ・・・タイムスタンプ -+ X509v3 Key Usage ・・・キー使用方法 true OCTET STRING (c0) ・・・Digital Signature, Non-Repudiation -+ sha1WithRSAEncryption NULL - BIT STRING
図7:シリアル番号:6106942D000000000009
[X.509 証明書(図3 タイムスタンプ署名T3)]
signerInfos には、2 つの署名が格納されています。
--- 1 ----+ countryName US --+ stateOrProvinceName Washington --+ localityName Redmond --+ organizationName Microsoft Corporation --+ commonName Microsoft Code Signing PCA ・・・発行者 - INTEGER (61 01 CF 3E 00 00 00 00 00 0F) ・・・シリアル番号 -+ sha1 NULL --- contentType -- 1.3.6.1.4.1.311.2.1.4 (SPC_INDIRECT_DATA_OBJID) -- 1.3.6.1.4.1.311.2.1.11 (SPC_STATEMENT_TYPE_OBJID) --- 1.3.6.1.4.1.311.2.1.21 (SPC_INDIVIDUAL_SP_KEY_PURPOSE_OBJID) ・・・ Microsoft Individual Code Signing -- messageDigest -- OCTET STRING -- 1.3.6.1.4.1.311.2.1.12 (SPC_SP_OPUS_INFO_OBJID) ---- CONTEXT [0] -- http://microsoft.com -+ rsaEncryption NULL - OCTET STRING
図8:シリアル番号:6101CF3E00000000000F
[図3 コード署名C]
--- countersignature --- 1 ----+ countryName US --+ stateOrProvinceName Washington --+ localityName Redmond --+ organizationName Microsoft Corporation --+ commonName Microsoft Timestamping PCA ・・・発行者 - INTEGER (61 06 94 2D 00 00 00 00 00 09) ・・・シリアル番号 -- sha1 --- contentType -- pkcs7-data -- signingTime -- 100514111007Z (2010/05/14 20:10:07 JST) ・・・タイムスタンプ -- messageDigest -- OCTET STRING -+ sha1WithRSAEncryption NULL - OCTET STRING
CertGetCertificateChain 関数は、最下位に存在する証明書から、 その上位の証明書、そして、最上位に位置する証明書(ルート証明書)までの一連の証明書群(証明書チェーン)を取得する関数です。
ファイル winsdk_web.exe の Authenticode 署名の certificates には、コード署名に関する X.509 証明書(図3 コード署名C2〜C3)、タイムスタンプ署名に関する X.509 証明書(図3 タイムスタンプ署名T2〜T3)の 4つの証明書が格納されています。
CertGetCertificateChain 関数では、これらの証明書から、図10に示すパソコンに格納されている残りの証明書(本事例の場合には、ルート証明書で、 コード署名C1、タイムスタンプ署名T1 (図11))を探しだし、証明書チェーンの取得を完了します。
図11:シリアル番号:C1008B3C3C8811D13EF663ECDF40
[X.509 証明書(図3 コード署名C1、タイムスタンプ署名T1)]
署名ツール signtool を使うことで、証明書チェーンの取得と共に、MD5 ハッシュ付き証明書の使用を制限 (廃止) する更新プログラムの影響を確認できます。 検証に成功すれば、更新プログラムの影響はありません。 なお、署名ツール signtool を使って確認する場合には、調査対象となる機器上で確認してください。
#signtool verify /pa /v /d winsdk_web.exe Verifying: winsdk_web.exe Hash of file (sha1): 66C80242C18BDFA3F6E93AFC11F47D3FD5C39DB3 Signing Certificate Chain: ・・・X.509 証明書(図3 コード署名C1) Issued to: Microsoft Root Authority Issued by: Microsoft Root Authority Expires: Thu Dec 31 16:00:00 2020 SHA1 hash: A43489159A520F0D93D032CCAF37E7FE20A8B419 ・・・X.509 証明書(図3 コード署名C2) Issued to: Microsoft Code Signing PCA Issued by: Microsoft Root Authority Expires: Sat Aug 25 16:00:00 2012 SHA1 hash: 3036E3B25B88A55B86FC90E6E9EAAD5081445166 ・・・X.509 証明書(図3 コード署名C3) Issued to: Microsoft Corporation Issued by: Microsoft Code Signing PCA Expires: Tue Mar 08 07:40:29 2011 SHA1 hash: 9617094A1CFB59AE7C1F7DFDB6739E4E7C40508F The signature is timestamped: Fri May 14 20:10:07 2010 Timestamp Verified by: ・・・X.509 証明書(図3 タイムスタンプ署名T1) Issued to: Microsoft Root Authority Issued by: Microsoft Root Authority Expires: Thu Dec 31 16:00:00 2020 SHA1 hash: A43489159A520F0D93D032CCAF37E7FE20A8B419 ・・・X.509 証明書(図3 タイムスタンプ署名T2) Issued to: Microsoft Timestamping PCA Issued by: Microsoft Root Authority Expires: Sun Sep 15 16:00:00 2019 SHA1 hash: 3EA99A60058275E0ED83B892A909449F8C33B245 ・・・X.509 証明書(図3 タイムスタンプ署名T3) Issued to: Microsoft Time-Stamp Service Issued by: Microsoft Timestamping PCA Expires: Fri Jul 26 04:12:17 2013 SHA1 hash: 05FECB745F7F3B1A0E262A73435CCB7EAAED8B37 Description: winsdk_web.exe Description URL: http://microsoft.com Successfully verified: winsdk_web.exe Number of files successfully Verified: 1 Number of warnings: 0 Number of errors: 0
[ファイルのプロパティ|デジタル署名] を用いる場合には、各 X.509 証明書で使われている署名ハッシュアルゴリズムを確認していきます。 本事例の場合には、コード署名に関する X.509 証明書(図11)、タイムスタンプ署名に関する X.509 証明書(図12) の計6個を確認することになります。
ここで、コード署名に関する X.509 証明書のうち [コード署名C1]、タイムスタンプ署名に関する X.509 証明書のうち [タイムスタンプ署名T1] に署名ハッシュアルゴリズムとして MD5 が使われています。 しかし、これら証明書は、「信頼されたルート証明書機関 (図10:証明書マネージャ)」に登録されているため、更新プログラムによる制限対象外となりますので、計6個の X.509 証明書については、更新プログラムによる影響はないと判断できます。
担当:寺田、沼田、大西/HIRT
グローバルサイン:
重要な電子文書にデジタル署名。広報にも役立っています