本題
AlmaLinux9環境でAndroidの決済レシートの検証処理が成功しない
状況
AlmaLinux8のOpenSSL/1.1.1kの環境下で
php
1$result = openssl_verify($receipt, $signature, $key, OPENSSL_ALGO_SHA1)
を実行すると問題なく実行でき、$resultは 1(=検証成功) となるのですが、
AlmaLinux9のOpenSSL/3.0.7の環境下で完全に同じソースを実行すると
$resultは -1(=エラー) になります。
openssl_error_string()を使用してエラーの内容を確認したところ、
openssl_error_string
1error:0480006C:PEM routines::no start line 2error:03000098:digital envelope routines::invalid digest
とありました。
※PEMなどの内容はAlmaLinux8環境で成功するものとまったく同じものとなっており、
環境差による結果の差異を考慮しなくて良いように値はすべてリテラルな文字列で定義しています。
OPENSSL_ALGO_SHA1 を OPENSSL_ALGO_SHA256 に変えると
$resultは 0(=検証失敗) となるので、
- OPENSSL_ALGO_SHA1 ⇒ 非推奨のレガシーアルゴリズムのため検証処理の実行に失敗
- OPENSSL_ALGO_SHA256 ⇒ レシートはSHA1が採用されているため、検証した結果、不一致
という状況にあるものと認識しております。
実行環境はPHP8.1.29です。
/etc/ssl/openssl.cnf を
openssl.cnf
1[provider_sect] 2legacy = legacy_sect 3 4[legacy_sect] 5activate = 1 6module = /usr/lib64/ossl-modules/legacy.so
とlegacy関連をコメントアウトし、
legacy.soへのパスを通すことでレガシーアルゴリズムが有効になるという記事があったので
こちらを設定し、phpinfo()で確認すると
PHPinfo
1MULTI_SSL No 2SSL Version OpenSSL/3.0.7 3libSSH Version libssh/0.10.4/openssl/zlib 4 5openssl 6OpenSSL support enabled 7OpenSSL Library Version OpenSSL 3.0.7 1 Nov 2022 8OpenSSL Header Version OpenSSL 3.0.7 1 Nov 2022 9Openssl default config /etc/pki/tls/openssl.cnf 10Directive Local Value Master Value 11openssl.cafile no value no value 12openssl.capath no value no value 13 14$_SERVER['SERVER_SOFTWARE'] Apache/2.4.57 (AlmaLinux) OpenSSL/3.0.7 SVN/1.14.1 15 16OpenSSL Stig Venaas, Wez Furlong, Sascha Kettler, Scott MacVicar, Eliot Lear
という表示となり、
shell
1openssl dgst -sha1 test.txt
とSHA1を使用しての処理が成功する状態になっているので
OpenSSLの設定としてはレガシーアルゴリズムの使用を有効にできているように見受けられるのですが、肝心の
php
1$result = openssl_verify($receipt, $signature, $key, OPENSSL_ALGO_SHA1)
が通らずに困っております。
追記
コメントにてご紹介いただいた記事にあった
shell
1update-crypto-policies --set DEFAULT:SHA1
を実行し、update-crypto-policies --show の結果が DEFAULT:SHA1 と表示される状況で動作確認をしてみましたが、結果は変わりませんでした。
--追記終了
そもそもSHA1で検証しようとしているのが間違いで、
「新しいエンドポイントにアクセスしてSHA256を採用したAndroidの決済レシートを受信する」など、
別の方法があったりするのでしょうか?

あなたの回答
tips
プレビュー