php 5.6 이상 버전에서 인증서를 확인하는 옵션인 verify_peer 의 값이 flase => true로 변경이 되었다.
때문에 이와 관련하여 (대부분 PG연동) php 5.6 버전과 php 7.0 버전은 PG결재 진행이 안될 수 있다.
http://php.net/manual/kr/migration56.openssl.php
- 서버의 php 버전이 5.6 이상이고 외부로 HTTPS 통신을 할때 발생한다.
에러메세지는 대략 다음과 같다.
Warning: fsockopen(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in
일반적으로 신뢰할수 있는 CA 값을 서버에 /etc/pki/tls/cert.pem 에 저장하고 있다.(아래 명령어로 확인)
1 |
~]# php -r 'print_r(openssl_get_cert_locations());'|awk '/\[default_cert_file\]/{print $3}' |
단지 특정 외부에서 사용하는 인증서의 ROOT CA 가 서버내 ca-certificates 파일내에 없는것이다 ‘ㅅ’a
해결을 위해서는 서버에 ca-certificates 을 업데이트 하면 되겠다.
1 |
~]# yum update ca-certificates |
해결이 안된다면 아래와 같이 인증서 확인을 끄는 방법으로 php 소스코드를 수정해야 한다.
원본: 작동불가 코드
1 2 3 4 5 6 7 8 9 |
$this->ssl = "ssl://"; $this->port = 443; $this->host = "https://PG사이트주소.com"; if (!$this->sock = fsockopen($this->ssl.$this->host, $this->port, $errno, $errstr, 10)) { return '<font color=red>Fail</font>'; } else { return '<font color=blue>OK</font>'; } |
위와 같은 fsockopen 을 아래와 같이 stream_socket_client 으로 대체 하면서
verify_peer 와 verify_host 를 false 로 옵션을 변경하는것으로 해결이 가능하다.
수정본: 작동가능 코드
1 2 3 4 5 6 7 8 9 10 11 12 |
$this->ssl = "ssl://"; $this->port = 443; $this->host = "https://PG사이트주소.com"; $context = stream_context_create(); $result = stream_context_set_option($context, 'ssl', 'verify_peer', false); $result = stream_context_set_option($context, 'ssl', 'verify_host', false); if (!$this->sock = stream_socket_client($this->ssl.$this->host.':'.$this->port, $errno, $errstr, 10, STREAM_CLIENT_CONNECT, $context)) { return '<font color=red>Fail</font>'; } else { return '<font color=blue>OK</font>'; } |
php 소수 수정을 이용한 해결 방법은 아래 글을 참조하였습니다 🙂
https://blog.e2info.co.jp/2015/12/29/php5-6でカード決済できない