web-dev-qa-db-ja.com

OpenSSLで秘密鍵を作成し、それをAES GCMで暗号化する

私の目標は、秘密鍵を作成し、それを強力な暗号で暗号化することでした。そのキーは、内部の証明機関のルート証明書として使用されます。

ただし、opensslはAES 128 GCMをサポートしていますが、この暗号化アルゴリズムを使用してキーを生成および暗号化することはできません。 OpenSSLはerror writing keyを報告します。 AES 128/256 GCMは両方とも失敗しましたが、AES 128 CBCは機能しました。 何が問題なのですか?GCMを使用するときに追加のパラメーターが必要ですか?

コマンドは次のとおりです。

$ openssl genpkey -out ca.key.pem -aes-128-gcm -algorithm rsa -pkeyopt rsa_keygen_bits:4096

出力は次のとおりです。

.........................................................................+++
............................+++
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
Error writing key
:error:23077006:PKCS12 routines:PKCS12_pbe_crypt:EVP lib:p12_decr.c:96:
:error:2306C067:PKCS12 routines:PKCS12_item_i2d_encrypt:encrypt error:p12_decr.c:175:
:error:2307D067:PKCS12 routines:PKCS8_encrypt:encrypt error:p12_p8e.c:88:

注:ほとんどのオンラインリソースは古くなっており(脚注1)、置き換えられたgenrsaまたは-nodes/-desフラグを使用しています。したがって、私はこれらのオンラインリソースを基礎として使用し、さらにopensslの(かなり古くなった)manページとさまざまなopensslコマンドの「-help」フラグを使用して、上記のIMHOの最新のコマンドを作成しています

上記のコマンドで、私は-aes-128-gcmを次のものに置き換えようとしました:

-aes-256-gcm
-aes-128-xts
-aes-256-xts

そして、すべてが失敗しました。 XTSは次のエラーで失敗しました:

:error:0D0A706C:asn1 encoding routines:PKCS5_pbe2_set_iv:cipher has no object identifier:p5_pbev2.c:103:
:error:2307D00D:PKCS12 routines:PKCS8_encrypt:ASN1 lib:p12_p8e.c:79:

使用:

-aes-128-cbc (like in an example in the man page from genpkey)
-aes128
-aes256

すべてうまくいきました。

奇妙なことに、上記の暗号はすべて、私が使用しているopensslのバージョンでサポートされています。

$ openssl enc -help 2>&1 | grep aes | egrep "128|256"
-aes-128-cbc               -aes-128-cfb               -aes-128-cfb1
-aes-128-cfb8              -aes-128-ctr               -aes-128-ecb
-aes-128-gcm               -aes-128-ofb               -aes-128-xts
-aes-192-gcm               -aes-192-ofb               -aes-256-cbc
-aes-256-cfb               -aes-256-cfb1              -aes-256-cfb8
-aes-256-ctr               -aes-256-ecb               -aes-256-gcm
-aes-256-ofb               -aes-256-xts               -aes128
-aes192                    -aes256

注:Ubuntu 14.04.2、Debian 7.8、CentOS 7でテストされています。すべて同じ動作を示しました。

footnote-1:グーグル " openssl generate self signed root certificate "の場合、最初の5つの結果はどれもルートプライベート証明書をトリプルDESよりも良いもので暗号化します!?! 5つの第1リンクの1つのリンクは4096ビットを推奨し、もう1つのリンクは2048または1024を提供します!?!ほとんどは暗号フラグを提供しないため、キーは暗号化されません。実際、 7番目のリンク だけが、何をどのように行うかを説明するのにまともな仕事をします。

更新20161218:openssl 1.0.2gを搭載したUbuntu 16.04 LTSで再度テストされ、成功しませんでした。

3
Huygens

更新された回答:

によると: https://groups.google.com/forum/#!msg/mailing.openssl.users/hGggWxfrZbA/unBfGlsfXyoJ gcmサポートは現在v1.0.1fで壊れています使用)。バージョンv1.0.1.gのパッチが存在し、実行可能なGCMモードになるはずです。ただし、現在のところ、キーラッピングはopenssl genrsaおよびopenssl genpkeyから完全にサポートされているため、CBCモードをそのまま使用します。

古い答え:

文書によると: https://www.openssl.org/docs/apps/ciphers.html

[〜#〜] aesgcm [〜#〜]ガロアカウンターモード(GCM)のAES:これらの暗号スイートのみがサポートされますTLS v1.2

以前のバージョンのUbuntu状態のopensslの変更ログ:openssl(1.0.1e-4ubuntu2)trusty; urgency = low * TLSv1.2の完全なサポートを再度有効にする(LP:#1257877)-debian/patches/tls12_workarounds.patch:TLSv1.2の完全なサポートを再度有効にするパッチを無効にします。現在、問題のあるサイトのほとんどが修正されており、LTSで適切なTLSv1.2サポートが本当に必要です。現在、1.0.1f-1ubuntu9.1をインストールしているので、少なくとも理論的には動作するはずです。しかし、私はあなたを保証することができます、それはしません。モードはまだ壊れていると考えられているかもしれませんが、私は仮定しているだけです。

2
evildead