mysql數據庫ssl連接使用,mysql的ssl

本文目錄一覽:

如何配置MySQL SSL?

MySQL默認的數據通道是不加密的,在一些安全性要求特別高的場景下,我們需要配置MySQL端口為SSL,使得數據通道加密處理,避免敏感信息泄漏和被篡改。

當然,啟用MySQL

SSL之後,由於每個數據包都需要加密和解密,這個對MySQL的性能是有不小影響的,讀者們在使用的時候,要根據實際情況斟酌。

MySQL客戶端登錄服務器時候的密碼不是明文傳輸,有加密策略處理。

筆者是在

ubuntu12.04

系統上使用MySQL

5.5版本測試的,其他環境請讀者自行匹配。

配置MySQL服務器證書

編輯

/etc/mysql/my.cnf

文件

#

ssl-ca=/etc/mysql/cacert.pem

#

ssl-cert=/etc/mysql/server-cert.pem

#

ssl-key=/etc/mysql/server-key.pem

把上面三行默認證書配置注釋打開,使用自己的證書。筆者就使用上次在搭建自己的CA服務

OpenSSL

CA

實戰文章中生成的證書

ssl-ca=/home/yunweipai/user_certs/ca_cert.cer

ssl-cert=/home/yunweipai/user_certs/web.cer

ssl-key=/home/yunweipai/user_certs/web_key_plain.pem

這裡需要注意的是,在ubuntu上,配置證書後如果不生效,參考這裡解決方法

注意上面配置的

web_key_plain.pem

文件,由於MySQL不支持加密後的私鑰,因此我們使用命令

openssl

rsa

-in

web_key.pem

-passin

pass:Yunweipai@123

-out

web_key_plain.pem

將私鑰解密。MySQL不支持私鑰加密的原因是從安全性角度考慮,因為如果要用戶傳遞一個加密的私鑰,那麼必須要用戶傳密碼,那麼MySQL怎麼存儲這個密碼呢?這就引出了我們在密碼存儲和傳輸的安全建議裡面提到的一系列問題了。

所以MySQL為了簡化實現,就不支持私鑰加密。

指定客戶端連接方式

MySQL服務端在對客戶端授權的時候,可以通過選項指定客戶端連接MySQL

服務器的SSL級別,參考MySQL賦權的

REQUIRE值:

ssl_option

SSL:

不認證客戶端,客戶端不需要提供證書

X509:

客戶端必須發送一個有效的X509證書

issuer:

客戶端的證書是否是服務器所配置的CA頒發的(在我們場景下是ca_cert.cer頒發的證書)

subject:

認證證書的subject(關於證書的subject在之前的文章有介紹)

cipher:

指定加密算法

這些選項可以疊加使用,如:X509|issuser

客戶端連接(SSL方式)

mysql

客戶端連接

mysql

-u

root

-pChangeme_123

-P

3306

–ssl-ca=/home/yunweipai/user_certs/ca_cert.cer

Welcome

to

the

MySQL

monitor.

Commands

end

with

;

or

\g.

Your

MySQL

connection

id

is

36

Server

version:

5.5.43-0ubuntu0.12.04.1

(Ubuntu)

Copyright

(c)

2000,

2015,

Oracle

and/or

its

affiliates.

All

rights

reserved.

Oracle

is

a

registered

trademark

of

Oracle

Corporation

and/or

its

affiliates.

Other

names

may

be

trademarks

of

their

respective

owners.

Type

‘help;’

or

‘\h’

for

help.

Type

‘\c’

to

clear

the

current

input

statement.

mysql

\s

————–

mysql

Ver

14.14

Distrib

5.5.43,

for

debian-linux-gnu

(i686)

using

readline

6.2

Connection

id:

36

Current

database:

Current

user:

root@localhost

SSL:

Cipher

in

use

is

DHE-RSA-AES256-SHA

Current

pager:

stdout

Using

outfile:

