Q&A

MariaDB(MySQL) SSL 연결

2016.01.19 16:31
591
0

안녕하세요. 웹 쪽으로는 거의 문외한인 한 XE 기반 웹 서버 운영자입니다.

 

웹이라고는 기본 HTML 문법 밖에 모르는지라 지금껏 XE 코드를 직접 건드린 적은 거의 없습니다.

 

그러던 중 이번에 서버 이전 작업을 하면서 MariaDB에 SSL 연결을 구현하게 되었는데 XE는 기본적으로 DB 연결에 대한 SSL 설정을 지원하지 않는 것 같더라고요.

 

이곳저곳을 뒤져봐도 HTTPS 연결에 관한 자료만 있을 뿐 DB SSL 연결에 대한 자료는 없어서 직감과 인터넷에 의존해 PHP 파일을 처음 만져봤습니다.

 

일단 가상머신에서 테스트해보니 연결에는 별 문제가 없어보이는데 이게 정말 제대로 된 건지 아닌 건지 확인을 못 하겠습니다.

 

애초에 XE에 이 기능이 없는 것에는 무언가 이유가 있지 않나 싶은 생각도 드네요.

 

 

 

DB는 MariaDB InnoDB이고 연결 방식은 mysqli_innodb입니다.

 

그리고 수정한 소스는 다음과 같으며 14~35번 줄이 추가한 부분, 주석 처리된 부분이 원본 코드입니다.

 

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)
        {
                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

  • 원래 SSL 기능이 없는 이유는 99.9%의 사이트들은 같은 서버 내에서 localhost로 DB에 접속하기 때문입니다. localhost는 서버 관리자를 제외한 제3자의 감청이 불가능하기 때문에 SSL을 사용하는 의미가 없습니다.

    수정하신 내용은 괜찮아 보이지만 MySQL 5.7 미만에서는 SSL 접속이 정상적으로 이루어지지 않더라도 오류가 발생하지 않기 때문에, 실제로 SSL 접속이 되고 있는지 확인이 필요합니다. 만약 SSL 연결이 되고 있지 않다면 mysqli_real_connect 함수의 $flag 파라미터에 MYSQLI_CLIENT_SSL을 추가해 보세요.

    참고: https://secure.php.net/manual/en/mysqli.real-connect.php
  • @기진곰
    다행히 현재까지 테스트 상에서 문제는 없는 것 같습니다. 부족한 코드 확인해주셔서 감사합니다.