使用google-api-php-client获取“无法解析p12文件...”错误

时间:2014-02-27 19:58:08

标签: google-api-php-client

我一直在搜索google-api-php-client的新旧版本以及各种其他示例,但我似乎无法绕过这个错误。 下面的代码是从GitHub检索到的服务帐户示例,我从API控制台中删除了我的凭据和文件。我有一个我正在构建的不同文件,但是为了在这个问题中使用,我认为这个更简单的文件会更容易讨论。我对这两个文件都有同样的错误。

  

致命错误:未捕获的异常'Google_Auth_Exception',并显示消息'无法解析p12文件。这是一个.p12文件吗?密码是否正确? OpenSSL错误:第52行的/google-api-php-client/src/Google/Signer/P12.php

我完全不知道为什么会抛出这个错误。

我已经验证“file_get_contents”实际上是获取文件的内容并且我的“notasecret”密码被正确拉出。我希望this recent commit可能有所帮助,但不幸的是,它并没有为我解决这个错误。

知道这里出了什么问题吗?谢谢你的任何建议!

<?php

session_start();
include_once "templates/base.php";

set_include_path("../src/" . PATH_SEPARATOR . get_include_path());
require_once 'Google/Client.php';
require_once 'Google/Service/Books.php';


$client_id = 'xxxx.apps.googleusercontent.com';
$service_account_name = 'xxxx@developer.gserviceaccount.com';
$key_file_location = 'xxxx-privatekey.p12';

echo pageHeader("Service Account Access");
if ($client_id == 'xxxx.apps.googleusercontent.com'
    || !strlen($service_account_name)
    || !strlen($key_file_location)) {
  echo missingServiceAccountDetailsWarning();
}

$client = new Google_Client();
$client->setApplicationName("Client_Library_Examples");
$service = new Google_Service_Books($client);

if (isset($_SESSION['service_token'])) {
  $client->setAccessToken($_SESSION['service_token']);
}
$key = file_get_contents($key_file_location);
$cred = new Google_Auth_AssertionCredentials(
    $service_account_name,
    array('https://www.googleapis.com/auth/books'),
    $key
);
$client->setAssertionCredentials($cred);
if($client->getAuth()->isAccessTokenExpired()) {
  $client->getAuth()->refreshTokenWithAssertion($cred);
}
$_SESSION['service_token'] = $client->getAccessToken();


$optParams = array('filter' => 'free-ebooks');
$results = $service->volumes->listVolumes('Henry David Thoreau', $optParams);
echo "<h3>Results Of Call:</h3>";
foreach ($results as $item) {
  echo $item['volumeInfo']['title'], "<br /> \n";
}

echo pageFooter(__FILE__);

6 个答案:

答案 0 :(得分:3)

我也遭遇了这个错误,在我的情况下,问题是.p12文件只有所有者的读取权限,没有组和其他人的访问权限。为此,我花了两天的时间......

现在我收到错误&#34;用户对此个人资料没有足够的权限&#34;但至少是新事物!!

答案 1 :(得分:3)

我偶然发现了同样的问题。将p12文件转换为.pem(正如theonlynewts建议的那样)并不适用于我。没有&#34; --- BEGIN RSA私人钥匙---&#34; .pem文件中的部分

但奇怪的是,虽然这不起作用(来自Google的P12.php的原始代码):

if (!openssl_pkcs12_read( $p12, $certs, $password)) { ...

这项工作:

$pkcs12 = file_get_contents( $p12 );
if (!openssl_pkcs12_read( $pkcs12, $certs, $password)) { ...

(在Kubuntu 14.04上的PHP 5.5.9上测试)

答案 2 :(得分:1)

知道了! This commit让我想到也许openssl也不喜欢我们的文件。我使用these instructions将文件从p12转换为pem。然后我编辑了文件以删除“----- BEGIN RSA私钥-----”之前的一些文本,因此新提交的代码将正确识别它。删除该文件并获得像魔术一样的结果。

就是这样!我仍然不确定是什么原因会导致自动生成的p12文件不合作,所以如果有人有任何想法,请告诉我。

答案 3 :(得分:0)

我很确定你需要在这部分代码中的某处写下“notasecret”这个短语:

$key = file_get_contents($key_file_location);
$cred = new Google_Auth_AssertionCredentials(
    $service_account_name,
    array('https://www.googleapis.com/auth/books'),
    $key
);

'哪里?',是问题......

看起来它具有正确的代码:https://github.com/google/google-api-php-client/blob/master/src/Google/Auth/AssertionCredentials.php

我会在测试后更新我的答案以确认其有效。

:)

答案 4 :(得分:0)

这通常只是文件权限问题。确保运行apache的用户有权读取p12文件。

答案 5 :(得分:0)

我在解析p12文件时也遇到了麻烦。它始终显示错误,如“Undefined function openssl_pkcs12_read()”。 要摆脱此错误,首先必须检查php.ini文件。 打开php.ini然后搜索openssl然后取消注释该行。现在保存并重新启动所有wamp服务。

你的功能正在发挥作用。