ECC証明書を実際に試してみる。

2010年に暗号の2010年問題とうたわれて、RSA1024bitの暗号強度はセキュリティが弱いため2048bitに移行が推奨されました。

更なる次の移行先として注目されているのがこのECC暗号と言われるものです。

ECCとは、楕円曲線暗号(Elliptic Curve Cryptography: ECC)を用いた暗号方式です。

RSAと比較した場合のECCの優位点と欠点

RSAとは、素因数分解問題が困難なことを利用した暗号方式です。
ECCとは、楕円曲線上の離散対数問題の安全性を根拠とした暗号方式です。

RSAについては、1024bitから2048bitへ移行した際に話題となりましたが、鍵長が2倍になることによって、RSAの処理をするために4~5倍の計算量が必要となります。
今後CPUの性能が向上し、暗号の解析速度が向上した場合に、2048の次である4096bitのへ移行した場合さらに4~5倍の計算量が必要になります。

では、ここでECCについてはどうなるか考えてみます。
ECCでは一般的な鍵長は決まっていませんが、主流となっているのは256bit以上の鍵長が使われています。
RSAに比べて短い256bitの鍵長ですが、RSAに換算するとRSA3072bitと同等の暗号強度になります。

処理速度についてはどうなのか。

以下のサイトでも速度について詳細が書かれている。簡単にまとめると以下の通りである。

同一の安全性を求める場合、署名に用いるECDSAはECC、署名検証はRSAが高速だったという。

セッション数が増えると、サーバー側の処理負荷の小さいECDSAのメリットが大きくなり、両社のレスポンスタイムに差が出てくる

小悪魔ブログもECC?シマンテックが新暗号アルゴリズム解説

※ECDSA

ECCはサーバ側での署名では時間はかからないが、ブラウザ側で行われる検証ではRSAのが高速である。
しかし、通信料が増えるに従いサーバ側の処理が少ないECCのほうがレスポンスタイムが速くなるということである。

実際に鍵長を長くした場合にECCの優位性が顕著になる。
RSAは、鍵長が倍になるたびに4~5倍の計算量が必要になるが、ECCは鍵長が倍になっても必要な計算量が2倍になるだけで済む。
スポンサーリンク

RSAとかECCってどこで使われるの?

RSAやECCとか共通鍵方式で使用される共通鍵を安全に送るために公開鍵制度で使われます。

共通鍵方式ってなんです?

SSL通信については今度詳細を書きますが、ここでは簡単に説明します。
通常SSL通信というのは暗号/複合の処理が早く暗号強度が高い共通鍵でデータを暗号化をして通信をしています。

共通鍵とは、サーバ側とクライアント側が共通している持っている鍵です。
この共通鍵にて暗号化/複合化してSSL通信を行っています。
ただこの共通鍵にはひとつ問題があり、サーバ側とクライアント側でお互いが共通鍵を持たなければなりません。

しかし、共通鍵をそのままインターネットへ流してしまうと暗号通信が見破られて意味ないですよね。

そこで、使われるのが公開鍵制度です。

公開鍵制度とは?

公開鍵制度とは、二組の鍵を組み合わせ実装しています。
二つの鍵とは、「公開鍵」と「秘密鍵」と呼ばれるものになります。

公開鍵とはその名前のとおり世間一般に公開している鍵です。実際には、SSLサーバ証明書に紐付けられて公開されています。
この公開鍵は少しユニークで、公開鍵で暗号化したものについては、秘密鍵でしか複合することができません。

簡単にまとめると以下のような感じです。
Aさんが公開鍵と秘密鍵を持っているとします。
AさんはBさんに公開鍵を渡します。
Bさんは、その公開鍵でデータを暗号化して、Aさんに送付します。
公開鍵で暗号化されているデータについては、Aさんが持っている秘密鍵でした開くことができないのでAさん以外が中身をみることはできません。
そうすることでBさんはAさんに対してデータを他人から見られずに送付することができます。

