« ^ »

OpenSSLを使う

所要時間: 約 3分

OpenSSLは暗号技術のツールキットであり、非常に広範囲に利用されている。使用されているものと言っても良い。実際、OpenSSLで脆弱性が発見されると大きなニュースとなる。2014年に発見され「Heartbleed」と呼ばれるようになった脆弱性(CVE-2014-0160)のニュースは印象的だった。OpenSSLは様々な所で使用されれ使用方法も様々だが、CLIから直接コマンドを実行することで利用もできる。ただし、暗号技術自体の難しさや、ややこしさにより、たくさんのサブコマンドとオプションが用意されている。それらを全て把握する必要はないが、どんなことをしたい時には、どのサブコマンドを使用すればよいのかという程度のことを把握しておいても損はない。今回はopensslコマンドを使用し、用途別に使い方をまとめることにした。

OpenSSLを用いて公開鍵暗号の鍵ペアを生成する

公開鍵暗号では秘匿すべき秘密鍵と、公開するための公開鍵という2つの鍵を作成し利用する。この2つの鍵を鍵ペアと呼ぶ。ここでは鍵ペアをopensslコマンドを用いて生成する。

秘密鍵を作る

まずは秘密鍵を作成する。鍵には長さがあり、長ければ長いほど暗号の強度が増す。例として公開鍵暗号の1種であるRSA暗号を用い、2048bitの長さを持つ秘密鍵を作成する。

openssl genrsa -out private.pem 2048

コマンドが正常に終了すると private.pem という名前で秘密鍵が作成される。出力するファイル名は -out private.pem で指定している。 private.pem の中身は次のような形式として出力される。

-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEA0LsHKJjGRuNJ7zPqEip756Kd7eSj4cFmtMjfsc5Vv/biliDl
rDk4yqWTTp8iWN9i7R7xNYYhkgYxelsgXhkWXLspMpPHvipiFp+i/5m40jDjaIlP
c4wbPVS9UtMR1wMT4qNw2BY10oi9x1be0LZMbGEtUmv9HWONHGOyIpcEmhJ1cvH/
8pFLG+qJhQiSmJOHsAiEw8j0fZ2649EWKNj1ypXKeBK3Fq4dI6Bde8VmNvMtAKg+
7N82/37ulLGM/nqUQSxnGhF1N9BvloJG4mezcPk5epCTNfqJNVgxp4YKOdzXY4mH
Pwj86oHBe1PaqZQ6omFO8UGyG2oRZWA4JH7fMwIDAQABAoIBAQDMk9KjVoFXLyPi
v4YWQe9pCzgw1pxNAwpP/GVK1wmyeR6BuEKC9x6Td48WSuAWLPO/pkkRhaJXhZxu
6OujboE9Z+8r9C2cU9wJgnL2g8risCni5lmpzVNRXEGm8NqWWxzdUAWktLgR3hXr
T1hZRaNHwkLyeob9i/ndLlWEk3FeMxxrZKIcUbBqiZtXNeiHp2rF+HGi/mX4q8ET
RiufgC/t037AhjKByWcn/bXp3Yewgvmj1y93UWPNTjIG+NyRE4qvYQwFDpCJ7hHk
pjRrRcFcO8lhGGjAYDHaS0MYRLSMcnj/2U04wBrK/8Y1XMlVYn94jNm5Zl/keHBV
mur+kzY5AoGBAPxh/qKRTx3GwpNJ+d/JpY4EIgnLEfdbgAizodXCgUrL2EZ/r5eK
/rKpr7CwDFqx+N/1tg3tRq/GnULCjosmJgw7XIXVdsFxQbr+6MKnq7TqgNWJyLcy
9vAVWMNJEifk+kGhJXp0VavIThMX/N/trjvx4C06HC0bS8aX7WZBM7dnAoGBANO4
3wA6LHD3K5CxbfHbRdqIA5uecoGaS6prnoTWAC5E5CYHN6hHqEEU2knzCLBW19Fg
sdADdE/D61rGda8eU7IBlJwx7hGAG4R6/9kCyAckVsU0+CPoKf1NZWLqoZINHkgp
GoqS28N0/HkuY3iedlaEfMU+OfS58MRHtNdTevZVAoGACsCCAJsAK9yT3YKBSq9k
hjBW4uPr2AXl5nkApAKtT2pvxFEcQfCB+UqRWY2meRar656kKuO45zQm7vkq6XKu
nEbLIkh9zq/shPLnJ6PNBOAYrQA5tNRPANtn9KngRCLVJoae+iCKpc7axKV4+HE/
wv4C9upK2QEYsVU3n+uXMHECgYBsl6/ZX/0XW88+gaLQoBTuB0FCejxk+QzCNjyy
CUlCchdK4fzMFSTZbKahs0PLnl9Hhv7soDjyCJ0YjB4kWbu321Or4XgoBbsXcjbz
yZdrAlp2/7oeQJ/4yc+ssod4b74OaPayCK0rTT+JsB9Y6H3t1jpguI/lU9GH+vdo
UesJmQKBgBHNYJ5pX8KVWNInQM0+U4+TtDsvsrit1UR7DFYEa28ZDfxpvAOWruVz
7gHBD7xhvGhHdrlicrcnLwErLI9PHFz5h3yLbmMm06pPiROe9La6lw83GRSmdn0P
1+dKNFaPAOje+Wqpk0c5qniR0HQ9onK1JHCzlyw8mctfP1bolpbr
-----END RSA PRIVATE KEY-----

