2016-10-24 3 views
2

프로젝트를 PHP 5.6에서 PHP 7로 옮길 때 이상한 문제가있다. mysqli_init();을 호출 한 후 호출하기 전에 데이터베이스에 SSL 연결을 설정할 수있는 데이터베이스 클래스가있다. mysqli_real_connect().PHP 7 업그레이드 후 MySQLi SSL 연결이 작동을 멈춘다

PHP 5.6에서이 스크립트를 개발했으며 원격 서버에 대한 SSL 연결을 성공적으로 만들었습니다. 원격 데이터베이스 서버는 자체 서명 인증서를 사용하지 않습니다.

 if($verify) { $this->mysqli->options(MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, true); } 
     $this->mysqli->ssl_set($key, $cert, $ca, $capath, $ciphers); 

방법은 true의 기본 설정에 $verify을 설정하고 그대로 인증서 번들 변수 $ca 통과 왼쪽 : 내 DB 클래스의 setSSL 방법에서

나는이 있습니다.

이것은 PHP 5.6에서 훌륭하게 작동하며 정확히 무엇이되어야하며 실제로 SSL 연결을 사용하고 있는지 확인합니다.

동일한 서버에서 하위 도메인을 생성하고 PHP 7을 사용하도록 설정했습니다. 성능은 훨씬 좋았고 코드는 PHP 7입니다.

원격 SSL mysqli 연결을 제외하고 새로운 하위 도메인에서 내 코드의 전체 복사본을 만들었습니다. 모든 것이 잘 작동합니다.

필자는 PHP 7 및 기타 많은 기능에서 제거 된 기능을 확인했지만 왜 이런 일이 발생하는지 알 수 없습니다. 로그에서

추출물 : 다른 주에

[Msg: mysqli::real_connect(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed]

[Msg: mysqli::real_connect(): Cannot connect to MySQL by using SSL]

[Msg: mysqli::real_connect(): [2002] (trying to connect via tcp://******.co.uk:3306)]

이 내가 CA 인증서 번들을 통해 통과하지 못한 경우 내가 먼저 PHP 5.6에서이 기능을 개발 할 때 생성되는 동일한 오류입니다.

+0

오류 로그의 새로운 기능 :

어떻게 연결할 및 적절한 인증서 체인을 구축하려면 여기를 읽어? – neuhaus

+0

답장을 보내 주셔서 감사합니다. @neuhaus 로그에서 추출한 내용으로 질문을 업데이트했습니다. 위에서 언급했듯이, 이것은 5.6에서 정상적으로 작동하지만 PHP 7에서는 중단됩니다.ca 파일의 올바른 위치가 ssl_set 메소드에 전달되고 있음을 확인했습니다. – Seth

답변

1

99 %는 체인 인증서 (일반적)와 MySQL을 현재 does not support chained certificates (성가신 사실)로 사용하고 있기 때문입니다.

보통 중간 인증서를 클라이언트 인증서 풀에로드하면 보안이 저하되고 많은 웹 서버 소유자가 수행하는 매우 일반적인 실수가 발생합니다. 그러나 MySQL과 관련하여 다른 해결책이 없으므로 을 수행하는 것이 좋습니다.

해결 방법으로, CA 모든 중간 인증서를 PHP 인증서 풀에로드하십시오. 이는 나쁜 습관입니다.

업데이트 :

나는 버그가 오래 전에 해결되었다하지만 MySQL의 팀은, 자신의 티켓을 업데이트하지 않았습니다 ... 당신의 MySQL을 (보통은 OpenSSL)가 이미 작동합니다에 구운 된 SSL 라이브러리 따라 생각 . How to chain a SSL certificate

+0

답장을 보내 주신 @DanFromGermany에게 감사드립니다. 귀하의 의견을 이해했으며 귀하가 제안한 것을 시도 할 것이지만 여전히 이러한 일이 발생하고 있는지 확실하지 않습니다. 앱에있는 ca 번들과 전체 파일 위치가 ssl_set 옵션에 전달됩니다. 문제는, 나는 변화가없는 원격 DB 서버에 연결하고 있는데, 연결은 PHP 5.6을 실행하는 내 dev 서버에서 제대로 작동하지만 PHP 7이 동일한 원격 서버에 연결하는 것을 멈 춥니 다. ca 번들은 Mozilla의 저장소에 있으며 자동으로 cron 작업으로 업데이트됩니다. – Seth

+0

나는 당신의 제안을 시도했지만 아무런 영향을 미치지 않고 여전히 똑같은 오류가 발생했습니다. – Seth

+0

체인/번들은 서버에서 보내야합니다. 클라이언트에 영구적으로 저장하면 안됩니다. 이전 클라이언트에서는 작동하지만 새 서버에서는 작동하지 않는 경우 서버가 잘못된 중간 인증서를 보내는 것과 똑같은 것으로 들립니다. ** ** openssl verify '** 명령을 사용하여 인증서 체인을 확인해 주시겠습니까? ** – DanFromGermany

관련 문제