@tuxx

Openssl_sign не принимает файл PEM?

Выдвет постоянно ошибку:
PHP Warning:  openssl_sign(): supplied key param cannot be coerced into a private key in


Пример кода:
class SomeClass {
    public function verify() {
        $key = openssl_get_privatekey('./private_key.pem', 'strong_password');
        $signature = null;
        if (openssl_sign(base64_decode($data), $signature, $key, OPENSSL_ALGO_SHA256) === false) {
            throw new \Exception(openssl_error_string());
        }
    }
}


Файлы PEM сгенерировал такими командами:
openssl genrsa -aes256 -out private_key.pem 2048
openssl rsa -pubout -in private_key.pem -out public_key.pem


Версия OpenSSL: OpenSSL 1.1.1b 26 Feb 2019

Примеры файлов. private_key.pem:
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-256-CBC,61078E5A491AAFBA18BBABE978C78BDF

BqJ06kTyUlX4DDzNmwEkn3Ujy8iQUD+j5mxI8kIvVkqU+gGMHWhCVn66ZtGFreFw
yZ7EMUHx9uQmZQ0sSsVxhmGljejAfmnWqdK3FS4HMZQAxDveRq123zw6I3pjXk6f
WCsEakTL1hcsM3IzUYRDOK4BFGM5uJZcLW4UNiTz6uto0yquReuxJV8S6zNEgxuk
O6hYQvAAr+OvprehGb0IuH1FfOrIF6dhqPyyHtVDPEpnKtLXvGptclk4PgAgOfdt
oMic5z4xO9Nmdfk3L4zalNZkVhfmTb//EEbIB2V5TBVuRoh2RuV2Y71Fqf0LwctD
9Ys+P0VQ/4e27QYlkXsxAdm/uVQncnHA3couU5vaUpP2NlIL+DbrqncMeXxTGuu3
tFP8FtBMrPvdgqIqFiUthUmemhN7uOatIQrbxXWenPnUT79bp9/9sDL+ovgN61cR
p50Fu6oJAnv3edgC4LY5btkQjszP2QtLZ0KYbB6b+6nwJpuH31QnIGNPURNqS+1d
irPqHpL5Nt5OILtVjiuampSk2o9xngIYFel5rihawEszKVUAtAT6k3IPOaNNpoia
9Djna+CdedIKbnWCRk6uJzmKowr5D6+Eh+79/z6sne7e2FD2S0IzcByYv/EHcJLR
L8Rb8so/0fBwZ5b8bQt/HidL+e54xwSbZzkVehQv0c56dPeIeUruMleZoqHbNm7u
5ly20hrPcedvHVYRMgihNWoJEb/LmFDu6m5sQfn+EUdK1mjqcDdIxSb1pXh3HF0X
sfXd5ej3JSLXP7+yZ+GaqCShotiUwn2XMz3sPoMOkYt3Og27wQmXcARnxSLP6i0P
0G+qfsusZq9cokH2ePcgXWV5Je3KIlyKrVpBGTxk8623NXK1k+osijsMAyG50E0M
mLqm2yceg1ABXiaKzuTGuhaqNMVkjbWZnoaxgUrVgK0btVGga5p0G2iqO2B9ydOj
d0BeO2dh2NuXrHxfqaxkCNC7dsic1Fml/T5wxMC7cTUEF0xiYRBxbhqLRhBP/D97
glcQs3yuWbb0pTI2taJfnH6i9VV0nHWeySnMpPz2dE1yy12tRCLJIR0Z1Eubr/lu
PN4QztlkeI6dcLu9UChGy4vW15AEZY8HZvTyTl1pWwq+VlqezhlzSH/qmMSGUj7w
68CmvSy5+kpJXdoOYIzSq7SleKL0W/rttEXg4fOUFbt6UPyN4BgDllaMrQ5yW5zd
45aMu+IZVyNiHjIKG1P2AsScUQS9Ep7ToKRDiZhKq77AwavQfp6Ka2o1ieL2Moh2
w9/oZ4+9TfKjIJeajRn1yeyh8TEktFKGEMTbV7Ieqlem0kLpLoz4gruL7OInfSNK
aMl6kL7BYcfuUprTwyjFiUObIbllMmUQHaMVuJMD12u2c6E7cptlYBFv6Ppvr8uF
KC8ujdc8LV0i6TGx2lJSIpYIaqv+NTZdPKUjMUC5BUTm0WcA/at7nbRgdE66dQzL
oNJKixKTAGMBVDTwHIhve1Y03yWYGafieiaIdo3SZVvy8NmA3U7uNIvmHk7sgh02
EM0e5tDljgYk2bMvFBgIKA/KylhKfLg9YPl8hOroCH8Yv0fQzazfttqyA+5oSJbB
-----END RSA PRIVATE KEY-----


public_key.pem
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA99cdRyy57fmzCGayRUy6
e2u/9sm+S2QCuWwXFnGCSGbz6ouq3FgFD6vk4yKyf/5LruZvAb/UwZRZwIZcym/x
kDo/BTTIuud8xwuRz6BC79GWbHp1NbDjabtozEPshSW9cSAXV3RtKVnYrOfiCIWV
naZfdYV6NfI3WI/hL3flUz6Dd81e4TwrHCIji5e5n8EHO27g+xsq2iNP2T2ZZQWt
dFvGgqAOona4KE9tAwls9eJk01lw204brH9HfjSCYUvVweKQUoQ1CZjMxrj9xs3/
sIZcw3mdxIJVqpiHu9q00c7L1lWpJG0qGNgg6sIhBXSMA5KtABQo2YfDiRpLtf3A
DQIDAQAB
-----END PUBLIC KEY-----
  • Вопрос задан
  • 1292 просмотра
Решения вопроса 1
@tuxx Автор вопроса
Решил так.
Файлы ключей генерирую командами:
openssl genrsa -des3 -out private_rsa.pem 2048
openssl rsa -in private_rsa.pem -outform PEM -pubout -out public_rsa.pem


Код для работы получился вот такой:
class SomeClass
{
    #region PROPERTIES
    protected static $public_key;
    protected static $private_key;

    const KEY_PASSPHRASE = 'key_passphrase';
    #endregion

    #region PUBLIC METHODS

    public function __construct()
    {
        $keys_dir = dirname(__FILE__) . '/../keys/encrypt/';
        $public_key_path = realpath($keys_dir . 'public_rsa.pem');
        $private_key_path = realpath($keys_dir . 'private_rsa.pem');
        self::$public_key = file_get_contents($public_key_path);
        self::$private_key = file_get_contents($private_key_path);
    }

    public function encode($data)
    {
        if (is_numeric($data) === false || is_string($data) === false) {
            $data = JSON::encode($data);
        }

        $encrypted = null;
        if (openssl_public_encrypt($data, $encrypted, self::$public_key)) {
            $encrypted = base64_encode($encrypted);
        } else {
            throw new Exception('Не удалось зашифровать данные. ' . openssl_error_string());
        }

        return $encrypted;
    }

    public function decode($data)
    {
        $decrypted = null;
        openssl_private_decrypt(base64_decode($data), $decrypted, openssl_pkey_get_private(self::$private_key, self::KEY_PASSPHRASE));

        return $decrypted;
    }

    #endregion
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