電子契約は商業登記電子証明書の電子署名を利用すべき

# はじめに

商業登記電子証明書を利用した電子署名による契約書作成は、おそらく流行ってないです。
でも、流行らせたいです。

◯◯◯サインとか、◯◯◯◯サインとか、
「利用者の指示に基づきサービス提供事業者自身の署名鍵により暗号化等を行う電子契約サービス」が様々ありますが、サービス提供事業者がサービスを終了するリスクなどを考えると

**法務省による「商業登記にもどづく電子認証制度」による電子署名が、最も安全性が高い**

と思っているのですが、民業圧迫という懸念からか、あまり宣伝されておらず、また、使い方がわかりにくい。

以下のリンク（有限会社ラング・エッジ様）で、商業登記電子証明書での電子署名のおすすめポイントが紹介されていますので、まずはそれをご覧いただき、**本稿で具体的な作業手順を説明して、商業登記電子証明書での電子署名を流行らせます。**

https://de.slideshare.net/lemiyachi/ss-240622961

# 商業登記電子証明書の取得方法

まず、昔より安くなってます。
**3ヶ月で 1000円 + 300円 です。**（2022/5現在） [(電子証明書の証明期間と発行手数料)](https://www.moj.go.jp/MINJI/minji06_00028.html#02)　
◯◯◯サインとかより、だいぶ安いですよね。

チャレンジしたことある人は、手続きがめちゃくちゃ面倒という印象だと思いますが、やり方を動画にまとめてくれた人（週末ひかチャン！様）がいて、簡単にできました。
法務局にも行く必要がないです。郵送も不要。

https://www.youtube.com/watch?v=zCnfOrDa3eA


# 電子署名の方法

無料のツール Acrobat Reader DC で電子署名ができます。
以下のリンクの手順がわかりやすかったです。簡単です。

[Adobe Acrobat Reader DCでPDFに電子証明書を用いて電子署名を付与する手順](https://meatwiki.nii.ac.jp/confluence/pages/viewpage.action?pageId=79922069#AdobeAcrobatReaderDC%E3%81%A7PDF%E3%81%AB%E9%9B%BB%E5%AD%90%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%92%E7%94%A8%E3%81%84%E3%81%A6%E9%9B%BB%E5%AD%90%E7%BD%B2%E5%90%8D%E3%83%BB%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%97%E3%82%92%E4%BB%98%E4%B8%8E%E3%81%99%E3%82%8B%E6%89%8B%E9%A0%86-2-3.%E9%9B%BB%E5%AD%90%E7%BD%B2%E5%90%8D%E3%83%BB%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%97%E4%BB%98%E4%B8%8E%E6%89%8B%E9%A0%86)（国立情報学研究所）

なお、以下の画面が出たら、「ファイルのデジタルIDを使用」を選んで、取得した商業登記電子証明書を指定してください。
![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646864/5c665a22-b3e4-7d18-075d-100ec4115c21.png)

# 電子署名の有効性の確認

Adobe Acrobat Readerで、PDFに付与された電子署名の検証を行う手順は、以下サイトの情報が分かりやすいです。こちらも簡単。

[Adobe Acrobat Readerを用いて署名の検証を行う手順](https://yodoware.co.jp/ja/signature/)　（株式会社ヨドウェア様）

ここまで、めっちゃ簡単ですよね。
**つまり、「商業登記電子証明書での電子署名」は簡単です。誰でもできます。**

# 電子署名の内容の表示

ここは、困りました。
読み方をローマ字で登録していない場合、Adobe Acrobat Reader で表示できるのが法人番号のみで、もちろんそれでも十分ではありますが、登記された情報が表示されていないと、納得しづらいかと思います。

登記された情報の表示は、以下のように行います。

**手順１．16進文字列のコピー**

PDFの署名部分をクリックして、[署名のプロパティ] > [署名者の証明書を表示] > [詳細]タブで、
1.2.392.100300.1.1.3（公開鍵所有者に関する情報）の 16進文字列をコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646864/28e857a5-4343-4d67-b37b-e271c1a5c5b2.png)

**手順２．デコード**

以下のいずれかの変換ツールに貼り付けて、内容を表示します。

https://lapo.it/asn1js/

https://kllc.github.io/repo/asn1decode.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646864/4cd6ad1b-711c-8a6e-c8de-a30df2480a8c.png)

「公開鍵所有者に関する情報（1.2.392.100300.1.1.3）変換ツール」は私が作成しました。
ASN1.Javascript decoder のサイトの存在を知らなくて、困って作成したのですが・・
後で存在に気づきました。

16進文字列の変換って、そんな事しないと確認できないのはちょっと嫌な感じで、本当に合っているのか心配になりますが、私が作成したツールは、HTMLの1ファイルのみで動作するため、保存してローカルでも使えるのと、コード自体を公開していて自分の目で確認できるので、少しは信頼し易いかと思います。

``` javascript
// 公開鍵所有者に関する情報の文字列変換メイン処理
function convert(str){
    const byteStrArray = str.split(' ');
    var utfString = ""
    // 最初の3byteは不要
    for (let i = 3;i < byteStrArray.length;i++){
        switch (byteStrArray[i]){
            // A0~A6が RegisteredCorporationInfoSyntax の0~6 に該当? (https://www.moj.go.jp/content/001216068.pdf#page=12)
            // A0~A6の次のバイトはトータルの長さ?、A0~A6の次の次の次のバイトが各情報の長さ?
            // そのため次のように処理してUTF-8に変換する
            case 'A0':
                utfString += '商号：' + utf_decode(byteStrArray.slice(i+4,i+4+parseInt(byteStrArray[i+3],16))) + '\n'
            break;
            case 'A1':
                utfString += '会社法人番号：' + utf_decode(byteStrArray.slice(i+4,i+4+parseInt(byteStrArray[i+3],16))) + '\n'
            break;
            case 'A2':
                utfString += '本店：' + utf_decode(byteStrArray.slice(i+4,i+4+parseInt(byteStrArray[i+3],16))) + '\n'
            break;
            case 'A3':
              utfString += '資格：' + utf_decode(byteStrArray.slice(i+4,i+4+parseInt(byteStrArray[i+3],16))) + '\n'
            break;
            case 'A4':
                utfString += '氏名：' + utf_decode(byteStrArray.slice(i+4,i+4+parseInt(byteStrArray[i+3],16))) + '\n'
            break;
            case 'A6':
                utfString += '管轄登記所：' + utf_decode(byteStrArray.slice(i+4,i+4+parseInt(byteStrArray[i+3],16))) + ''
            break;
        }
        i += 3 + parseInt(byteStrArray[i+3],16)
    }
    return utfString
}

// バイト配列のUTF-8変換処理
function utf_decode(arr){
    var byteArray =[]
    for (elm of arr){
        byteArray.push(parseInt(elm,16))
    }
    var text_decoder = new TextDecoder("utf-8");
    return text_decoder.decode(Uint8Array.from(byteArray).buffer);
}
```

# 補足：電子署名の有効性の確認の理屈

電子署名の有効性の確認の理屈は、一番肝心なのに、わかりにくいところでした。
登記官の証明書を入手して、それを信頼すれば、登記官が発行した商業登記電子証明書による署名の有効性がチェックができるということなのですが、以下の記事を読んで、**証明書チェーン**を理解すれば、ギリギリわかりました。

https://qiita.com/TakahikoKawasaki/items/4c35ac38c52978805c69#2-%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3

https://crca1.moj.go.jp/toukikan.html

# 課題

### 1.XML署名をやってみたい

XML署名のほうが手軽で、PDFでなくても何のファイルでも良いので、本当はこちらを流行らせたいのですが、署名の検証の仕組みが理解できなかったです。
電子署名の検証は、PDFだとAdobeを信頼せざるをえない状態なので、いつかはXML署名を理解したい。

### 2.大きい会社の電子署名

「商業登記電子証明書のすゝめ」のスライドで言及がありましたが、大きい会社で商業登記電子証明書を利用するのは難しいのではないかということですが、証明書チェーンの考え方で、代表者がその部下の公開鍵を証明すればよいのではないかと思います。
具体的にどうやったらいいのかわからないのですが、いつかは理解してやってみたい。

# おわりに

商業登記電子証明書での電子署名は、もっと流行ってもいいと思うのですが、おそらく流行っていないと思います。
というのも、色々調べて記事を読んでいると、この記事もあの人が書いてたのか、ということがよくありました。

**コストも安いし、わかってしまえば手順も簡単なので、流行って欲しいと思います。**

少なくとも私の会社と友人の会社の間では、商業登記電子証明書での電子署名を行い、印紙代を節約したいのです。
ケチなだけなのですが、ぜひよろしくお願いいたします。

# 参考文献

https://www.moj.go.jp/MINJI/denshishomeihou.html

https://www.meti.go.jp/covid-19/denshishomei_qa.html

https://qiita.com/data9824/items/650ace57b6935c0ce337

https://qiita.com/data9824/items/e18fc54e2a47945e9730

https://qiita.com/syoyo/items/831ffa7950c814602ada

**[RSA暗号の入り口だけを理解する](https://kllc.github.io/blog/?src=22/02/rsa.md)**