SSL 연결 구성을 이용한 MySQL의 자세한 설명

黄舟
풀어 주다: 2017-01-18 11:39:34
원래의
1760명이 탐색했습니다.

Mysql 관계형 데이터베이스 관리 시스템

MySQL은 스웨덴 MySQL AB 회사에서 개발한 오픈 소스 소규모 관계형 데이터베이스 관리 시스템입니다. MySQL은 인터넷상의 중소규모 웹사이트에서 널리 사용되고 있습니다. 작은 크기, 빠른 속도, 낮은 총 소유 비용, 특히 오픈 소스의 특성으로 인해 많은 중소 웹 사이트에서는 웹 사이트 총 소유 비용을 줄이기 위해 MySQL을 웹 사이트 데이터베이스로 선택합니다.


이 글에서는 SSL 연결 방식을 지원하도록 MySQL을 구성하는 방법과 이를 Docker에서 구성하는 구체적인 사례를 공유하겠습니다.

SSL 지원 여부 확인

먼저 MySQL에서 다음 명령을 실행하여 MySQL이 SSL을 지원하는지 확인하세요.

mysql> SHOW VARIABLES LIKE 'have_ssl';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_ssl   | YES  |
+---------------+-------+
1 row in set (0.02 sec)
로그인 후 복사

have_ssl이 YES이면 MySQL이 현재 서비스가 이미 SSL을 지원하고 있는 경우 DESABLE인 경우 MySQL 서비스 시작 시 SSL 기능을 활성화해야 합니다.

OpenSSL을 사용하여 SSL 인증서 및 개인 키를 생성하세요

먼저 openssl을 사용하여 서버 측 인증서와 개인 키를 생성해야 합니다. 제가 사용하는 openssl 버전은 다음과 같습니다.

>>> /usr/local/Cellar/openssl/1.0.2j/bin/openssl version
OpenSSL 1.0.2j 26 Sep 2016
로그인 후 복사

생성된 인증서를 저장할 새 ~/temp/cert 디렉토리를 생성하고 개인 키

mkdir ~/temp/cert
cd ~/temp/cert
로그인 후 복사

CA 개인 키 및 CA 인증서 생성

그런 다음 먼저 CA 개인 키를 생성합니다:

openssl genrsa 2048 > pem

CA 개인 키가 있으면 이 개인 키를 사용하여 새 디지털 인증서를 생성할 수 있습니다.

openssl req -sha1 -new -x509 -nodes -days 3650 -key ca-key.pem > ca-cert.pem

이 명령을 실행할 때 몇 가지 질문을 입력해야 합니다. 예를 들면 다음과 같습니다.

>>> openssl req -sha1 -new -x509 -nodes -days 3650 -key ca-key.pem > ca-cert.pem

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:Beijing
Locality Name (eg, city) []:Beijing
Organization Name (eg, company) [Internet Widgits Pty Ltd]:xys
Organizational Unit Name (eg, section) []:xys
Common Name (e.g. server FQDN or YOUR name) []:xys
Email Address []:yongshun1228@gmail.com
로그인 후 복사

위 명령을 실행한 후 CA 개인 키와 CA 인증서를 사용합니다.

서버측 RSA 개인 키와 디지털 인증서를 생성

다음으로, 서버측 개인 키와 인증서 요청 파일을 생성해야 합니다. 명령은 다음과 같습니다.

openssl req -sha1 -newkey rsa:2048 -days 3650 -nodes -keyout server-key.pem > ; server-req.pem

위 명령은 새 개인 키(server-key.pem)를 생성하고 이 새 개인 키를 사용하여 인증서 요청 파일(server-req.pem)을 생성합니다. ).
위 명령에도 몇 가지 질문에 대한 답변이 필요하므로 자연스럽게 입력하세요. 하지만 챌린지 비밀번호는 비어 있어야 합니다.
즉,

>>> openssl req -sha1 -newkey rsa:2048 -days 3650 -nodes -keyout server-key.pem > server-req.pem

