안녕하세요. 웹 쪽으로는 거의 문외한인 한 XE 기반 웹 서버 운영자입니다.
웹이라고는 기본 HTML 문법 밖에 모르는지라 지금껏 XE 코드를 직접 건드린 적은 거의 없습니다.
그러던 중 이번에 서버 이전 작업을 하면서 MariaDB에 SSL 연결을 구현하게 되었는데 XE는 기본적으로 DB 연결에 대한 SSL 설정을 지원하지 않는 것 같더라고요.
이곳저곳을 뒤져봐도 HTTPS 연결에 관한 자료만 있을 뿐 DB SSL 연결에 대한 자료는 없어서 직감과 인터넷에 의존해 PHP 파일을 처음 만져봤습니다.
일단 가상머신에서 테스트해보니 연결에는 별 문제가 없어보이는데 이게 정말 제대로 된 건지 아닌 건지 확인을 못 하겠습니다.
애초에 XE에 이 기능이 없는 것에는 무언가 이유가 있지 않나 싶은 생각도 드네요.
DB는 MariaDB InnoDB이고 연결 방식은 mysqli_innodb입니다.
그리고 수정한 소스는 다음과 같으며 14~35번 줄이 추가한 부분, 주석 처리된 부분이 원본 코드입니다.
{
// 생략
/**
* DB Connect
* this method is private
* @param array $connection connection's value is db_hostname, db_port, db_database, db_userid, db_password
* @return resource
*/
function __connect($connection)
{
// Attempt to connect
$result = mysqli_init();
if ($result)
{
mysqli_ssl_set($result, "/path/client-key.pem", "/path/client-cert.pem", "/path/ca.pem", NULL, NULL);
if($connection["db_port"])
{
mysqli_real_connect($result
, $connection["db_hostname"]
, $connection["db_userid"]
, $connection["db_password"]
, $connection["db_database"]
, $connection["db_port"]);
}
else
{
mysqli_real_connect($result
, $connection["db_hostname"]
, $connection["db_userid"]
, $connection["db_password"]
, $connection["db_database"]);
}
}
/*
if($connection["db_port"])
{
$result = @mysqli_connect($connection["db_hostname"]
, $connection["db_userid"]
, $connection["db_password"]
, $connection["db_database"]
, $connection["db_port"]);
}
else
{
$result = @mysqli_connect($connection["db_hostname"]
, $connection["db_userid"]
, $connection["db_password"]
, $connection["db_database"]);
}
*/
$error = mysqli_connect_errno();
if($error)
{
$this->setError($error, mysqli_connect_error());
return;
}
mysqli_set_charset($result, 'utf8');
return $result;
}
// 생략
}
보시다시피 인증서 경로를 하드 코딩 해버려서 코드의 일반성이 뚝 떨어졌습니다. 실력있는 개발자 분들이시라면 설치시 선택적으로 입력받도록 하셨을 텐데 말입니다.
웹 전문가 분들이 보시기엔 한참 모자라 보이는 코드일 것 같아 부끄럽네요.
아무튼 이 코드를 그대로 사용해도 될까요?
P.S. 여담이지만 제가 수정한 ./classes/db/DBMysqli_innodb.class.php 소스 끝 부분에
/* End of file DBMysqli.class.php */
/* Location: ./classes/db/DBMysqli.class.php */
라고 파일명이 잘못 기입되어 있네요.
댓글 2
수정하신 내용은 괜찮아 보이지만 MySQL 5.7 미만에서는 SSL 접속이 정상적으로 이루어지지 않더라도 오류가 발생하지 않기 때문에, 실제로 SSL 접속이 되고 있는지 확인이 필요합니다. 만약 SSL 연결이 되고 있지 않다면 mysqli_real_connect 함수의 $flag 파라미터에 MYSQLI_CLIENT_SSL을 추가해 보세요.
참고: https://secure.php.net/manual/en/mysqli.real-connect.php