ExcelVBA マクロにデジタル署名するために必要なレジストリ設定について

Excelマクロにデジタル署名を付けようとしても、証明書の問題ではなく、Windows側の仕様によってエラーになる場合があります。
実はこれ、マイクロソフトのデジタル署名アルゴリズムに関するダブルスタンダードが原因です。

なぜエラーが起きるのか

マイクロソフトの仕様書
https://msopenspecs.azureedge.net/files/MS-OVBA/%5bMS-OVBA%5d-230221.pdf

に記載されている通り、VBAプロジェクトの署名では「VBAプロジェクト・データ・ハッシュ」が使われます。

問題はここで、
証明書が新しいアルゴリズム(SHA系)を使っていても、VBA署名側では古いMD5ハッシュを依然として要求している
という点です。

MD5はすでに非推奨であり、Windowsや新しいeTokenではサポートされていないため、MD5を使おうとすると署名が失敗します。

つまり、証明書が悪いのではなく、VBA署名プロセスが古い仕様のまま更新されていないことが原因です。

署名を成功させるためのレジストリ設定

VBAコードを正常に署名するには、Windows側で SafeNet の SHA-1 アルゴリズムを有効にする必要があります。
これを行うには以下のようにレジストリキーを追加します。

HKEY_LOCAL_MACHINE\Software\Microsoft\Cryptography\Defaults\Provider\Microsoft Base Cryptographic Provider v1.0
  Disable-Crypto = None

※「Disable-Crypto」という値を作成して「None」を設定します。

この設定を行うことで、VBA署名プロセスがSHA-1アルゴリズムを利用できるようになり、署名処理が通るようになります。

なお、これはセキュリティ的に重大な問題を引き起こすものではなく、現時点でVBAプロジェクトに署名する唯一の現実的な方法となっています。

参考リンク

StackOverflowにスクリーンショット付きの手順があります。
設定方法を確認したい場合はこちらがわかりやすいです。

https://stackoverflow.com/questions/73584355/signing-vba-code-in-excel-xlsm-files-there-was-a-problem-with-the-digital-cert