Поставляемый ключевой параметр не может быть принудительно введен в закрытый ключ с API Google

Я пытаюсь проверить этот пример, который я нашел здесь, чтобы я мог делать прямую загрузку на стороне клиента без входа пользователя с использованием Google Cloud Storage.

Все выраженные константы имеют правильные значения, а путь правильный и не содержит пустого содержимого.

Ошибка, которую я получаю:

openssl_sign(): supplied key param cannot be coerced into a private key 

Моя реализованная функция:

 public static function storageURL( $id, $method = 'GET', $duration = 10 ) { $key = file_get_contents(self::KEY_FILE); $pkey = openssl_get_privatekey($key, 'notasecret'); $expires = time( ) + $duration; $content_type = ($method == 'PUT') ? 'application/x-www-form-urlencoded' : ''; $to_sign = ($method . "\n" . /* Content-MD5 */ "\n" . $content_type . "\n" . $expires . "\n" . '/'.self::BUCKET_NAME.'/' . $id); $signature = '*Signature will go here*'; if (!openssl_sign( $to_sign, $signature, $pkey, 'sha256' )) { error_log( 'openssl_sign failed!' ); $signature = '<failed>'; } else { $signature = urlencode( base64_encode( $signature ) ); } return ('https://'.self::BUCKET_NAME.'.commondatastorage.googleapis.com/' . $id . '?GoogleAccessId=' . self::SERVICE_ACCOUNT_NAME . '&Expires=' . $expires . '&Signature=' . $signature); } 

Во-первых, вам нужно использовать openssl_pkcs12_read для чтения файла ключа, а не file_get_contents . Во-вторых, я считаю, что вы хотите оставить второй параметр openssl_get_privatekey .

Я настоятельно рекомендую вам использовать для этого google-api-php-client , у которого есть Google_P12Signer.php

Более безопасный способ – использовать класс Google_Signer_P12 поставляемый с клиентом API Google API, для этого.

Пример кода:

 set_include_path(get_include_path() . PATH_SEPARATOR . 'PATH/TO/API/src'); require_once 'Google/Signer/P12.php'; $p12contents = file_get_contents('FILE.p12'); $googleSigner = new Google_Signer_P12($p12contents, 'notasecret'); $signature = $googleSigner->sign($data);