zoukankan      html  css  js  c++  java
  • 如何为MySQL服务器和客户机启用SSL

    本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn

    摘要:

    • mysql5.7后有ssl新特性
    • 自己搭建mysql enterprise monitor后发现这个功能所以折腾了下

    用户想要与MySQL服务器建立一条安全连接时,常常依赖VPN隧道或SSH隧道。不过,获得MySQL连接的另一个办法是,启用MySQL服务器上的SSL封装器(SSL wrapper)。这每一种方法各有其优缺点。比如说,在出现多条短时间MySQL连接的高度动态环境下,VPN或SSH隧道也许是比SSL更好的选择,因为后者建立每条连接时需要成本高昂的SSL握手计算。另一方面,如果是长时间运行的MySQL连接比较少的那些应用,基于SSL的加密可能很合理。由于MySQL服务器已经内置了SSL支持功能,你不需要实施VPN或SSH隧道之类单独的安全层,这种隧道有其自己的维护开销。
    在MySQL服务器中实施SSL可以加密在服务器与客户机之间来回传输的所有数据,因而防止广域网或数据中心里面可能出现的窃听或数据嗅探行为。此外,SSL还通过SSL证书提供了身份验证机制,因而可以保护用户,远离可能出现的网络钓鱼攻击。
    我们在本文中将介绍如何启用MySQL服务器上的SSL。请注意:同样过程适用于MariaDB服务器。

    创建证书和秘钥

    注意:创建server端和client的证书和秘钥都是在你的那个mysql 主服务器上创建的,到时把client拷贝走就行

    创建server的ssl证书和秘钥

    • 检查服务器是否安装openssl
    [root@github data]# openssl version
    OpenSSL 1.0.1e-fips 11 Feb 2013
     
    • 创建一个临时目录
    mkdir /data
    cd /data
     
    • 创建CA私钥和证书,将创建ca-key.pem和ca-cert.pem
    [root@github data]# openssl genrsa 2048 > ca-key.pem
    # 下面命令会让你输入国家 省份等一些信息,随便输入记住就行
    [root@github data]# openssl req -sha1 -new -x509 -nodes -days 3650 -key ca-key.pem > ca-cert.pem
    • 为服务器创建私钥
    # 这个命令会再次询问几个问题,你可以填写上一步中提供的相同答案。
    [root@github data]# openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout server-key.pem > server-req.pem
     
    • 将服务器的私钥导出成RSA类型的密钥
    [root@github data]# openssl rsa -in server-key.pem -out server-key.pem
     
    • 最后,使用CA证书,创建服务器证书。
    [root@github data]# openssl x509 -sha1 -req -in server-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem
    • 完成上述步骤后在data目录下就会有
    -rw-r--r--. 1 root  root  1269 Jul  7 02:43 ca-cert.pem
    -rw-r--r--. 1 root  root  1675 Jul  7 02:42 ca-key.pem
    -rw-r--r--. 1 root  root  1143 Jul  7 02:45 server-cert.pem
    -rw-r--r--. 1 root  root  1679 Jul  7 02:44 server-key.pem
    -rw-r--r--. 1 root  root  1037 Jul  7 02:44 server-req.pem
     

    生成客户端ssl秘钥

    当我们需要用客户端ssl访问本服务端时,首先我们要在本服务器上生成证书,然后拷贝到你需要用来访问的客户端

    • MySQL服务器主机上运行下列命令
    # 类似服务器端配置,也会有一些国家省份等信息填写,与服务端一致就行
    [root@github data]# openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout client-key.pem > client-req.pem
     
    • 我们还需要将创建的客户机私钥转换成RSA类型
    [root@github data]# openssl rsa -in client-key.pem -out client-key.pem
     
    • 最后使用服务器的CA私钥和证书,创建客户机证书
    [root@github data]# openssl x509 -sha1 -req -in client-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem
     
    • 完成上述步骤后在data目录下就会有加上服务端
    -rw-r--r--. 1 root  root  1269 Jul  7 02:43 ca-cert.pem
    -rw-r--r--. 1 root  root  1675 Jul  7 02:42 ca-key.pem
    -rw-r--r--. 1 root  root  1143 Jul  7 02:55 client-cert.pem
    -rw-r--r--. 1 root  root  1675 Jul  7 02:54 client-key.pem
    -rw-r--r--. 1 root  root  1037 Jul  7 02:54 client-req.pem
    -rw-r--r--. 1 root  root  1143 Jul  7 02:45 server-cert.pem
    -rw-r--r--. 1 root  root  1679 Jul  7 02:44 server-key.pem
    -rw-r--r--. 1 root  root  1037 Jul  7 02:44 server-req.pem

    配置服务端

    • 刚开始没有配置时,mysql默认ssl没有开启如下
    mysql> show variables like '%ssl%';
    +---------------+----------+
    | Variable_name | Value    |
    +---------------+----------+
    | have_openssl  | DISABLED |
    | have_ssl      | DISABLED |
    | ssl_ca        |          |
    | ssl_capath    |          |
    | ssl_cert      |          |
    | ssl_cipher    |          |
    | ssl_crl       |          |
    | ssl_crlpath   |          |
    | ssl_key       |          |
    +---------------+----------+
     
    • 配置mysql server的my.cnf
    vi /etc/my.cnf
    # 假如如下信息
    bind-address=*
    
    ssl-ca      =/data/ca-cert.pem
    ssl-cert    =/data/server-cert.pem
    ssl-key     =/data/server-key.pem
    
    [client]
    ssl-ca      =/data/ca-cert.pem
    ssl-cert    =/data/client-cert.pem
    ssl-key     =/data/client-key.pem
     
    • 创建有权通过SSL访问MySQL服务器的用户
    mysql> GRANT ALL PRIVILEGES ON *.* TO 'ssluser'@'%' IDENTIFIED BY 'abcdef' REQUIRE SSL;
    mysql> FLUSH PRIVILEGES;
     
    • 重启mysql
    service mysql restart
     
    • 这时查看ssl是否开启
    mysql> show variables like '%ssl%';
    +---------------+-----------------------+
    | Variable_name | Value                 |
    +---------------+-----------------------+
    | have_openssl  | YES                   |
    | have_ssl      | YES                   |
    | ssl_ca        | /data/ca-cert.pem     |
    | ssl_capath    |                       |
    | ssl_cert      | /data/server-cert.pem |
    | ssl_cipher    |                       |
    | ssl_crl       |                       |
    | ssl_crlpath   |                       |
    | ssl_key       | /data/server-key.pem  |
    +---------------+-----------------------+
     

    至此,就成功了,

    如果其他服务器客户端要ssl连接该服务端,将ca-cert.pem、client-cert.pem和client-key.pem文件拷贝到你的客户端的目录下,比如、/data下面
    然后如下访问

    mysql --ssl-ca=/data/ca-cert.pem --ssl-cert=/data/client-cert.pem --ssl-key=/data/client-key.pem -h 192.168.10.145 -u ssluser -p

     

    原文连接 参考

  • 相关阅读:
    CMY/CMYK 打印机色彩
    safe RGB colors
    人眼内的三类视锥细胞
    函数极限的定义
    Region的周长, 面积与紧凑程度
    Boundary Representations
    Boundary Following Algorithm
    Region Representaion and Description
    JavaSE编码试题强化练习5
    JavaSE编码试题强化练习4
  • 原文地址:https://www.cnblogs.com/galengao/p/5780686.html
Copyright © 2011-2022 走看看