電子シール（eシール）の利用と実装

## 1. 電子シール（eシール）とは？

私は製品として電子署名（PDF/XML）のライブラリを開発販売しているのですが昨今「電子シール（eシール）に使いたい」と言う問合せが増えています。しかし「電子署名と電子シールは何が違うのか？」とか「電子署名と実装は異なるのか？」「どこで電子証明書を買えば良いのか？」と言う基礎的な話から始める必要があります。何度も繰り返して説明するより一度整理してしようと言うのが本記事の目的です。なお**電子署名**（Electronic Signature）と対比させる場合には**eシール**ではなく、**電子シール**（Electronic Seal）の方が相応しいと考えている（eシールならe署名では？）ので、以下では全て電子シールとして書いていますが、eシールの方が好きな方は読み替えてください。でははじめましょう。

### 1.1 電子署名との技術的な差異

電子署名のライブラリは通常技術としては公開鍵暗号を使ったデジタル署名を使います。OpenSSL等でRSA暗号やECDSA暗号を使います。電子シールもこの点では全く同じです。技術的に異なるのは**利用するX.509電子証明書の主体者（Subject）が、電子署名では自然人であることに対して、電子シールでは非自然人（組織や法人等）となること**です。技術的な違いはこの電子証明書の属性の違いだけとなります。

:::note
**電子署名と電子シールの技術的な差異：**
- 電子署名：電子証明書の主体者（Subject）が自然人
- 電子シール：電子証明書の主体者（Subject）が非自然人（組織や法人等）
:::

### 1.2 電子シールの利用目的

では電子証明書の主体者（Subject）が非自然人であるとはどういう目的で利用するのかと言うことになります。例えば電子署名法では署名者本人の意思と非改ざん性を求めています。

:::note
**電子署名の主な目的：**
- 本人の意思：署名者の身元保証と内容に対する本人の承認意思
- 非改ざん性：署名対象が署名時点から改ざんされていないこと
:::

意思を行使できるのは自然人になります。よって電子署名法では署名者は自然人である必要があります。では非自然人の電子シールはどのような目的で使うのでしょうか。一般には電子シールは発行元保証と非改ざん性が目的となります。

:::note
**電子シールの主な目的：**
- 発行元保証：文書を発行した組織等による内容の保証
- 非改ざん性：署名対象が発行時点から改ざんされていないこと
:::

なお上記は主な目的であり、電子シールでも署名者本人の意思が無いと言う訳ではありません。ユースケースによりどこに重きを置くかの違いです。サーバーのTLS証明書も主体者（Subject）がドメイン名になると言う意味では非自然人であり電子シールの一種と言えなくもありません（違いますがw）。

### 1.3 電子署名との運用的な差異

電子署名と電子シールがほぼ同じ技術であることは前述した通りです。しかし運用は少し異なります。１つ目は、電子署名サービスでは利用者数だけの署名鍵を管理する必要がありますが、電子シールでは基本的に１システムに１つの署名鍵で済みます。２つ目は、電子署名では署名時に内容確認して承認するプロセスが必要ですが、電子シールでは事前に定められたルール（例えば自発行文書なら全て対象とする）に従って自動署名が可能となります。

|電子署名|電子シール|
|:-|:-|
|署名者毎に異なる署名鍵が必要|全ての文書に１つだけ署名鍵が必要|
|署名時に承認するため内容確認が必要|一定のルールの元に自動署名が可能|

運用的に見ると１システムに１つだけ署名鍵が必要と言う点で、電子シールはやはりTLS証明書に近いのかもしれません。

## 2. PDF署名とAATL

電子シールは一般には発行文書に対してデジタル署名することだと説明しました。発行文書の多くは現時点ではまだPDFファイルで公開または提供されていることが多いでしょう。そうなると一般に電子シールにはPDF署名を使うことになります。PDF署名を検証する一番楽な方法はAdobe Readerを使うことですので、通常は検証者がAdobe Readerで検証することを想定します。ここで出てくる問題点は電子シールに利用する電子証明書がAATLに対応しているかどうかと言うことです。AATLとは Adobe Approved Trust List の略です。Adobe Readerが信頼している認証局のリストと言えます。AATLについて詳しくは<a href="https://helpx.adobe.com/jp/acrobat/kb/approved-trust-list2.html">AdobeのAATL説明ページ</a>をご覧ください。

つまり電子シールに使う電子証明書はAATL対応していた方が良いと言うことになります。AATLに認定される為の条件の１つに署名鍵はIDカード/USBトークン/HSM等のセキュアなハードウェアに格納されていると言うことがありますので、電子シールに利用する署名鍵はハードウェアに格納されている必要があります。

### 2.1 PDF署名サービスの利用

PDFへ電子シールを付与する一番簡単な方法はPDF署名サービスを利用することです。電子シール対応のPDF署名サービスであれば、電子シール用の電子証明書を発行して利用可能となります。ただ通常この方法は署名するPDFファイルをPDF署名サービスに送信する必要があります。PDFファイルが小さくかつ量が少なければこのPDF署名サービスの利用が簡単でしょう。

### 2.2 自分でPDF署名

大量に発行するPDF文書に電子シールを付与する場合には、電子シール用の電子証明書とPDF署名ライブラリを入手して自分でPDF署名する方が有利です。この場合には自分のシステムに電子シールする機能を組み込む必要がありますので手間と初期コストはかかります。組み込みの難易度は署名鍵の種類に依存します。

## 3. 署名鍵の種類と利用（自分でPDF署名）