つまりどういうこと?

共通鍵は暗号強度が高いし処理速度も速いけどお互いに所持する必要がある!
インターネットに共通鍵を流してしまっては、暗号の意味がないので秘匿に渡したい!
そんなときに使うのが、公開鍵方式です。

HTTPSにてWEBサイトにアクセスすると、サーバ証明書に紐付けられた公開鍵を入手することができます。

その公開鍵を使って共通鍵の元ネタになるデータ暗号化してを送付します。

サーバは秘密鍵で共通鍵のデータから共通鍵を作成します。

クライアントも同じように共通鍵を作成します。

これお互いが共通鍵を持つことができましたので、共通鍵にてSSLの通信を始めることができます。

優位性はどれくらい?

クライアント側の優位性
・鍵長が短い+処理速度必要ないため、少ない負荷で通信をすることができる
・RSAより暗号強度が高い通信で安全に通信ができる!

サーバ側の優位性
・暗号強化により、情報の流出が防ぎやすくなる!
・大量にアクセスがきてもRSAと比べて少ないリソースしか消費しない!

どうやったら作れるの?

作るのは簡単です。最新のOpenSSLがあれば作成することができます。

OpenSSLで以下のコマンドで秘密鍵を作成します。

# openssl ecparam -out private.key -name prime256v1 -genkey

ecparam  楕円曲線のアルゴリズムを使用する
-out private.key  -out <ファイル名>でファイル名の秘密鍵を作成
-name prime256v1  256bitのECC鍵を指定
-genkey  鍵の生成

続いてOpenSSLで以下のコマンドでCSR(SSLサーバ証明書を作るデータ)を作成します。

# openssl req -new -key privatekey.key -out request.csr

req -new  CSRの作成
-key private.key  -key <ファイル名>でファイル名の秘密鍵でCSRを作成
-out request.csr  -out <発行されるCSRの名前>

コマンドを実行すると会話形式で情報を入力する必要がある。

# openssl req -new -key privatekey.key -out request.csrYou are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
—–
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) [Default City]:Chiyoda-ku
Organization Name (eg, company) [Default Company Ltd]:My Company Ltd.
Organizational Unit Name (eg, section) []:Joho-bu
Common Name (eg, your name or your server’s hostname) []:www.sample.com
Email Address []:

Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Country Name Country (国名)
State State(都道府県名)
Locality Name Locality(市区町村名)
Organization Organizational Name(組織名)会社名・団体名などの正式英語組織名
Organizational Unit Organizational Unit(部門名)
Common Name Common Name(コモンネーム)
Email Address EMailアドレス※省略可能
password 必要であれば入力※省略可能
optional company ほかの組織名※省略可能

その後発行されたCSRをCA認証局に送付したらSSLサーバ証明書を入手できる。

そもそもECCが使えるか調査したい。

可能です。やり方は2パターンあります。

1パターン目:
大手のサーバ証明書を発行するCA認証局はテスト用にECCのSSL証明書を発行してくれるところがございます。

2パターン目:
自己署名(オレオレ証明書)を発行し、実際に動作するか試す。

オレオレ証明書についてはOpenSSLで作成することができます。

#  openssl x509 -days 3650 -req -signkey privatekey.key < request.csr > server.crt

これで発行されたserver.crtがSSLサーバ証明書となります。

作成した証明書と、秘密鍵をサーバにインストールすることによってECCで通信を行えるか調査することができます
※オレオレ証明書の場合、証明書エラーが発生する可能性がございます。

まとめ

暗号の2010年問題や脆弱性の年といわれた2014年・・・サーバの処理能力が高くなるにつれて、暗号強度についてもよりいっそう必要となります。
日本ではマイナンバー制度が開始されるのに伴い、新しい暗号通信を試してみてはいかがでしょうか。

SSL通信や仕組みについてわからないことや、これは違うのでは?という指摘がございましたらコメント欄までお願いします!!