XE에서 MariaDB(MySQL)에 SSL 연결하기
안녕하세요.
불과 하루 전에 질문/답변 게시판에 알지도 못하는 PHP 코드를 조금 수정해서 제대로 되었는지 확인 부탁드린다는 질문글을 남겼던 사람입니다.
그 내용이 XE에서 MariaDB(MySQL)에 SSL을 사용해 연결하는 방법에 관한 것이었는데요.
그 뒤로 처음의 엉터리 코드를 조금씩 바꿔 보다가 WordPress 소스를 참고로 그나마 낫게 바꾼 것 같습니다.
관련 자료가 전무한지라 나중에 DB 연결 보안에 관심은 있는데 웹 코딩은 잘 모르는 저와 같은 분들께서 참고하실 수 있도록 부족한 자료를 남겨봅니다.
참고로 당연한 사실이지만 XE 설정과는 별도로 MariaDB(MySQL) 쪽에 SSL 적용이 되어있어야 합니다.
수정한 소스는 다음의 ./classes/db/DBMysqli_innodb.class.php 뿐이지만 ./classes/db/DBMysqli.class.php도 적용 방식은 동일하며 mysql, mysql_innodb 연결 방식은 제외했습니다.
강조된 줄들이 추가된 부분이고 DBMysqli_innodb::__connect($connection) 함수 내의 주석 부분은 지워진 원본 코드입니다.
주석에 적힌 대로 5번째 줄을 주석 처리, 해제 함으로써 간단하게 SSL 사용 설정을 변경할 수 있습니다.
/* Copyright (C) NAVER <http://www.navercorp.com> */
// SSL 사용시 주석 해제, 미사용시 주석 처리
define('MYSQL_CLIENT_FLAGS', MYSQL_CLIENT_SSL);
require_once('DBMysql.class.php');
/**
* Class to use MySQLi innoDB DBMS as mysqli_*
* mysql innodb handling class
*
* Does not use prepared statements, since mysql driver does not support them
*
* @author NAVER (developers@xpressengine.com)
* @package /classes/db
* @version 0.1
*/
class DBMysqli_innodb extends DBMysql
{
// 생략
/**
* 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)
{
$client_flags = defined( 'MYSQL_CLIENT_FLAGS' ) ? MYSQL_CLIENT_FLAGS : 0;
if($connection["db_port"])
{
@mysqli_real_connect($result
, $connection["db_hostname"]
, $connection["db_userid"]
, $connection["db_password"]
, $connection["db_database"]
, $connection["db_port"]
, null
, $client_flags);
}
else
{
@mysqli_real_connect($result
, $connection["db_hostname"]
, $connection["db_userid"]
, $connection["db_password"]
, $connection["db_database"]
, null
, null
, $client_flags);
}
}
/*
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;
}
// 생략
}
전에 남긴 질문글에서는
'MySQL 5.7 미만에서는 SSL 접속이 정상적으로 이루어지지 않더라도 오류가 발생하지 않기 때문에, 실제로 SSL 접속이 되고 있는지 확인이 필요합니다.'
라고 말씀해주신 분이 계셨는데 일단 위의 방식대로 가상 머신에 설정한 후 패킷 캡쳐를 해보면 SSL 보안이 적용된 패킷이 캡쳐되네요.
이 자료에 문제가 있다면 언제든지 말씀해주시기 바랍니다.
그런데 문제를 알려주신다 해도 저는 더이상 고칠 만한 실력이 못 되는 것 같네요.
아무튼 이 자료가 조금이나마 XE 사용자 분들께 도움이 되었으면 합니다.
댓글 2