「Unity/課金/リモートレシート検証/phpサーバ」の版間の差分
提供: 初心者エンジニアの簡易メモ
(→sslが有効になってるか確認) |
(→サーバのsslが有効になってるか確認) |
||
| 行1: | 行1: | ||
==サーバのsslが有効になってるか確認== | ==サーバのsslが有効になってるか確認== | ||
| + | <pre> | ||
| + | $ cd /tmp/ | ||
| + | # 秘密鍵 (private.pem) | ||
| + | openssl genpkey -algorithm RSA -out private.pem | ||
| + | # 公開鍵 (public.pem) | ||
| + | openssl rsa -in private.pem -pubout -out public.pem | ||
| + | </pre> | ||
| + | |||
| + | /tmp/openssl.php | ||
<pre> | <pre> | ||
if (extension_loaded('openssl')) { | if (extension_loaded('openssl')) { | ||
| 行9: | 行18: | ||
</pre> | </pre> | ||
OpenSSLは有効になっています。OpenSSL バージョン:OpenSSL 3.0.7 1 Nov 2022 | OpenSSLは有効になっています。OpenSSL バージョン:OpenSSL 3.0.7 1 Nov 2022 | ||
| + | ==サーバのopenssl_verifyが動くか確認== | ||
| + | <pre> | ||
| + | <?php | ||
| + | $message = "これはテストメッセージです。"; | ||
| + | |||
| + | // 秘密鍵の読み込み | ||
| + | $privateKey = file_get_contents('private.pem'); | ||
| + | $privateKeyResource = openssl_pkey_get_private($privateKey); | ||
| + | |||
| + | // メッセージに署名 | ||
| + | openssl_sign($message, $signature, $privateKeyResource, OPENSSL_ALGO_SHA256); | ||
| + | openssl_free_key($privateKeyResource); | ||
| + | |||
| + | // 署名をBase64エンコード(表示用) | ||
| + | $signatureBase64 = base64_encode($signature); | ||
| + | echo "生成された署名: " . $signatureBase64 . "\n"; | ||
| + | |||
| + | // 公開鍵の読み込み | ||
| + | $publicKey = file_get_contents('public.pem'); | ||
| + | $publicKeyResource = openssl_pkey_get_public($publicKey); | ||
| + | |||
| + | // 署名の検証 | ||
| + | $verification = openssl_verify($message, $signature, $publicKeyResource, OPENSSL_ALGO_SHA256); | ||
| + | openssl_free_key($publicKeyResource); | ||
| + | |||
| + | // 結果を表示 | ||
| + | if ($verification === 1) { | ||
| + | echo "署名は有効です。\n"; | ||
| + | } elseif ($verification === 0) { | ||
| + | echo "署名は無効です。\n"; | ||
| + | } else { | ||
| + | echo "エラーが発生しました。\n"; | ||
| + | } | ||
| + | </pre> | ||
==phpで検証== | ==phpで検証== | ||
2025年3月18日 (火) 13:43時点における版
サーバのsslが有効になってるか確認
$ cd /tmp/ # 秘密鍵 (private.pem) openssl genpkey -algorithm RSA -out private.pem # 公開鍵 (public.pem) openssl rsa -in private.pem -pubout -out public.pem
/tmp/openssl.php
if (extension_loaded('openssl')) {
echo "OpenSSLは有効になっています。\n";
echo "OpenSSL バージョン: " . OPENSSL_VERSION_TEXT . "\n";
} else {
echo "OpenSSLは無効になっています。\n";
}
OpenSSLは有効になっています。OpenSSL バージョン:OpenSSL 3.0.7 1 Nov 2022
サーバのopenssl_verifyが動くか確認
<?php
$message = "これはテストメッセージです。";
// 秘密鍵の読み込み
$privateKey = file_get_contents('private.pem');
$privateKeyResource = openssl_pkey_get_private($privateKey);
// メッセージに署名
openssl_sign($message, $signature, $privateKeyResource, OPENSSL_ALGO_SHA256);
openssl_free_key($privateKeyResource);
// 署名をBase64エンコード(表示用)
$signatureBase64 = base64_encode($signature);
echo "生成された署名: " . $signatureBase64 . "\n";
// 公開鍵の読み込み
$publicKey = file_get_contents('public.pem');
$publicKeyResource = openssl_pkey_get_public($publicKey);
// 署名の検証
$verification = openssl_verify($message, $signature, $publicKeyResource, OPENSSL_ALGO_SHA256);
openssl_free_key($publicKeyResource);
// 結果を表示
if ($verification === 1) {
echo "署名は有効です。\n";
} elseif ($verification === 0) {
echo "署名は無効です。\n";
} else {
echo "エラーが発生しました。\n";
}
phpで検証
$receiptJson = '{"orderId":"GPA.xxxx-xxxx-xxxx-xxxxx","productId":"product1",...}';
$signature = base64_decode('[signatureデータ]');
// 下記のURLなどを参考にpem形式に変換
// FYI: http://php.net/manual/ja/ref.openssl.php
$publicKey = der2pem(base64_decode('[googleplay収益化セットアップのrsa公開鍵]'));
if (openssl_verify($receiptJson, $signature, openssl_get_publickey($publicKey)) === 1) {
// 検証ok
}
