Для проекта, над которым я работаю, я использую Amazon AWS SDK для PHP, и мне нужно было получить пароль для серверной среды в текстовом формате. Тем не менее документация метод ec2 подтвердил то, что мы нашли: метод будет возвращать только зашифрованную строку. На первый взгляд, это было хорошо, потому что AWS SDK для PHP использует незашифрованный HTTP-запрос POST для отправки и получения данных через cURL, незаметно для пользователя. Таким образом, мы не разглашаем наши данные о паролях по сети.
Проблема заключалась в том, что не было ничего, объясняющего, как расшифровать строку. У меня был личный ключ в виде файла PEM, но не было никакого метода или документации для того, что делать с этой строкой, чтобы сделать ее пригодной для использования. Несколько попыток ничего не дали, и я начинал думать, что мне нужно переосмыслить свою стратегию для проекта, на котором я работаю, но потом я нашел код из последней версии AWS SDK для PHP, и он показал, как это сделать. расшифровывать строку, чтобы получить текстовую форму пароля.
Ответ, который я нашел, заключался в том, что метод getPasswordData возвращает строку, зашифрованную с помощью base64 и зашифрованную. Вам нужно декодировать его с помощью base64_decode (), прежде чем вы сможете успешно расшифровать его с помощью библиотеки PHP OpenSSL. Следующая функция выполняет обе функции:
/**
* @param obj $ec2_client The EC2 PHP client, from the AWS SDK for PHP
* @param string $client_id The ID of the client whose password we're trying to get.
* @return mixed The unencrypted password for the client, or false on failure.
*/
function aws_get_ec2_password($ec2_client, $client_id){
// First, run getPasswordData to get the Password Data Object.
$pw_obj = $ec2_client->getPasswordData($client_id);
// Next, use the local get() method to isolate the password
$pw_b64 = $pw_obj->get("PasswordData");
// Decode the password string.
$pw_encrypted = base64_decode($pw_b64);
// Now, get your PEM key.
//
// You can also use a raw string of the PEM key instead of get_file_contents(),
// or adjust the function so that you can pass it as an argument.
//
// Technically, this step might not be necessary, as the documentation for
// openssl_private_decrypt() suggests that $key can just be the path, and it will
// create the key object internally.
$key = openssl_get_privatekey(file_get_contents("path/to/key.pem"));
// Create an empty string to hold the password.
$pw = "";
// Finally, decrypt the string and return (will return false if decryption fails).
if(openssl_private_decrypt($pw_encrypted, $pw, $key)){
return $pw;
}else{
return false;
}
}
Я надеюсь, что это поможет кому-то еще избежать головной боли, которую он мне дал!
Других решений пока нет …