Generating a 2048 bit RSA private key
.................+++
..+++
writing new private key to 'server-key.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:Beijing
Locality Name (eg, city) []:Beijing
Organization Name (eg, company) [Internet Widgits Pty Ltd]:xys
Organizational Unit Name (eg, section) []:xys
Common Name (e.g. server FQDN or YOUR name) []:xys
Email Address []:yongshun1228@gmail.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
로그인 후 복사

다음 단계에서는 생성된 개인 키를 RSA 개인 키 파일 형식으로 변환해야 합니다.

openssl rsa -in server-key.pem -out server-key.pem

마지막 단계에서는 원래 생성된 CA 인증서를 사용하여 서버측 디지털 인증서를 생성해야 합니다.

openssl x509 -sha1 -req -in server-req.pem -days 3650 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem

위 명령은 서버측에 디지털 인증서 파일을 생성합니다.

클라이언트의 RSA를 생성합니다. 개인 키 및 디지털 인증서

서버 측에서 실행되는 명령과 유사하게 클라이언트에 대한 개인 키 및 인증서 요청 파일도 생성해야 합니다.

openssl req -sha1 -newkey rsa:2048 -days 3650 -nodes -keyout client-key.pem > client-req.

마찬가지로 생성된 프라이빗을 변환해야 합니다. RSA 개인 키 파일 형식의 키:

openssl rsa -in client-key.pem -out client-key.pem

마지막으로 다음에 대한 디지털 인증서도 생성해야 합니다. 클라이언트:

openssl x509 -sha1 -req -in client-req.pem -days 3650 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > 🎜>

도구를 사용하여 인증서 및 개인 키 생성


이전에 OpenSSL 사용 방법을 소개했습니다. SSL 연결을 위한 개인 키와 인증서 파일을 생성하려면 이제 다음을 살펴보겠습니다.

MySQL 5.7에서는 SSL 연결을 쉽게 생성할 수 있는 mysql_ssl_rsa_setup이라는 도구가 제공됩니다. 필요한 다양한 파일:

mkdir ~/temp/cert
cd ~/temp/cert
mysql_ssl_rsa_setup --datadir ./
로그인 후 복사

위 명령에서 --datadir은

위 명령을 실행하면 8개의 파일도 생성됩니다.

ca-key.pem
ca.pem
client-cert.pem
client-key.pem
private_key.pem
public_key.pem
server-cert.pem
server-key.pem
로그인 후 복사

이 파일들은 OpenSSL을 사용하여 만든 8개의 파일과 기능이 동일하므로 생성되지 않습니다. 여기에 자세히 설명되어 있습니다.

SSL 구성


이전 단계에서 다음과 같은 8개의 파일을 생성했습니다.

ca-cert.pem: CA 서버/클라이언트 디지털 인증서를 생성하는 데 사용되는 인증서.

ca-key.pem : 서버/클라이언트 디지털 인증서를 생성하는 데 사용되는 CA 개인 키.
server-key.pem: 서버 측 RSA 개인 키
server-req.pem: 서버 측 디지털 인증서를 생성하는 데 사용되는 서버 측 인증서 요청 파일.
server-cert.pem: 서버 측 디지털 인증서.
client-key.pem: 클라이언트의 RSA 비공개 key
client-req.pem: 클라이언트를 생성하는 데 사용되는 클라이언트의 인증서 요청 파일 클라이언트의 디지털 인증서.
client-cert.pem: 클라이언트의 디지털 인증서

다음으로 서버와 클라이언트를 각각 구성해야 합니다.

서버측 구성


服务器端需要用到三个文件, 分别是: CA 证书, 服务器端的 RSA 私钥, 服务器端的数字证书, 我们需要在 [mysqld] 配置域下添加如下内容:

[mysqld]
ssl-ca=/etc/mysql/ca-cert.pem
ssl-cert=/etc/mysql/server-cert.pem
ssl-key=/etc/mysql/server-key.pem
로그인 후 복사

接着我们还可以更改 bind-address, 使 MySQL 服务可以接收来自所有 ip 地址的客户端, 即:

bind-address = *

当配置好后, 我们需要重启 MySQL 服务, 使能配置.

