翻譯|使用教程|編輯:吳園園|2020-06-03 15:03:37.980|閱讀 1215 次
概述:本文介紹了如何使用UniDAC和SecureBridge從Delphi建立與MySQL的SSL連接。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
UniDAC (Universal Data Access Components)是一款通用數據庫訪問組件,提供了多個數據庫的直接訪問,如針對Windows的Delphi, C++Builder, Lazarus (以及 Free Pascal) , Mac OS X, iOS, Android, Linux和64和32位的FreeBSD等等。我們將長期的經驗集于這個小組件,提供統一的數據庫連接訪問(如oracle、微軟SQL等等)。這意味著您可以在您的項目之間輕松地切換不同的數據庫,以及創建跨數據庫應用程序接口。
UniDAC多年來一直支持MySQL SSL(使用證書)連接。我記得最早的是2013年發布的5.0.1版本。
多年來,需求和連接方法不斷發展。UniDAC也是如此。但是,某些要求是如此具體,以至于很難在所有數據庫特定功能之間“統一”。因此,Devart為某些特定需求提供了單獨的解決方案。Devart的SecureBridge Delphi組件就是這樣一種解決方案,您可以使用它建立從Delphi到MySQL數據庫的SSL / SSH連接,而無需外部庫或軟件。我們都知道廣泛使用的OpenSSL正在使用外部DLL文件。
在本文中,您將演示如何使用這兩種產品UniDAC和SecureBridge來建立與MySQL數據庫的SSL連接。
MySQL是Oracle在撰寫本文時提供的商業產品。有社區(GPL)下載。另一方面,MariaDB幾乎是相同的,這是在Oracle將MySQL更改為商業產品之前從最新的免費MySQL源代碼派生而來的。本文將在示例中使用MariaDB,因為這是新的發行版,在最近的Linux發行版中迅速傳播并廣泛使用。但是,大多數人仍然將MariaDB稱為MySQL。在本文中,我將是其中之一,并稱其為“ MySQL”而不是MariaDB。
請注意,本文不包含有關安裝任何風味的MySQL服務器,修改MySQL配置文件或安裝OpenSSL的說明(大多數現有系統默認包含該說明,但有些系統(例如Windows)默認不包含它)或MySQL支持的其他SSL庫。
本文還假定已經安裝了SecureBridge和UniDAC,并且可以與您擁有的Delphi版本一起使用。本文將使用以下版本:
為MySQL連接準備MySQL
如果您的服務器在虛擬專用服務器(VPS)上運行或已經由管理員安裝,則可以跳過本部分,直接轉到有關準備UniDAC以與SecureBridge一起使用的部分。
盡管我想在此處包括用于SSL連接指令的詳細MySQL設置,但我發現它將重復Internet上已經存在的幾乎相同的指令。相反,我只是將您指向以設置您自己的MySQL服務器以進行SSL連接。
即使您完全按照上面的常見問題解答中的說明進行操作,有時也可能會在/var/log/mysql/error.log文件中遇到如下錯誤:
SSL錯誤:無法從“ /etc/mysql/ssl/server-key.pem”獲取私鑰
默認情況下,Linux系統上的OpenSSL創建文件權限為600(僅所有者可讀)的某些PEM文件(密鑰文件)。由于文件權限限制,MySQL在啟動時無法讀取它們。為了解決此錯誤,您必須使用以下shell命令更改證書文件權限:
root @ debian:?#chmod 644 / etc / mysql / ssl / *
除此之外,提供的FAQ非常詳細,可幫助您為啟用SSL的連接設置MySQL。
準備與SecureBridge一起使用的UniDAC
UniDAC安裝會自動在Delphi中注冊數據庫組件。但是,它不會自動注冊其安裝的所有內容。這是因為其中某些組件是特定的。例如,將UniDAC與SecureBridge一起使用需要TCRSSLIOHandler組件。默認情況下,組件的源代碼和安裝包安裝在用戶的Document目錄中。在我的系統上,安裝路徑為:
“ C:\ Users \ Ertan \ Documents \ Devart \ UniDAC for RAD Studio 10.3 \ Demos \ TechnologySpecific \ SecureBridge \ Delphi26 \ dacsbridge260.dpk”
“ C:\ Users \ Ertan \ Documents \ Devart \ UniDAC for RAD Studio 10.3 \ Demos \ TechnologySpecific \ SecureBridge \ Delphi26 \ dcldacsbridge260.dpk”
上面的第一個文件是運行時,第二個文件是設計時包。您需要使用Delphi以給定的順序打開這些文件,然后一個一個地構建它們。對于第二個軟件包,您還需要在編譯后進行安裝。可以使用Delphi默認屏幕布局右上角的Projects進行編譯和安裝。請注意,運行時程序包的彈出菜單中未顯示“安裝”選項。您將只對該程序包進行編譯和構建。
實際上,您可能需要使用“以管理員身份運行”來啟動Delphi,然后才能實際構建和安裝上述軟件包。這是因為UniDAC默認安裝在“ C:\ Program Files(x86)\ Devart \ UniDAC for RAD Studio 10.3”目錄中,只有具有管理員權限的應用程序才能修改文件。
為了使TCRSSHIOHandler和TCRSSLIOHandler組件在Windows x64,macOS,iOS模擬器,iOS設備,Android和64位Linux上運行,必須為每個平臺編譯運行時程序包(可以在Windows的“目標平臺”中選擇)項目包)。
為通過SecureBridge的MySQL SSL連接準備項目
您將需要證書文件用于與MySQL服務器的SSL連接。如果您使用的是自簽名證書文件,則應在準備用于SSL連接的MySQL時生成它們。如果您已從證書頒發機構處支付了證書,則可能會將這些文件提供給您下載或通過電子郵件發送。
您必須知道磁盤上這些證書文件所在的證書。
正常運行Delphi并將以下組件放在表單/數據模塊上:
您的用例可能會有所不同,您可以將TScFileStorage更改為TScMemoryStorage或TScRegStorage。即使本文使用TScFileStorage,提供的代碼示例也適用于所有這些組件。僅在提供的代碼示例中更改組件名稱就足夠了。
設置UniConnection1,以便可以直接連接到MySQL服務器(無SSL)。您只需要將SpecificOptions.Protocol設置為mpSSL即可啟動安全連接。如果未設置該特定選項,則連接將是常規的普通連接,因此記住將其打開很重要。然后,必須按照以下順序將組件相互連接。
UniConnection1.IOHandler-> CRSSLIOHandler1
CRSSLIOHandler1.Storage-> ScFileStorage1
現在,我們必須將證書文件加載到ScFileStorage1組件。為此,您應該按照以下步驟操作:
1、雙擊ScFileStorage1。
2、在出現的窗口中切換到“ 證書”選項卡。
3、單擊新建按鈕。
4、單擊新建按鈕。
請注意,某些SSL連接可能不需要您提供CA證書,并且可能根本沒有CA證書。在這種情況下,最好完全不加載任何CA證書。
就我而言,我不需要任何CA證書,并且在加載客戶端證書之后,上述窗口如下所示。
現在,您可以單擊“ 關閉”按鈕,然后選擇CRSSLIOHandler1組件。使用對象檢查器,將CertName設置為“ client-cert ”,如果您具有CA證書,還將CACertName設置為“ ca-cert ”。最后,將SecurityOptions.TrustServerCertificate設置為True。如果您沒有使用可信任的證書頒發機構提供的付費證書,可以在線檢查其有效性,那么這最后一部分尤為重要。這種在線有效性檢查對于所有類型的證書都是通用的。
最后,我們應該將UniConnection1.Options.KeepDesignConnected設置為False。在嘗試建立連接之前,加載運行時證書密鑰文件是必需的。
至此,我們完成了設計時間參數的設置。現在,我們需要在運行時加載密鑰文件(證書密鑰)。
在嘗試建立與服務器的連接之前,必須加載證書密鑰文件。我選擇使用以下代碼在DataModule.OnCreate()上執行此操作:
procedure TDM.DataModuleCreate(Sender: TObject); var Cert: TScCertificate; begin Cert := ScFileStorage1.Certificates.FindCertificate('client-cert'); if Cert <> nil then begin Cert.Key.ImportFrom('C:\Users\Ertan\Desktop\mysql sertifikalar\client-key.pem'); UniConnection1.Open(); UniQuery1.Open(); end; end;
上面的代碼首先在ScFileStorage1組件中查找名為“ client-cert ”的證書,如果找到,則從磁盤文件中導入客戶端證書密鑰文件。
至此,我們準備建立與MySQL服務器的SSL連接。我們只需調用Open方法即可。
Uniconnection1.Open();
最后,我們打開一個查詢,該查詢實際上是檢查我們是否確實與服務器建立了SSL連接。可以通過使用SQL LIKE運算符來完成。
顯示狀態,如“ Ssl_cipher”;
上面的SQL將向我們顯示連接中的活動SSL密碼。如果連接不安全,此查詢將返回一個空值。否則,將為您提供由證書文件實際定義的安全連接的詳細信息。
請注意,CRSSLIOHandler1具有CipherSuite和Protocols 屬性,可以在有需要時幫助您打開/關閉它們。默認情況下,幾乎所有常用密碼都已打開,并且所有協議都已打開。大多數時候,您將不需要修改這些屬性。僅作為附加信息,您可以知道SecureBridge具有如此詳細的微調功能。
現在,您可以運行Delphi應用程序,查看您是否確實與MySQL服務器建立了SSL連接。就我而言,我得到以下屏幕。
上面的代碼首先在ScFileStorage1組件中查找名為“ client-cert ”的證書,如果找到,則從磁盤文件中導入客戶端證書密鑰文件。
至此,我們準備建立與MySQL服務器的SSL連接。我們只需調用Open方法即可。
Uniconnection1.Open();
最后,我們打開一個查詢,該查詢實際上是檢查我們是否確實與服務器建立了SSL連接。可以通過使用SQL LIKE運算符來完成。
顯示狀態,如“ Ssl_cipher”;
上面的SQL將向我們顯示連接中的活動SSL密碼。如果連接不安全,此查詢將返回一個空值。否則,將為您提供由證書文件實際定義的安全連接的詳細信息。
請注意,CRSSLIOHandler1具有CipherSuite和Protocols 屬性,可以在有需要時幫助您打開/關閉它們。默認情況下,幾乎所有常用密碼都已打開,并且所有協議都已打開。大多數時候,您將不需要修改這些屬性。僅作為附加信息,您可以知道SecureBridge具有如此詳細的微調功能。
現在,您可以運行Delphi應用程序,查看您是否確實與MySQL服務器建立了SSL連接。就我而言,我得到以下屏幕。
上圖中的查詢結果告訴我們,我們使用DHE-RSA-AES256-SHA與服務器建立了安全連接。如果由于某種原因我們與服務器建立了常規的普通連接,則value列將為空。這是MySQL識別安全連接的方法。
如果您想知道結果中值列數據的含義的詳細信息,則每個破折號分隔一個方法。每種方法的更多詳細信息可以在Wikipedia上閱讀:DHA,RSA,AES256,SHA。
關于SecureBridge的更多詳細信息
SecureBridge是一個允許您僅分發EXE文件的工具。它不依賴于任何外部DLL或軟件。這樣,您可以輕松地在針對Android或iOS的FMX應用程序中使用它。
SecureBridge允許您不直接從磁盤文件中加載證書文件,而是例如從資源之類的流中加載證書文件。還可以在源代碼中包含加密的常量數據。在運行時對其進行解密,并在運行時加載該證書和密鑰文件。這種邊緣情況很可能是具有自己安全要求的客戶的要求。我已經收到了如此出色的案例。
您可以使用TUniConnection.SpecificOptions提供磁盤上的證書文件信息。為此,請執行以下步驟:
將屬性CRSSLIOHandler1.Storage設置為nil(刪除對象檢查器中該屬性中寫入的內容);
1、UniConnection1.SpecificOptions.Values ['SSLOptions.SSLCACert']:='磁盤文件全名';
2、UniConnection1.SpecificOptions.Values ['SSLOptions.SSLCert']:='磁盤文件全名';
3、UniConnection1.SpecificOptions.Values ['SSLOptions.SSLKey']:='磁盤文件全名';
4、將屬性UniConnection1.IOHandler設置為CRSSLIOHandler1;
5、將屬性CRSSLIOHandler1.Storage設置為nil(刪除對象檢查器中該屬性中寫入的內容);
6、將屬性CRSSLIOHandler1.CACertName設置為nil(刪除對象檢查器中該屬性中寫入的內容);
7、將屬性CRSSLIOHandler1.CertName設置為nil(刪除在對象檢查器中該屬性中寫入的內容)。
立即下載UniDAC 的30天免費試用版
了解更多產品信息或想要購買產品正版授權請點擊
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自: