テスト目的でいくつかの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
です。
インタラクティブモードでは、パスワードの入力を求められたら、Enterキーを押すだけで、パスワードは設定されません。
これを自動化する場合(たとえば、ansibleコマンドとして)、-passout
引数。パラメーターの形式はpass:mypassword
。パスワードが必要ないため:
openssl pkcs12 -export -nodes -out bundle.pfx -inkey mykey.key \
-in certificate.crt -certfile ca-cert.crt \
-passout pass:
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);
理論的には、この呼び出しは、およびcpass
がNULL
の場合にのみ、パスワードなしで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ファイルはありません。パスワードなしでコマンドラインで作成する。空のパスワードを持っているかもしれませんが、確かにパスワードを持っています。