질문을 삭제하지 말아주세요.!
 
1
0
-1

안녕하세요.

영어 못하는 개발자 고재춘 입니다.


최근 KISA 에서 MYSQL connection User 의 password 를  sha1 에서 sha256으로

변경하라는 주문이 들어 왔습니다.



MYSQL 에서 plugin: sha256_password 을 사용하려고 하는데요..

아무리 해봐도 잘 안되서 혹시 MYSQL 에서 SHA256 plugin 을 사용해서

구현한 분이 있으시거나 구현 가능한 분이 있으신지 궁금합니다.



우선

1. MYSQL 인증서를 만들고
https://dev.mysql.com/doc/refman/5.7/en/creating-ssl-files-using-openssl.html


2. 연결을 해봤습니다.
https://dev.mysql.com/doc/refman/5.7/en/using-encrypted-connections.html


3. shell 에서는 잘 동작합니다.
mysql -usha256 -h localhost -p --ssl-ca=/etc/mysql/ssl2/ca.pem  --ssl-cert=/etc/mysql/ssl2/client-cert.pem --ssl-key=/etc/mysql/ssl2/client-key.pem --ssl-mode=VERIFY_CA --ssl-cipher=DHE-RSA-AES128-GCM-SHA256:AES128-SHA



mysql> select Host, User, plugin, authentication_string from mysql.user where user='sha256' \G

*************************** 1. row ***************************

                 Host: localhost

                 User: sha256

               plugin: sha256_password

authentication_string: $5$<f

                            *************************** 2. row ***************************

                 Host: 127.0.0.1

                 User: sha256

               plugin: sha256_password

authentication_string: $5$ {)mgGe|Mp`S^5$WAYMmHwcmntv3vceCqQv1jfjLMWanXro9dIZiellUu3





그런데 이녀석이 PHP로만 넘어가면 뭔가 에러를 토해내고 있습니다.

<?php


$pdo = new PDO('mysql:host=localhost;dbname=masterdb;charset=utf8', 'sha256','sha256password', array(
    PDO::MYSQL_ATTR_SSL_KEY    =>'/etc/mysql/ssl2/client-key.pem',
    PDO::MYSQL_ATTR_SSL_CERT    =>'/etc/mysql/ssl2/client-cert.pem',
    PDO::MYSQL_ATTR_SSL_CA    =>'/etc/mysql/ssl2/ca.pem',
    PDO::MYSQL_ATTR_SSL_CIPHER => 'DHE-RSA-AES256-SHA'
    )
);




var_dump($pdo);


를 실행하면



PHP Fatal error:  Uncaught PDOException: PDO::__construct(): this stream does not support SSL/crypto in /home/ubuntu/1.php:60
Stack trace:


에러를 토하고



HOST를 127.0.0.1 로 지정하면


<?php

$pdo = new PDO('mysql:host=127.0.0.1;dbname=masterdb;charset=utf8', 'sha256','sha256password', array(
    PDO::MYSQL_ATTR_SSL_KEY    =>'/etc/mysql/ssl2/client-key.pem',
    PDO::MYSQL_ATTR_SSL_CERT    =>'/etc/mysql/ssl2/client-cert.pem',
    PDO::MYSQL_ATTR_SSL_CA    =>'/etc/mysql/ssl2/ca.pem',
    PDO::MYSQL_ATTR_SSL_CIPHER => 'DHE-RSA-AES256-SHA',
    PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => true
    )
);



다음과 같은 오류를 토합니다.

PHP Fatal error:  Uncaught PDOException: PDO::__construct(): Peer certificate CN=`MySQL_Server_5.7.21_Auto_Generated_Server_Certificate' did not match expected CN=`127.0.0.1'


이틀째 끙끙 대고 있는데

인증서 종류랑 인증방식등도 익숙하지 않고

뭐가 뭔지 모른채 인터넷에서 시키는 대로만 하자니

문제가 해결되지 않아서 어지간히 난감해 하고 있습니다. ㅠㅠ



조건 :


lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.4 LTS


mysql> select version();
+-------------------------+
| version()               |
+-------------------------+
| 5.7.21-0ubuntu0.16.04.1 |
+-------------------------+
1 row in set (0.01 sec)


php -v
PHP 7.2.3-1+ubuntu16.04.1+deb.sury.org+1


[PHP Modules]
calendar
Core
ctype
curl
date
dom
exif
fileinfo
filter
ftp
gd
gettext
hash
iconv
json
libxml
mbstring
mysqli
mysqlnd
openssl
pcntl
pcre
PDO
pdo_mysql
Phar
posix
readline
Reflection
session
shmop
SimpleXML
sockets
sodium
SPL
standard
sysvmsg
sysvsem
sysvshm
tokenizer
wddx
xml
xmlreader
xmlwriter
xsl
Zend OPcache
zip
zlib

[Zend Modules]
Zend OPcache


    CommentAdd your comment...

    1 answer

    1.  
      1
      0
      -1

      직접 구현한 적은 없지만, 구글링해보니 프로토콜 타입 문제인 것 같습니다. 

      ssl 을 소켓으로 스트림하면 저런 예외가 발생하고, 다큐멘테이션에서 mysql —protocol=TCP 처럼 설정하라고 하네요. 

      http://blog.machek.co.uk/2016/06/php-with-mysql-and-ssl.html

      https://dev.mysql.com/doc/refman/5.5/en/connecting.html

        CommentAdd your comment...