署名鍵の提供形態としては、ソフトウェア的なファイルとして署名鍵を提供する場合と、ハードウェア的なデバイスとして署名鍵を提供する場合と、サービスに預けた署名鍵を利用する場合の３パターンがあります。更にハードウェア的なデバイスとして、自然人がローカルに利用するUSBトークン/ICカードと、システムがサーバー上で利用するHSM（ハードウェア・セキュリティ・モジュール）に分かれます。

### 3.1 ソフトウェア：PKCS#12ファイル形式

PKCS#12は署名鍵と電子証明書をパスワード暗号化されたファイルとして提供するものです。古くはPFXとも呼ばれています。利用時にはPKCS#12ファイルとパスワードを指定します。多くの署名ライブラリが対応しており、特段ハードウェアを用意する必要も無く、ソフトウェアの実装だけで済むので、セキュアではありませんがとても便利です。またLinux等の署名ライブラリでも利用可能です。


しかしAATL対応の電子証明書でPKCS#12形式に対応したサービスを提供する認証局はありません。これは前述したようにAATL認定の条件に合わないからです。Windows証明書ストアに対応した電子証明書がPKCS#12形式で提供されることはありますが、その場合にはAdobe Readerの環境設定でチェックボックスをオンにして設定変更する必要があります。利用者が全てこの対応をしてくれればよいのですが…なかなか難しいですよね。以下は古い画像ですが最新版でも基本的には同じ検証設定があります。

![20130405-ac4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867320/1ebac899-f43c-4e87-ba9e-60f39764f4dd.png)

### 3.2 ローカルハード：USBトークン/ICカード

USBトークンやICカードも広義ではHSMの１種です。ですのでAATLに対応した電子証明書をUSBトークンで売っている認証局は多くあります。この場合に電子証明書の名称としては「文書署名用電子証明書」「ドキュメント署名用電子証明書」等となっていることが多いです。一般にはドライバソフトが必要となるので、ローカルなWindows環境での利用が多くなります。署名ライブラリも対応していることが多いです。


WindowsサーバーにUSBトークンを刺してサーバー利用することは技術的には可能です。ただしUSBトークンは署名速度が遅いので、連続して署名するような場合には時間がかかってしまいます。この為にUSBトークン等をサーバーに組み込んで使うようなことは一般には推奨されません。

### 3.3 サーバー：HSM運用/クラウドHSM

サーバーでHSMを使う場合には大きく分けると、サーバーにHSMを組み込む・同じネットワーク上にHSMサーバーを置く・クラウド上のHSMを使う、の3パターンが考えられます。最初の2つは自前でHSMを購入して運用することになりますが、高い安全性を得られる代わりにとても高価ですし、電子シール用の1つの署名鍵だけを利用するにはオーバースペックです。クラウドHSMはクラウドベンダーが自前に管理するHSMを鍵単位で利用するもので、金額も比較的リーズナブル（とは言ってもそこそこしますが）です。おそらく電子シール用途で考えるとクラウドHSMが選択肢となるでしょう。


AATL対応の電子証明書の中にはHSMの署名鍵へ対応してくれる認証局があります。この場合には鍵ペアをHSMの中で生成してCSR（証明書署名リクエスト）ファイルを生成して認証局へ提供します。認証局から電子証明書を入手したら署名鍵と合わせて管理と利用をします。


クラウドHSMを利用する場合に提供されるAPIは、Javaの暗号プロバイダかPKCS#11形式が一般的です。利用する場合には、PDF署名ライブラリを使って署名値計算用のハッシュ値計算までまずおこないます（私はこれを仮署名と呼んでいます）。得られたハッシュ値をHSMに送り署名値を取得してPDFに埋め込むことでPDF署名が実現できます。

### 3.4 サーバー：リモート署名連携

リモート署名にも幾つか種類があります。PDF署名サービスも広義ではリモート署名と言えますが、ここでは署名鍵を預けてAPIを使って署名値の計算だけをおこなう方式をリモート署名とします。クラウドHSMに似ていると言えますが、外部サービスとして提供される点が異なります。また署名値を計算するAPIとしてもCSC（クラウド署名コンソーシアム）等でデファクト標準化されている点が利点となります。リモート署名サービスの事業者の中には電子シールの発行までサービスに含む場合があります。その意味では前準備が比較的簡単と言う利点があります。


利用方法自体はクラウドHSMに近く組み込みが必要です。PDF署名ライブラリを使って署名値計算用のハッシュ値計算までまずおこない、ハッシュ値をリモート署名APIに渡して署名値を取得してPDFに埋め込むことでPDF署名が実現できます。利用するためには認証や認可が要求されますが、IDとパスワードであったり回線制限であったりと言う対応が必要となります。サービスによってはPDF署名ライブラリとして機能を提供する場合もあります。個人的にはリモート署名推しなのでサポートするサービス/認証局が増えるとよいなと期待しています。

## 最後に

以上簡単ですが電子シールを実装しようとした場合の、運用であったり、電子証明書であったり、実装であったり、と言う辺りをまとめてみました。電子シールの主戦場はやはりサーバーで発行する文書へのPDF署名だと思います。しかし署名鍵をどう持ってどう利用するかは結構ハードルがあります。結局はAATL対応まで考えると、クラウドHSMの利用かリモート署名連携がスタンダードな使い方になると思います。その場合には組み込みが必要となりますが、おそらく素人では難しいと思います。無理せず署名ライブラリのベンダーやノウハウを持つ会社等へ相談しましょう。


以上、電子シール（eシール）の利用と実装についての概要と留意点を簡単にまとめてみました。電子シールの導入検討時の参考になれば幸いです。