最后一步, 我们添加一个需要使用 SSL 才可以登录的帐号, 来验证一下我们所配置的 SSL 是否生效:

GRANT ALL PRIVILEGES ON *.* TO 'ssl_test'@'%' IDENTIFIED BY 'ssl_test' REQUIRE SSL;

FLUSH PRIVILEGES;
로그인 후 복사

当配置好后, 使用 root 登录 MySQL, 执行 show variables like '%ssl%' 语句会有如下输出:

mysql> show variables like '%ssl%';
+---------------+-----------------+
| Variable_name | Value      |
+---------------+-----------------+
| have_openssl | YES       |
| have_ssl   | YES       |
| ssl_ca    | ca.pem     |
| ssl_capath  |         |
| ssl_cert   | server-cert.pem |
| ssl_cipher  |         |
| ssl_crl    |         |
| ssl_crlpath  |         |
| ssl_key    | server-key.pem |
+---------------+-----------------+
9 rows in set (0.01 sec)
로그인 후 복사

客户端配置

客户端配置相对简单一些. 首先我们需要拷贝 ca-cert.pem, client-cert.pem 和 client-key.pem 这三个文件到客户端主机中, 然后我们可以执行如下命令来使用 SSL 连接 MySQL 服务:

mysql --ssl-ca=/path/to/ca-cert.pem --ssl-cert=/path/to/client-cert.pem --ssl-key=/path/to/client-key.pem -h host_name -u ssl_test -p
除了上述的使用命令行方式配置 SSL 外, 我们也可以使用配置文件的方式. 即在 ~/.my.cnf 文件中添加如下内容即可:

[client]
ssl-ca=/path/to/ca-cert.pem
ssl-cert=/path/to/client-cert.pem
ssl-key=/path/to/client-key.pem
로그인 후 복사

当连接成功后, 我们执行如下指令

mysql> \s
--------------
mysql Ver 14.14 Distrib 5.7.17, for Linux (x86_64) using EditLine wrapper

Connection id:    14
Current database:
Current user:    ssl_test@172.17.0.4
SSL:      Cipher in use is DHE-RSA-AES256-SHA
Current pager:    stdout
Using outfile:    ''
Using delimiter:  ;
Server version:    5.7.17 MySQL Community Server (GPL)
Protocol version:  10
Connection:    test_db via TCP/IP
Server characterset:  latin1
Db   characterset:  latin1
Client characterset:  latin1
Conn. characterset:  latin1
TCP port:    3306
Uptime:      1 hour 2 min 9 sec

Threads: 1 Questions: 23 Slow queries: 0 Opens: 126 Flush tables: 3 Open tables: 0 Queries per second avg: 0.006
--------------
로그인 후 복사

如果输出中有 SSL: Cipher in use is DHE-RSA-AES256-SHA 之类的信息, 则表示已经使用 SSL 来连接了.

在 Docker 中使能 MySQL SSL 连接

上面我们简单介绍了一下如果使能 MySQL SSL 连接, 那么现在我们使用 Docker 来具体的实战一把吧!

首先拉取最新的 MySQL 镜像:

docker pull mysql

然后需要准备一下挂载到 Docker 容器的目录结构:

>>> cd ~/temp
>>> tree
.
├── cert
│  ├── ca-key.pem
│  ├── ca.pem
│  ├── client-cert.pem
│  ├── client-key.pem
│  ├── private_key.pem
│  ├── public_key.pem
│  ├── server-cert.pem
│  └── server-key.pem
├── config
│  └── my.cnf
└── db

3 directories, 9 files
로그인 후 복사

在 temp 目录下有三个子目录:

cert 目录用于存放我们先前生成的证书和私钥信息;
config 目录用于存放 MySQL 服务的配置文件
db 目录是用于存放 MySQL 的数据.

下一步我们需要使用如下命令启动 MySQL 容器:

