一礁叔、用MySQL鏡像安裝MySQL
#? docker? pull??mysql:8.0
# mkdir? ?-p? /opt/mysqldata? ?/opt/mysqlconfig? ?/opt/sql
#? vim /opt/mysqlconfig/mysqld.cnf
#######################################################
[mysqld]
pid-file? ? ? ? ? ? ? ? ? ? ? ? = /var/run/mysqld/mysqld.pid
socket? ? ? ? ? ? ? ? ? ? ? ? ? = /var/run/mysqld/mysqld.sock
datadir? ? ? ? ? ? ? ? ? ? ? ? = /var/lib/mysql
symbolic-links? ? ? ? ? ? ? ? ? = 0
max_connections? ? ? ? ? ? ?= 2000
user? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? = mysql
skip_name_resolve
skip-host-cache
skip-log-bin
character-set-client-handshake? = FALSE
lower_case_table_names? ? ? ? ? = 1
character-set-server? ? ? ? ? ? = utf8
collation-server? ? ? ? ? ? ? ? = utf8_general_ci
init_connect? ? ? ? ? ? ? ? ? ? = "SET NAMES 'utf8'"
default_authentication_plugin? = mysql_native_password
general_log? ? ? = on
general_log_file? = /var/lib/mysql/general.log
log_timestamps? ? = SYSTEM
[mysql]
default-character-set? ? ? ? ? = utf8
[client]
default-character-set? ? ? ? ? = utf8
#######################################################
二祟绊、初始化MySQL
# vim mysql8.x_init.sh
###################################################
#!/bin/bash
mysql_ver="8.0"
mysql_datadir="/opt/mysqldata"
mysql_root_pwd="MySQL@123"
registry_addr=""
docker run -itd? \
? --name mysql \
? -p 3306:3306 \
? -e UMASK=0600 \
? -e UMASK_DIR=0700 \
? -e MYSQL_HISTFILE=/dev/null \
? -v ${mysql_datadir}:/var/lib/mysql \
? -v /opt/mysqlconfig/mysqld.cnf:/etc/mysql/conf.d//mysqld.cnf \
? -e MYSQL_ROOT_PASSWORD="${mysql_root_pwd}" \
? mysql:${mysql_ver}
sleep 30
if ss -tan | grep -w "3306" > /dev/null 2>&1; then
? docker stop mysql
? docker rm? mysql
? echo "Mysql init successfully!"
else
? echo "Mysql init failed!"
fi
###################################################
# sh??mysql8.x_init.sh
將MySQL服務(wù)注冊(cè)成系統(tǒng)服務(wù)
# cat /etc/systemd/system/mysqld.service
####################################################
[Unit]
Description=MySQL Server
After=network-online.target docker.service
Requires=docker.service
[Service]
Type=simple
ExecStartPre=-/usr/bin/docker rm -f mysql
ExecStart=/usr/bin/docker run \
? --name mysql \
? -p 3306:3306 \
? -e UMASK=0600 \
? -e UMASK_DIR=0700 \
? -e MYSQL_HISTFILE=/dev/null \
? -v /opt/mysqldata:/var/lib/mysql \
? -v /opt/mysqlconfig/mysqld.cnf:/etc/mysql/conf.d//mysqld.cnf \
? -v /opt/sql:/opt/sql \
? -v /etc/localtime:/etc/localtime \
? --security-opt seccomp=unconfined \
? mysql:8.0
ExecStop=/usr/bin/docker stop mysql
LimitNOFILE=65535
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
####################################################
# systemctl daemon-reload
# systemctl start mysqld
# systemctl enable mysqld
# systemctl status mysqld
二、MySQL 不開(kāi)啟SSL
# cat /opt/mysqlconfig/mysqld.cnf
#######################################################
[mysqld]
pid-file? ? ? ? ? ? ? ? ? ? ? ? = /var/run/mysqld/mysqld.pid
socket? ? ? ? ? ? ? ? ? ? ? ? ? = /var/run/mysqld/mysqld.sock
datadir? ? ? ? ? ? ? ? ? ? ? ? = /var/lib/mysql
symbolic-links? ? ? ? ? ? ? ? ? ? ? = 0
max_connections? ? ? ? ? ? ? ? = 2000
user? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?= mysql
skip_name_resolve
skip-host-cache
skip-log-bin
character-set-client-handshake? = FALSE
lower_case_table_names? ? ? ? ? = 1
character-set-server? ? ? ? ? ? = utf8
collation-server? ? ? ? ? ? ? ? = utf8_general_ci
init_connect? ? ? ? ? ? ? ? ? ? = "SET NAMES 'utf8'"
default_authentication_plugin? = mysql_native_password
general_log? ? ? = on
general_log_file? = /var/lib/mysql/general.log
log_timestamps? ? = SYSTEM
[mysql]
default-character-set? ? ? ? ? = utf8
[client]
default-character-set? ? ? ? ? = utf8
########################################################
后臺(tái)通過(guò)socket登錄
# docker exec -it mysql mysql -u root -p"MySQL@123"
可以看出戳气,后臺(tái)通過(guò)socket登錄怨愤,是沒(méi)有走加密通道的杏瞻。
后臺(tái)通過(guò)127.0.0.1登錄
# docker exec -it mysql mysql? ?-h 127.0.0.1? ?-u root -p"MySQL@123"
可以看出符欠,后臺(tái)通過(guò)127.0.0.1登錄嫡霞,是加密的。
客戶端遠(yuǎn)程登錄 192.18.1.104? -----> 192.168.1.100:3306
# tail -f /opt/mysqldata/general.log
可以看出背亥,在不開(kāi)啟MySQL SSL 的情況下秒际,客戶端連接服務(wù)端悬赏,是走TCP/IP狡汉,沒(méi)有加密通道。
MySQL不開(kāi)啟SSL 的jdbc
MySQL驅(qū)動(dòng)
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://xx.xx.xx.xx:3306/test?allowMultiQueries=true&useUnicode&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
username=root
password=MySQL@123
MariaDB驅(qū)動(dòng)
driverClassName=org.mariadb.jdbc.Driver
url=jdbc:mariadb://xx.xx.xx.xx:3306/test?allowMultiQueries=true&useUnicode&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
username=root
password=MySQL@123
三闽颇、MySQL 開(kāi)啟SSL
# vim /opt/mysqlconfig/mysqld.cnf
#############################################################
[mysqld]
pid-file? ? ? ? ? ? ? ? ? ? ? ? ? = /var/run/mysqld/mysqld.pid
socket? ? ? ? ? ? ? ? ? ? ? ? ? ?= /var/run/mysqld/mysqld.sock
datadir? ? ? ? ? ? ? ? ? ? ? ? ? ?= /var/lib/mysql
symbolic-links? ? ? ? ? ? ? ? ? = 0
max_connections? ? ? ? ? ? ?= 2000
user? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? = mysql
skip_name_resolve
skip-host-cache
skip-log-bin
character-set-client-handshake? = FALSE
lower_case_table_names? ? ? ? ? ? = 1
character-set-server? ? ? ? ? ? = utf8
collation-server? ? ? ? ? ? ? ? ? ? = utf8_general_ci
init_connect? ? ? ? ? ? ? ? ? ? ? ? ?= "SET NAMES 'utf8'"
default_authentication_plugin? = mysql_native_password
general_log? ? ? = on
general_log_file? = /var/lib/mysql/general.log
log_timestamps? ? = SYSTEM
require_secure_transport = ON
ssl-ca? ? ? ? ? ? ? ? ? = /var/lib/mysql/ca.pem
ssl-cert? ? ? ? ? ? ? ? = /var/lib/mysql/server-cert.pem
ssl-key? ? ? ? ? ? ? ? ? = /var/lib/mysql/server-key.pem
[mysql]
default-character-set? ? ? ? ? = utf8
[client]
default-character-set? ? ? ? ? = utf8
#############################################################
# systemctl? restart mysqld??
# ll /opt/mysqldata/*.pem
后臺(tái)通過(guò)socket登錄
# docker exec -it mysql mysql -u root -p"MySQL@123"
可以看出盾戴,后臺(tái)通過(guò)socket登錄,是沒(méi)有走加密通道的兵多。
后臺(tái)通過(guò)127.0.0.1登錄
# docker exec -it mysql mysql??-h 127.0.0.1??-u root -p"MySQL@123"
可以看出尖啡,后臺(tái)通過(guò)127.0.0.1登錄,是加密通的剩膘,但是沒(méi)有啟動(dòng)SSL衅斩。
客戶端遠(yuǎn)程登錄 192.18.1.104? -----> 192.168.1.100:3306
# tail -f /opt/mysqldata/general.log
可以看出,在開(kāi)啟MySQL SSL 的情況下怠褐,客戶端連接服務(wù)端畏梆,走加密通道。
四奈懒、MySQL 開(kāi)啟SSL奠涌,客戶端jdbc的幾種設(shè)置
關(guān)于開(kāi)啟 MySQL SSL,客戶端dbc的設(shè)置分以下幾種情況:
1. 服務(wù)端開(kāi)啟SSL磷杏,配置證書(shū)溜畅,客戶端連服務(wù)端,直接信任證書(shū)极祸,不用配置證書(shū)
2. 服務(wù)端開(kāi)啟SSL慈格,配置證書(shū),客戶端連服務(wù)端遥金,配置單向驗(yàn)證客戶端或者服務(wù)端證書(shū)
3. 服務(wù)端開(kāi)啟SSL浴捆,配置證書(shū),客戶端連服務(wù)端汰规,配置雙向驗(yàn)證服務(wù)端證書(shū)和客戶端證書(shū)
MySQL Server端是 x509 的pem格式證書(shū)汤功,怎么跟客戶端的 java程序(要連MySQL,jks格式證書(shū))建立證書(shū)認(rèn)證關(guān)系溜哮?
x509 的 pem格式證書(shū)滔金,可以通過(guò)轉(zhuǎn)換色解,變成 jks格式證書(shū)。
1. 服務(wù)端開(kāi)啟SSL餐茵,配置證書(shū)科阎,客戶端連服務(wù)端,直接信任證書(shū)忿族,不用配置證書(shū)
MySQL驅(qū)動(dòng)
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://xx.xx.xx.xx:3306/test?allowMultiQueries=true&useUnicode&characterEncoding=UTF-8&autoReconnect=true&useSSL=true&verifyServerCertificate=false&requireSSL=true
username=root
password=MySQL@123
MariaDB驅(qū)動(dòng)
driverClassName=org.mariadb.jdbc.Driver
url=jdbc:mariadb://xx.xx.xx.xx:3306/test?allowMultiQueries=true&useUnicode&characterEncoding=UTF-8&autoReconnect=true&useSSL=true&trustServerCertificate=true&requireSSL=true
username=root
password=MySQL@123
關(guān)于證書(shū)信任設(shè)置
MySQL:? ? verifyServerCertificate=false
MariaDB:? trustServerCertificate=true
當(dāng)啟用SSL加密并設(shè)置連接字符串屬性trustServerCertificate=false 時(shí)需要做些什么锣笨,與設(shè)置trustServerCertificate=true 有什么區(qū)別?
如果當(dāng)使用安全套接字層 (SSL) 對(duì)通信層加密時(shí)應(yīng)自動(dòng)信任服務(wù)器安全套接字層證書(shū)道批,則為“true” 错英, 否則為 false。
此處隆豹,我們服務(wù)端椭岩,不設(shè)置證書(shū)驗(yàn)證,為自動(dòng)信任服務(wù)器安全套接字層證書(shū)璃赡。
2. 服務(wù)端開(kāi)啟SSL判哥,配置證書(shū),客戶端連服務(wù)端碉考,配置單向驗(yàn)證客戶端或者服務(wù)端證書(shū)
在 MySQL Server服務(wù)器上
#? mkdir? /root/mysqlSSL
# cp /opt/mysqldata/*.pem? ? ?/root/mysqlSSL/
#? keytool -importcert -alias MySQLCACert? -file ca.pem??-keystore truststore.jks? ?-storepass Truststore@123? ?-noprompt
# keytool -v -list -keystore truststore.jks? -storepass? "Truststore@123"
將?truststore.jks拷貝到客戶端 塌计,假設(shè)文件路徑為 /opt/cert/truststore.jks
MySQL驅(qū)動(dòng)
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://xx.xx.xx.xx:3306/test?allowMultiQueries=true&useUnicode&characterEncoding=UTF-8&autoReconnect=true&useSSL=true&verifyServerCertificate=true&requireSSL=true&clientCertificateKeyStoreUrl=file:/opt/cert/truststore.jks&clientCertificateKeyStorePassword="Truststore@123"
username=root
password=MySQL@123
MariaDB驅(qū)動(dòng)
driverClassName=org.mariadb.jdbc.Driver
url=jdbc:mariadb://xx.xx.xx.xx:3306/test?allowMultiQueries=true&useUnicode&characterEncoding=UTF-8&autoReconnect=true&useSSL=true&trustServerCertificate=false&requireSSL=true&clientCertificateKeyStoreUrl=file:/opt/cert/truststore.jks&clientCertificateKeyStorePassword="Truststore@123"
username=root
password=MySQL@123
當(dāng)啟用SSL加密并設(shè)置連接字符串屬性trustServerCertificate=false 時(shí)需要做些什么,與設(shè)置trustServerCertificate=true 有什么區(qū)別侯谁?
如果當(dāng)使用安全套接字層 (SSL) 對(duì)通信層加密時(shí)應(yīng)自動(dòng)信任服務(wù)器安全套接字層證書(shū)锌仅,則為“true” , 否則為 false良蒸。
此處技扼,客戶端務(wù)端設(shè)置了證書(shū)驗(yàn)證,通過(guò)連接字符串屬性?clientCertificateKeyStoreUrl=file:/opt/cert/?truststore.jks 和 clientCertificateKeyStorePassword=?"Truststore@123"?驗(yàn)證服務(wù)器安全套接字層證書(shū)嫩痰。
3. 服務(wù)端開(kāi)啟SSL剿吻,配置證書(shū),客戶端連服務(wù)端串纺,配置雙向驗(yàn)證服務(wù)端證書(shū)和客戶端證書(shū)
#? keytool -importcert -alias?MySQLCACert??-file ca.pem??-keystore truststore.jks? ?-storepass?Truststore@123? ?-noprompt
# openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem -name "mysqlclient" -passout pass:Keystore@123 -out client-keystore.p12
# keytool -importkeystore -srckeystore client-keystore.p12 -srcstoretype pkcs12 -srcstorepass "Keystore@123" -destkeystore keystore.jks? -deststoretype JKS -deststorepass "Truststore@123"
# keytool -v -list? -keystore truststore.jks? ??-storepass "Truststore@123"
# keytool -v -list? ?-keystore keystore.jks? ? ?-storepass "Truststore@123"
# cat ca.pem
# keytool -export? -alias mysqlcacert? -keystore truststore.jks --storepass "Truststore@123" -rfc
可以看出 丽旅,實(shí)際上事將CA證書(shū) ca.pem 導(dǎo)入到了 truststore.jks中。
# cat client-cert.pem
# keytool -export -alias mysqlclient??-keystore keystore.jks --storepass "Truststore@123" -rfc
可以看出纺棺,實(shí)際是將 客戶端證書(shū) client-cert.pem 導(dǎo)入到了 keystore.jks中榄笙,當(dāng)然也將 客戶端私鑰 client-key.pem 導(dǎo)入到了keystore.jks中,只是我們沒(méi)法直接從?keystore.jks 獲取私鑰內(nèi)容祷蝌。
注意: 此處?file:///path/to/file?等價(jià)于?file:/path/to/file? ?
將?truststore.jks 和 keystore.jks 拷貝到客戶端 茅撞,假設(shè)文件路徑為??/opt/cert/truststore.jks? /opt/cert/keystore.jks
MySQL驅(qū)動(dòng)
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://xx.xx.xx.xx:3306/test?allowMultiQueries=true&useUnicode&characterEncoding=UTF-8&autoReconnect=true&verifyServerCertificate=true&useSSL=true&requireSSL=true&clientCertificateKeyStoreUrl=file:/opt/cert/keystore.jks&clientCertificateKeyStorePassword="Keystore@123"&trustCertificateKeyStoreUrl=file:/opt/cert/truststore.jks&trustCertificateKeyStorePassword="Truststore@123"
username=root
password=MySQL@123
MariaDB驅(qū)動(dòng)
driverClassName=org.mariadb.jdbc.Driver
url=jdbc:mariadb://xx.xx.xx.xx:3306/test?allowMultiQueries=true&useUnicode&characterEncoding=UTF-8&autoReconnect=true&trustServerCertificate=false&useSSL=true&requireSSL=true&clientCertificateKeyStoreUrl=file:/opt/cert/keystore.jks&clientCertificateKeyStorePassword="Keystore@123"&trustCertificateKeyStoreUrl=file:/opt/cert/truststore.jks&trustCertificateKeyStorePassword="Truststore@123"
username=root
password=MySQL@123
用“設(shè)置服務(wù)器身份驗(yàn)證”和“設(shè)置客戶端身份驗(yàn)證”中概述的步驟,以建立雙向雙向身份驗(yàn)證過(guò)程,在該過(guò)程中米丘,服務(wù)器和客戶端在建立連接之前先對(duì)彼此進(jìn)行身份驗(yàn)證剑令。
盡管上述典型設(shè)置在兩端都使用相同的CA證書(shū)進(jìn)行相互身份驗(yàn)證,但并非必須如此拄查。?
唯一的要求是吁津,在服務(wù)器中配置的CA證書(shū)必須能夠驗(yàn)證客戶端證書(shū),并且導(dǎo)入到客戶端信任庫(kù)中的CA證書(shū)必須能夠驗(yàn)證服務(wù)器證書(shū)堕扶。?
兩端使用的兩個(gè)CA證書(shū)可以不同碍脏。
綜上,我們可以看到:
客戶端不做認(rèn)證 稍算,直接信任證書(shū)典尾,客戶端無(wú)需配置證書(shū)
單向認(rèn)證(驗(yàn)證服務(wù)端或客戶端),客戶端只需要配置 truststore.jks(truststore-ca.jks或truststore-client.jks)?
雙向認(rèn)證(驗(yàn)證客戶端和者服務(wù)端)邪蛔,?客戶端需要配置truststore.jks(truststore-ca.jks)?和keystore.jks
五急黎、參考
關(guān)于MySQL的jdbc
http://www.reibang.com/p/599bc0e31fde
setTrustServerCertificate 方法?
https://docs.microsoft.com/zh-cn/sql/connect/jdbc/reference/settrustservercertificate-method-sqlserverdatasource?view=sql-server-2017
Steps to connect to an AWS RDS MySql server through SSL/TLS
https://developer.jboss.org/message/966980?_sscc=t
常用Keytool 命令
http://www.willrey.com/support/keytool_command.html
用keytool創(chuàng)建keystore和trustsotre文件
http://www.reibang.com/p/1b1c9cfa17a4