Using

delimiter:

;

Server

version:

5.5.43-0ubuntu0.12.04.1

(Ubuntu)

Protocol

version:

10

Connection:

Localhost

via

UNIX

socket

Server

characterset:

latin1

Db

characterset:

latin1

Client

characterset:

latin1

Conn.

characterset:

latin1

UNIX

socket:

/var/run/mysqld/mysqld.sock

Uptime:

29

sec

Threads:

1

Questions:

109

Slow

queries:

Opens:

48

Flush

tables:

1

Open

tables:

41

Queries

per

second

avg:

3.758

————–

JDBC連接

在jdbc字符串中增加下面參數

useSSL=trueverifyServerCertificate=false

這麼就不需要客戶端配置證書了,配置就簡單很多。因為mysql本身有賬號口令認證,因此不需要證書認證。

如何使用python連接mysql數據庫

在 Python 語言環境下我們這樣連接數據庫。

In [1]: from mysql import connector

In [2]: cnx = connector.connect(host=”172.16.192.100″,port=3306,user=”appuser”,password=”xxxxxx”)

但是連接數據庫的背後發生了什麼呢?

答案

當我們通過驅動程序(mysql-connector-python,pymysql)連接 MySQL 服務端的時候,就是把連接參數傳遞給驅動程序,驅動程序再根據參數會發起到 MySQL 服務端的 TCP 連接。當 TCP 連接建立之後驅動程序與服務端之間會按特定的格式和次序交換數據包,數據包的格式和發送次序由 MySQL 協議 規定。MySQL 協議:整個連接的過程中 MySQL 服務端與驅動程序之間,按如下的次序發送了這些包。

MySQL 服務端向客戶端發送一個握手包,包里記錄了 MySQL-Server 的版本,默認的授權插件,密碼鹽值(auth-data)。

2. MySQL 客戶端發出 ssl 連接請求包(如果有必要的話)。

3. MySQL 客戶端發出握手包的響應包,這個包時記錄了用戶名,密碼加密後的串,客戶端屬性,等等其它信息。

4. MySQL 服務端發出響應包,這個包里記錄了登錄是否成功,如果沒有成功也會給出錯誤信息。

如何解決MySQL在高版本需指明是否進行SSL連接問題

如何解決MySQL在高版本需指明是否進行SSL連接問題

Java使用mysql-jdbc連接MySQL出現如下警告:

Establishing SSL connection without server’s identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn’t set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to ‘false’. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.

在mysql連接字符串url中加入ssl=true或者false即可,如下所示。

url=jdbc:mysql://127.0.0.1:3306/framework?characterEncoding=utf8useSSL=true

如何為MySQL服務器和客戶機啟用SSL

用戶想要與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 SSL證書和私鑰

我們必須為MySQL服務器創建SSL證書和私鑰,通過SSL連接到服務器時要用到它們。

首先,創建一個臨時的工作目錄,我們將把私鑰和證書文件放在該目錄下。

$ sudo mkdir ~/cert $ cd ~/cert

確保OpenSSL已安裝在運行MySQL服務器的系統上。通常,所有Linux發行版在默認情況下都安裝了OpenSSL。想檢查一下OpenSSL有沒有安裝,不妨使用下面這個命令。

$ openssl version OpenSSL 1.0.1f 6 Jan 2014

現在,繼續創建CA私鑰和證書。下面這些命令將創建ca-key.pem和ca-cert.pem。

$ openssl genrsa 2048 ca-key.pem $ openssl req -sha1 -new -x509 -nodes -days 3650 -key ca-key.pem ca-cert.pem

第二個命令會詢問你幾個問題。你在這些字段里填入什麼並不重要。只管填好那些字段。

下一步是為服務器創建私鑰。

$ openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout server-key.pem server-req.pem

這個命令會再次詢問幾個問題,你可以填寫上一步中提供的相同答案。

