してみるテストロゴ
Apache 2.4系でHTTP/2サーバを構築してみるテスト。

OpenSSL1.1.0と以前のバージョンとの互換性

OpenSSLは、暗号通信のライブラリといったイメージがありますが、コマンドライン上で、ファイルを暗号化する機能もあります。

OpenSSL1.1.0系は出たばかりですので、まだまだOpenSSL1.0.2系以前を使うホストマシンと暗号ファイルのやり取りをすることがあると思います。

このバージョンの違いに落とし穴があって、嵌まったので自戒の念込めて書いてみたいと思います。

ファイルの暗号化コマンド

今回のお話の対象、はopensslの、encコマンドです。

以下のような使い方で、ファイルを暗号化し、

$ /usr/local/ssl/bin/openssl enc -e -aes-128-cbc -pass pass:[pass_phrase] -in [src_path] -out [enc_path]

同様に、以下のような使い方で、ファイルを復号化する使い方です。

$ /usr/local/ssl/bin/openssl enc -d -aes-128-cbc -pass pass:[pass_phrase] -in [enc_path] -out [dec_path]

図にすると、以下のような感じです。

SALTは、送信側ホストで疑似乱数から生成します。

このSALTによって、同一内容の平文を暗号化しても毎回、内容が異なる暗号化ファイルに見せることができます。

同一バージョンの、OpenSSLを使ったホスト間では、問題なく上記コマンドで、暗号化ファイルのやり取りが行えるのですが、片方が、OpenSSL1.0.2で、片方がOpenSSL1.1.0だと、うまく復号化できなくなっています。

変更されたのは、パスフレーズから鍵を生成するデフォルトの一方向関数

上記の図のように、OpenSSLのファイル暗号化では、一般に、パスフレーズから、初期値IV(Initial Vector)と鍵を生成しています。

OpenSSL1.0.2以前では、パスフレーズから初期値IVと鍵を生成するための一方向関数として、MD5がデフォルトで利用されます。

一方、OpenSSL1.1.0では、パスフレーズから初期値IVと鍵を生成するための一方向関数として、SHA256がデフォルトで利用されます。

そのため、同じコマンドを使っても、異なる鍵生成処理が行われ、復号化に失敗してしまいます。

対策としては、2通り有ります。

ここでは、送信側が、OpenSSL1.1.0で、受信側が、OpenSSL 1.0.2の場合を例にしましす。

送信受信のOpenSSLのバージョンが逆の場合は、それぞれ、一方向関数が適合するように、変更して下さい。

OpenSSL 1.0.2以前が、SHA256による鍵生成に対応している場合

パスフレーズから、鍵と初期値を生成する際の、一方向関数の選択は-mdオプションを使います。

ヘルプを見ると、-mdオプションには、md2, md5, sha or sha1としか表示されないので、SHA256はつかえないと勘違いしてしまいますが、OpenSSL 1.0.2ではmdオプションにSHA256を指定することができます。

この場合は、以下のように、受信側ホスト(OpenSSL1.0.2以前)で、

$ /usr/local/ssl/bin/openssl enc -d -aes-128-cbc -md sha256 -pass pass:[pass_phrase] -in [enc_path] -out [dec_path]

とすると、復号化できるようになります。

当然、パスフレーズからの鍵生成は、暗号強度の高い一方向関数を使った方が良いので、SHA256を使うこの方法が推奨です。

OpenSSL 1.0.2以前が、SHA256による鍵生成に対応していない場合

とはいえ、復号側ホストをいじれなかったり、復号側ホストに、OpenSSL0.9.8などがインストールされている場合も考えられます。

この場合、送信側ホストのOpenSSL1.1.0側で、md5を使った鍵生成で暗号化を行う必要があります。

この場合は、送信側ホスト(OpenSSL1.1.0)で、

$ /usr/local/ssl/bin/openssl enc -e -aes-128-cbc -md md5 -pass pass:[pass_phrase] -in [src_path] -out [enc_path]

とすると、受信側ホストで、復号化できるようになります。

openssl encコマンドのリファレンス

ということで、最後に、OpenSSLのencコマンドのリファレンスを載せておきます。

/usr/local/ssl/bin/openssl enc [オプション]

オプション

-in <file>入力ファイル
-out <file>出力ファイル
-pass <arg>パフフレーズの指定
-e暗号化します。
-d復号化します。
-a/-base64-e -dフラグに応じて、base64エンコードもしくはデコードを行います。
-kパスフレーズを指定します。
-kfileパスフレーズを指定ファイルから読み込みます。
-md共通鍵と初期値IVを生成する、一方向関数を指定します。md2, md5, sha, sha1, sha256が利用できます。
-S saltSALTを指定します。
-iv 初期値(IV:Initial Vector)を指定します。
-K 鍵(Key)を指定します。
-[pP] 初期値IVと鍵(Key)を表示します。(-pなら復号化します。-Pならな復号化しません。)
-bufsize <n>バッファサイズを指定します。
-nopad標準のブロックパディングを行いません。
NEXT >> トップページに戻る

©Copyrights 2015-2023, non-standard programmer

このサイトは、あくまでも私の個人的体験を、綴ったものです。 軽く参考程度にご利用ください。