3

Android アプリケーションで IAB v3 に取り組んでいます。購入が成功するたびに、Google開発者コンソールによって生成された公開鍵による検証のために、アプリが署名データと署名をphpサーバーに送り返すようにします。次のコードを見つけました。

<?php
// $data and $signature are assumed to contain the data and the signature

// fetch public key from certificate and ready it
$fp = fopen("/src/openssl-0.9.6/demos/sign/cert.pem", "r");
$cert = fread($fp, 8192);
fclose($fp);
$pubkeyid = openssl_get_publickey($cert);

// state whether signature is okay or not
$ok = openssl_verify($data, $signature, $pubkeyid);
if ($ok == 1) {
    echo "good";
} elseif ($ok == 0) {
    echo "bad";
} else {
    echo "ugly, error checking signature";
}
// free the key from memory
openssl_free_key($pubkeyid);
?>

今、私は問題を抱えています。Google から提供された公開鍵は、Base64 でエンコードされた文字列です。その文字列キーを「.pem」形式に変換する方法がわかりません。

Base64 でエンコードされたキーを上記のコードの "$pubkeyid" に配置した場合。警告が表示されます。

Warning: openssl_verify() [function.openssl-verify]: supplied key param cannot be coerced into a public key in myxxx.php.

String Base64 Encoded 公開鍵を PHP Accept 形式に変換するにはどうすればよいですか?

誰かが上記の経験または解決策を持っていますか? 助けてください。どうもありがとう。

4

3 に答える 3

9

Google から取得した長い base64 でエンコードされた公開鍵を PHP で使用できるものに変換するには、次のようにします。

$base64EncodedPublicKeyFromGoogle = "..."; // This is the public key for your app you get from Google.

$openSslFriendlyKey = "-----BEGIN PUBLIC KEY-----\n" . chunk_split($base64EncodedPublicKeyFromGoogle, 64, "\n") .  "-----END PUBLIC KEY-----";

次に、それを に渡すことができますopenssl_get_publickey()

$publicKeyId = openssl_get_publickey($openSslFriendlyKey);

ご覧のとおり、Google のフォーマットはほぼ正しいものです。64 文字の行に分割し、右側のヘッダー/フッターを前後に追加するだけです。

OpenSSL コマンドを使用して、次のように公開鍵を変換することもできます。

openssl enc -base64 -d -in publickey.base64 -A | openssl rsa -inform DER -pubin > publickey.pem

次に、生成されたpublickey.pemファイルを PHP で読み取り、その内容をopenssl_get_publickey()関数に渡すことができます。

于 2013-06-18T21:57:58.413 に答える
1

ポスターの質問に対する完全な解決策:

<?php
// $data and $signature are assumed to contain the data and the signature

// Paste your google public key below:
$base64EncodedPublicKeyFromGoogle  = "###############################"

//Convert the key to the right format for open SSL
$openSslFriendlyKey = "-----BEGIN PUBLIC KEY-----\n" . chunk_split($base64EncodedPublicKeyFromGoogle, 64, "\n") .  "-----END PUBLIC KEY-----";
$publicKeyId = openssl_get_publickey($openSslFriendlyKey);

// free the key from memory
openssl_free_key($publicKeyId);

//Perform signature verification. Don't forget to decode the signature!
$ok = openssl_verify($data, base64_decode($signature), $publicKeyId, OPENSSL_ALGO_SHA1);
if ($ok == 1) {
    echo "good";
} elseif ($ok == 0) {
    echo "bad";
} else {
    echo openssl_error_string();
}

?>
于 2016-09-05T15:06:11.010 に答える
1

私の問題は、この API によって修正されました。

https://github.com/mgoldsborough/google-play-in-app-billing-verification

于 2013-01-21T11:11:19.073 に答える