본문 바로가기
코드이그나이터와 php7와 mysql

PHP 실무 팁. RHEL9 구글 영수증 이슈

by Cray Fall 2025. 5. 26.

구글 인앱 결제 영수증은 대개 서버에서 검증을 하는 것이 일반적인데요.
이는 부정결제 사용자를 방지하기 위한 방편이기도 합니다.
앱단에서 검증할 경우 중국 결제 서버를 우회하여 마치 결제한 것처럼 위조하는 사용자들이 있기 때문이죠.

최근래 신규 서버 O/S설치 후 앱에서 PHP서버로 전송된 인앱 결제 영수증을 검증하는 부분이 갑자기 검증실패가 뜨며 작동하지 않는 문제가 있었습니다. 설치한 O/S는 CentOS 9 Stream 이었는데요.

문제 해결을 하고 보니 RHEL9 계열 + PHP 환경에서 해당 이슈를 해결한 첫 사례(?)일지도 몰라
도움이 필요하신 분께 팁이 될것 같아 올려드립니다.

원인은 CentOS 9 Stream 을 비롯한 RHEL 9 (레드햇 엔터프라이즈 리눅스) 계열의 O/S들은
구글 영수증 암호화에 사용되는 
SHA1 암호화를 기본적으로 비활성화하기 때문이었는데요.

PHP 는 openssl 모듈을 사용하여 구글 영수증 검증을 시도하려 하지만, O/S 단에서 이걸 못쓰게 하고 있으니 어찌힐 방도가 없는 것이지요.

우선 SHA1 을 활성화 처리를 해야 하는데요.

openssl.cnf 라는 파일을 서버에서 찾아 설정을 변경해 주어야 합니다.
보통은 /etc/pki/tls/openssl.cnf 파일인데요.
만일 이 위치에 없는 경우 php 에서 phpinfo() 함수를 실행하면 Openssl default config 항목에서 파일 경로를 확인할 수 있습니다.

이 파일을 열어 몇가지 섹션의 설정을 추가, 수정해주시면 되는데요.

먼저 [ evp_properties ] 섹션에 아래 설정을 추가해 줍니다.

rh-allow-sha1-signatures = yes

[ provider_sect ] 섹션의 아래 설정의 주석을 제거하여 활성화합니다.

#legacy = legacy_sect

주석 제거 활성화

legacy = legacy_sect

[ legacy_sect ] 섹션의 아래 설정의 주석을 제거하여 활성화해 줍니다.

# activate = 1

주석 제거 활성화

activate = 1

정상 설정되었나 확인하려면 아래 명령을 이용하시면 됩니다.

openssl list -digest-algorithms | grep -i sha1

아래와 같이 암호화 목록이 몇가지 나열되면 제대로 SHA1 활성화가 된 것입니다.

하지만, 여기까지 했음에도 불구하고 PHP 에서 영수증 검증은 여전히 실패하는 이슈가 있었는데요.
리눅스 쉘 명령으로 검증하면 정상 검증이 되니 영수증 데이터의 문제는 아니었습니다.

아마도 PHP의 openssl 라이브러리 문제일 것으로 추정되긴 하는데요.
쉬운 문제 해결을 위해 php에서 직접 영수증을 검증하는 방법이 아니라
PHP 에서 리눅스 Shell 명령어를 이용하는 방법으로 우회하여 성공하였습니다.

관련 소스는 아래와 같습니다.
이 글을 보시는 분이면 어느 정도 개발 지식을 갖고 계신 분일테니 응용하셔서 활용해 보시길 바랍니다.
비단 이 방법은 PHP뿐 아니라 다른 개발 언어도 사용할 수 있는 방법이기도 합니다.

// 데이터
$data = "receipt/d_".$member_ID;
$fp = fopen($data, "wb");
fwrite($fp, $data);
fclose($fp);

// 서명
$signature = "receipt/s_".$member_ID;
$fp = fopen($signature, "wb");
fwrite($fp, base64_decode($signature));
fclose($fp);

// 공개 인증서로 데이터와 서명을 검증하는 쉘 명령어를 실행합니다.
exec("openssl sha1 -verify ../public.pem -signature $signature $data", $output);

// 결과를 받아와 성공했는지 확인합니다.
$result = $output[0];
if($result == "Verified OK") echo "검증 성공";
else echo "검증 실패";

오늘은 쪼금 어려울 수 있는 ( AI가 해결 못하는.. ) , 그닥 재미는 없는 지식 한모금이었습니다.
하지만 분명 필요하신 분이 있을듯 해 간단히 공유드렸습니다.

오늘도 방문해주신 모든 분들께 감사드립니다 !