docker run --rm --name test_db -p 10000:3306 -e MYSQL_ROOT_PASSWORD=root -v /Users/xiongyongshun/temp/db:/var/lib/mysql 
-v /Users/xiongyongshun/temp/config:/etc/mysql/conf.d -v /Users/xiongyongshun/temp/cert:/etc/mysql/cert mysql:latest
로그인 후 복사


我们在上面的命令中, 我们分别挂载了 cert, config, db 这三个宿主机上的目录到 MySQL 容器中.


启动了 MySQL 服务后, 可以先使用 root 帐号登录 MySQL, 来检查 MySQL 服务此时是否已经开启了 SSL 功能:

docker run -it --link test_db:test_db --rm mysql sh -c 'exec mysql -u root -p -h test_db'

登录成功后, 我们在 MySQL 中执行如下指令:

mysql> show variables like '%ssl%';
+---------------+---------------------------------+
| Variable_name | Value              |
+---------------+---------------------------------+
| have_openssl | YES               |
| have_ssl   | YES               |
| ssl_ca    | /etc/mysql/cert/ca-cert.pem   |
| ssl_capath  |                 |
| ssl_cert   | /etc/mysql/cert/server-cert.pem |
| ssl_cipher  |                 |
| ssl_crl    |                 |
| ssl_crlpath  |                 |
| ssl_key    | /etc/mysql/cert/server-key.pem |
+---------------+---------------------------------+
9 rows in set (0.01 sec)
로그인 후 복사

有上面的输出后, 表明此时 MySQL 服务已经使用 SSL 功能了.

接着下一步, 我们按照前面所提到的, 创建一个仅仅可以使用 SSL 登录的帐号, 来检验我们的配置是否有效:

GRANT ALL PRIVILEGES ON *.* TO 'ssl_test'@'%' IDENTIFIED BY 'ssl_test' REQUIRE SSL;

FLUSH PRIVILEGES;[code]
로그인 후 복사

上面的命令创建了一个帐号名为 ssl_test, 密码为 ssl_test, 并且不限制登录主机 ip 的帐号.

这些都配置成功后, 我们再启动一个 MySQL 客户端容器:

[code]docker run -it --link test_db:test_db --rm -v /Users/xiongyongshun/temp/cert:/etc/mysql/cert mysql sh -c 'exec mysql 
--ssl-ca=/etc/mysql/cert/ca-cert.pem --ssl-cert=/etc/mysql/cert/client-cert.pem --ssl-key=/etc/mysql/cert/client-key.pem -h test_db -u ssl_test -p'
로그인 후 복사

从上面的这个命令中我们可以看到, 启动 MySQL 客户端容器时, 我们挂载了宿主机的 cert 目录到容器内的 /etc/mysql/cert 目录, 这样在容器中就可以访问到 SSL 私钥和证书文件了. 接着我们在 MySQL 客户端命令行中, 使用 --ssl-ca, --ssl-cert, --ssl-key 这三个参数来指定 SSL 连接所需要的 CA 证书, RSA 私钥和客户端证书.

登录成功后, 我们执行 s 命令:

mysql> \s
--------------
mysql Ver 14.14 Distrib 5.7.17, for Linux (x86_64) using EditLine wrapper

Connection id:    5
Current database:
Current user:    ssl_test@172.17.0.5
SSL:      Cipher in use is DHE-RSA-AES256-SHA
Current pager:    stdout
Using outfile:    ''
Using delimiter:  ;
Server version:    5.7.17 MySQL Community Server (GPL)
Protocol version:  10
Connection:    test_db via TCP/IP
Server characterset:  latin1
Db   characterset:  latin1
Client characterset:  latin1
Conn. characterset:  latin1
TCP port:    3306
Uptime:      6 min 8 sec

Threads: 2 Questions: 10 Slow queries: 0 Opens: 113 Flush tables: 1 Open tables: 106 Queries per second avg: 0.027
--------------
로그인 후 복사

输出中有 SSL: Cipher in use is DHE-RSA-AES256-SHA 信息则说明我们确实是使用了 SSL 连接的 MySQL 服务器.

以上就是MySQL 使用 SSL 连接配置详解的内容,更多相关内容请关注PHP中文网(www.php.cn)!


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