web-dev-qa-db-ja.com

エクスポートパスワードなしでPKCS#12ファイルをエクスポートしますか?

テスト目的でいくつかのpkcs#12ファイルをエクスポートして生成しています。これらのファイルは実稼働では使用されておらず、自動テスト中に一時的にのみ存在します。

私は次のコマンドを使用しています:

openssl pkcs12 -export -nodes -out bundle.pfx -inkey mykey.key -in certificate.crt -certfile ca-cert.crt

-nodesを含めたときに、エクスポートパスワードを要求するのはなぜですか?

私のOpenSSLバージョンは、Ubuntu Server 14.10 64ビット上のOpenSSL 1.0.1f 6 Jan 2014です。

45
F21

インタラクティブモードでは、パスワードの入力を求められたら、Enterキーを押すだけで、パスワードは設定されません。

これを自動化する場合(たとえば、ansibleコマンドとして)、-passout引数。パラメーターの形式はpass:mypassword。パスワードが必要ないため:

openssl pkcs12 -export -nodes -out bundle.pfx -inkey mykey.key \
    -in certificate.crt -certfile ca-cert.crt \
    -passout pass:
58
F21

tl; drOpenSSLコマンドラインユーティリティでは、あなたがやろうとしていることは簡単にはできません。 OpenSSLの暗号化ライブラリであるlibcryptoを使用してプログラムでのみ実行できます。

詳細な回答:

-nodesは「秘密鍵を暗号化しない」ことを意味しますが、PKCS#12ファイルでは証明書も暗号化されるため、-nodesであってもエクスポートパスワードが必要です。

-descertのドキュメントを参照してください:

トリプルDESを使用して証明書を暗号化します。これにより、一部の「輸出グレード」ソフトウェアではPKCS#12ファイルが読み取れなくなる可能性があります。デフォルトでは、秘密鍵はトリプルDESおよび40ビットRC2を使用した証明書を使用して暗号化されます。

したがって、このオプションを使用しない限り、証明書はRC2を使用して暗号化されます。オプション-keypbeおよび-certpbeを使用して、キーまたは証明書のアルゴリズムを変更できます。

また、openssl pkcs12の場合、-nodesオプションはセクションにのみリストされています。

PKCS12ファイルを解析するためのオプションは次のとおりです。

しかし、あなたはそのようなファイルを解析しているのではなく、それを作成しているのです。

PKCS12ファイル作成のオプションは次のとおりです。

オプション-nodesはリストされていません。

パスワードの入力を求められたときにReturnキーを押すだけでも「パスワードなし」という意味ではありませんが、「空のパスワード」(パスワードは空の文字列)を意味します。これが一部の場合にパスワードなしのように機能する理由は、一部のソフトウェアが空の文字列パスワードを持つPKCS#12ファイルを最初に読み取り、それが失敗した場合にのみ、実際のパスワードの入力をユーザーに要求するためです。これらの場合、ユーザーにプロンプ​​トが表示されることはなく、「パスワードなし」が設定されているように見えます。

Appleは、PKCS#12に常にパスワードが設定されており、「空のパスワード」を入力できないと想定しているため、macOSおよびiOSで問題が発生する可能性があります。空のパスワードセットは、これらのシステムにインポートすることは不可能ですFirefoxも最初からこの問題を抱えていましたが、 13年前に修正されました

PKCS#12ファイルを読み取るとき、OpenSSL自体は推測によってのみ「パスワードなし」と「空のパスワード」を区別しようとします。プロジェクトの元のコードは次のとおりです。

 /* If we enter empty password try no password first */
 if(!mpass[0] && PKCS12_verify_mac(p12, NULL, 0)) {
     /* If mac and crypto pass the same set it to NULL too */
     if(!twopass) cpass = NULL;
 } else if (!PKCS12_verify_mac(p12, mpass, -1)) {
     BIO_printf (bio_err, "Mac verify error: invalid password?\n");
     ERR_print_errors (bio_err);
     goto end;
 }

パスワードに対して最初にNULLが渡されたとき、2回目にパスワードのために空の文字列が解析されます。 P12ファイルを作成するときのコードを見てみましょう。

 p12 = PKCS12_create(cpass, name, key, ucert, certs,
             key_pbe, cert_pbe, iter, -1, keytype);

理論的には、この呼び出しは、およびcpassNULLの場合にのみ、パスワードなしでPKCS#12ファイルを作成しますが、この呼び出しが行われているとき、NULLにはできません。関数の先頭から上記の呼び出しまでのコードパスをたどると、cpassになるNULL最後に。

 if(!cpass) {
     if(export_cert) cpass = passout;
     else cpass = passin;
 }

 if(cpass) {
   mpass = cpass;
   noprompt = 1;
 } else {
   cpass = pass;
   mpass = macpass;
 }

cpassが最後のNULLでまだifだった場合、passに設定され、passは次のようになります。

char pass[50], macpass[50];

これは静的な静的変数であり、ポインターに格納される場合、このポインターはNULLにはできません。 cpassに異なる値を割り当てるコードは他にないため、cpassは空の文字列にすることはできますが、NULLにすることはできません。したがって、OpenSSLが提供するPKCS#12ファイルはありません。パスワードなしでコマンドラインで作成する。空のパスワードを持っているかもしれませんが、確かにパスワードを持っています。

6
Mecki