私は夕方に構築している小さなプロジェクトのためにこれを行う必要がありました。
以下が新しい鍵ペア (公開/秘密)を作成することがわかっています。
function newPair (&$private, &$public, $passphrase=null) {
$res = openssl_pkey_new ();
if ($res === false) {
throw new Exception ("Key generation failed: ".openssl_error_string ());
return false;
}
// Sets private by reference
if (openssl_pkey_export ($res, $private, $passphrase) === false) {
throw new Exception ("Private key export failed: ".openssl_error_string ());
return false;
}
// Array returns, contains "key" element.
$public = openssl_pkey_get_details($res);
if ($public === false) {
throw new Exception (openssl_error_string ());
return false;
}
$public = $public["key"];
return true;
}
open_ssl_pkey_export() はパスフレーズの魔法を行います。したがって、パスフレーズを次のように変更できます。
function changePassphrase ($private, $old, $new=null) {
$res = openssl_pkey_get_private ($private, $old);
if ($res === false) {
throw new Exception ("Loading private key failed: ".openssl_error_string ());
return false;
}
if (openssl_pkey_export ($res, $result, $new) === false) {
throw new Exception ("Passphrase change failed: ".openssl_error_string ());
return false;
}
return $result;
}
ここで行ったことに従ってください... ! (明らかに、例外のスローは純粋にオプションです...コードベースからコードをそのままプルしました。)
changePassphrase() は、現在および新しいパスフレーズとともに、秘密鍵を文字列として受け取ります。openssl_pkey_get_private() を使用して秘密鍵のハンドルを取得し、古いパスフレーズでロックを解除します。
(パスフレーズは秘密鍵を暗号化するために文字通り使用されることに注意してください。これは少しダブルダッチに聞こえるかもしれません![暗号化鍵を暗号化しています... ?!] openssl_pkey_get_private() は、鍵の解釈に失敗した場合に FALSE を返します。パスフレーズが間違っていて、秘密鍵が無効な値に復号化された場合。意味がありますか?)
古いパスフレーズで秘密鍵のロックを解除したら、OpenSSL キー ハンドルを取得し、それを openssl_pkey_export() に渡します。最初に (openssl_pkey_new() を介して) 新しいパスフレーズを提供して作成した後と同じように... -プレスト。
私のコード例がきれいに読めることを願っています。不必要な「圧縮」や省略をせずに、理解しやすく従うのが簡単な方法でコードを記述しようとしました。
幸運を!