ここで生成した鍵は何にも利用しないので掲載するが、通常、秘密鍵は誰にも見せてはいけない。もし、見せてしまったなら、ただちに鍵ペアを作り直し入れ替えたほうがよい。それができないか、しにくいこともあるかもしれないが、見られてしまった秘密鍵を使い続ける限り、セキュリティ的なリスクがずっと付きまとう。 ただ、何かしらの事故により秘密鍵が漏洩してしまうということも考えられるため、システムを開発または構築する場合はそれを考慮し、交換可能なようにしておくことは重要だろう。

公開鍵を作る

先ほど生成した秘密鍵を利用し公開鍵を生成する。

openssl rsa -pubout -in private.pem -out public.pem

コマンドが正常に終了すると public.pem という名前で秘密鍵が作成される。出力するファイル名は -out public.pem で指定している。 public.pem の中身は次のような形式として出力される。

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0LsHKJjGRuNJ7zPqEip7
56Kd7eSj4cFmtMjfsc5Vv/biliDlrDk4yqWTTp8iWN9i7R7xNYYhkgYxelsgXhkW
XLspMpPHvipiFp+i/5m40jDjaIlPc4wbPVS9UtMR1wMT4qNw2BY10oi9x1be0LZM
bGEtUmv9HWONHGOyIpcEmhJ1cvH/8pFLG+qJhQiSmJOHsAiEw8j0fZ2649EWKNj1
ypXKeBK3Fq4dI6Bde8VmNvMtAKg+7N82/37ulLGM/nqUQSxnGhF1N9BvloJG4mez
cPk5epCTNfqJNVgxp4YKOdzXY4mHPwj86oHBe1PaqZQ6omFO8UGyG2oRZWA4JH7f
MwIDAQAB
-----END PUBLIC KEY-----

この鍵は誰に見せても良く、必要な人が取得できるように配置する。公開鍵はインターネットに公開してもよく、通常は公開することで、向こうから送信される通信を公開鍵を用いて暗号化してもらい、それを受信し秘密鍵を用いて複合化を行う。またこちらの秘密鍵を用いて暗号化しその情報を送信すると、それを受信した側は公開鍵を用いて複合化できるため、データが改竄されていないことを確認できる。この手法はデジタル署名という。

秘密鍵と公開鍵は1対1の対応となる。つまり1つの秘密鍵に対し、複数の公開鍵を作ることはできない。

クライアント証明書から鍵付き証明書を抜き出す

クライアント証明書から鍵を抜き出す。

openssl pkcs12 -in foo.p12 -out key.pem -nocerts
鍵を抜き出す

実行するとkey.pemに出力される。

証明書を抜き出す。

openssl pkcs12 -in foo.p12 -out cert.pem -clcertsk
鍵付きの証明書を抜き出す

実行するとcert.pemに出力される。