下一步,使用下面這個命令,將服務器的私鑰導出成RSA類型的密鑰。

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

最後,使用CA證書,創建服務器證書。

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

配置MySQL服務器上的SSL

完成上述過程後,我們應該有了CA證書、服務器的私鑰及其證書。下一步就是配置MySQL服務器,以便使用私鑰和證書。

在配置MySQL服務器之前,檢查一下SSL選項已被啟用還是被禁用。為此,登錄進入到MySQL服務器,輸入下面這個查詢。

mysql SHOW GLOBAL VARIABLES LIKE ‘have_%ssl’;,

該查詢的結果會如同下圖。

請注意:“have_openssl”和“have_ssl”變量的默認值是“被禁用”,如下所示。想啟用MySQL服務器中的SSL,繼續執行下列步驟。

1. 將ca-cert.pem、server-cert.pem和server-key.pem拷貝或移動到/etc目錄下。

$ sudo mkdir /etc/mysql-ssl $ sudo cp ca-cert.pem server-cert.pem server-key.pem /etc/mysql-ssl

2. 使用文本編輯工具,打開服務器的my.cnf配置文件。添加或去掉注釋[mysqld]部分中類似下面內容的幾行。這些應該指向你放在/etc/mysql-ssl中的私鑰和證書。

[mysqld] ssl-ca=/etc/mysql-ssl/ca-cert.pem ssl-cert=/etc/mysql-ssl/server-cert.pem ssl-key=/etc/mysql-ssl/server-key.pem

3. 在my.cnf中,還要找到“bind-address = 127.0.0.1”,並將它改成:

bind-address = *

那樣一來,你就可以從另一個主機連接到MySQL服務器了。

4. 重啟MySQL服務。

$ sudo service mysql restart 或 $ sudo systemctl restart mysql 或 $ sudo /etc/init.d/mysql restart

你只要查看MySQL錯誤日誌文件(比如/var/log/mysql/mysql.log),就可以檢查SSL配置有沒有問題。要是錯誤日誌中沒有警告或錯誤(就像下面的屏幕截圖),這表明SSL配置沒有問題。

驗證SSL配置的另一個辦法就是,在MySQL服務器裡面再次運行“have_%ssl”查詢。

mysql SHOW GLOBAL VARIABLES LIKE ‘have_%ssl’;

創建擁有SSL權限的用戶

服務器端的SSL配置完成後,下一步就是創建有權通過SSL訪問MySQL服務器的用戶。為此,登錄進入到MySQL服務器,輸入下面內容:

mysql GRANT ALL PRIVILEGES ON *.* TO ‘ssluser’@’%’ IDENTIFIED BY ‘dingdong’ REQUIRE SSL; mysql FLUSH PRIVILEGES;

把“ssluser”(用戶名)和“dingdong”(密碼)換成你自己的用戶名和密碼。

如果你想分配一個特定的IP地址(比如192.168.2.8),以便用戶從該地址來訪問服務器,那就改而使用下列查詢。

mysql GRANT ALL PRIVILEGES ON *.* TO ‘ssluser’@’192.168.2.8’ IDENTIFIED BY ‘dingdong’ REQUIRE SSL; mysql FLUSH PRIVILEGES;

配置MySQL客戶機上的SSL

鑒於MySQL服務器端配置已完成,不妨將目光轉移到客戶機端。就MySQL客戶機而言,我們就需要基於服務器的CA私鑰和證書,創建新的私鑰和證書。

在服務器的CA私鑰和證書駐留於其中的MySQL服務器主機上運行下列命令。

$ openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout client-key.pem client-req.pem

類似服務器端配置,上述命令會詢問幾個問題。只管填好字段,就像前面所做的那樣。

我們還需要將創建的客戶機私鑰轉換成RSA類型,如下所示。

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

最後,我們需要使用服務器的CA私鑰和證書,創建客戶機證書。

$ openssl x509 -sha1 -req -in client-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 client-cert.pem

現在,將ca-cert.pem、client-cert.pem和client-key.pem文件轉移到你想要運行MySQL客戶機的任何主機上。

在客戶機主機上,使用下面這個命令,通過SSL連接到MySQL服務器。

$ mysql –ssl-ca=ca-cert.pem –ssl-cert=client-cert.pem –ssl-key=client-key.pem -h -u ssluser -p

在輸入ssluser的密碼後,你會看到如往常那樣的MySQL提示符。

想檢查一下你有沒有使用SSL,在提示符處輸入狀態命令。

mysql status;

如果你已通過SSL連接上去,它會在SSL字段顯示密碼信息,如下所示。

原創文章,作者:KXZK,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/148102.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
KXZK的頭像KXZK
上一篇 2024-11-02 13:14
下一篇 2024-11-02 13:14

相關推薦

  • 如何修改mysql的端口號

    本文將介紹如何修改mysql的端口號,方便開發者根據實際需求配置對應端口號。 一、為什麼需要修改mysql端口號 默認情況下,mysql使用的端口號是3306。在某些情況下,我們需…

    編程 2025-04-29
  • Python 常用數據庫有哪些?

    在Python編程中,數據庫是不可或缺的一部分。隨着互聯網應用的不斷擴大,處理海量數據已成為一種趨勢。Python有許多成熟的數據庫管理系統,接下來我們將從多個方面介紹Python…

    編程 2025-04-29
  • openeuler安裝數據庫方案

    本文將介紹在openeuler操作系統中安裝數據庫的方案,並提供代碼示例。 一、安裝MariaDB 下面介紹如何在openeuler中安裝MariaDB。 1、更新軟件源 sudo…

    編程 2025-04-29
  • Python操作MySQL

    本文將從以下幾個方面對Python操作MySQL進行詳細闡述: 一、連接MySQL數據庫 在使用Python操作MySQL之前,我們需要先連接MySQL數據庫。在Python中,我…

    編程 2025-04-29
  • 數據庫第三範式會有刪除插入異常

    如果沒有正確設計數據庫,第三範式可能導致刪除和插入異常。以下是詳細解釋: 一、什麼是第三範式和範式理論? 範式理論是關係數據庫中的一個規範化過程。第三範式是範式理論中的一種常見形式…

    編程 2025-04-29
  • MySQL遞歸函數的用法

    本文將從多個方面對MySQL遞歸函數的用法做詳細的闡述,包括函數的定義、使用方法、示例及注意事項。 一、遞歸函數的定義 遞歸函數是指在函數內部調用自身的函數。MySQL提供了CRE…

    編程 2025-04-29
  • leveldb和unqlite:兩個高性能的數據庫存儲引擎

    本文將介紹兩款高性能的數據庫存儲引擎:leveldb和unqlite,並從多個方面對它們進行詳細的闡述。 一、leveldb:輕量級的鍵值存儲引擎 1、leveldb概述: lev…

    編程 2025-04-28
  • Python怎麼導入數據庫

    Python是一種高級編程語言。它具有簡單、易讀的語法和廣泛的庫,讓它成為一個靈活和強大的工具。Python的數據庫連接類型可以多種多樣,其中包括MySQL、Oracle、Post…

    編程 2025-04-28
  • MySQL bigint與long的區別

    本文將從數據類型定義、存儲空間、數據範圍、計算效率、應用場景五個方面詳細闡述MySQL bigint與long的區別。 一、數據類型定義 bigint在MySQL中是一種有符號的整…

    編程 2025-04-28
  • MySQL左連接索引不生效問題解決

    在MySQL數據庫中,經常會使用左連接查詢操作,但是左連接查詢中索引不生效的情況也比較常見。本文將從多個方面探討MySQL左連接索引不生效問題,並給出相應的解決方法。 一、索引的作…

    編程 2025-04-28

發表回復

登錄後才能評論