Devart数据库工具【教程】:使用UniDAC和SecureBridge从Delphi到MySQL的SSL连接

翻译|使用教程|编辑:吴园园|2020-06-03 15:03:37.980|阅读 57 次

概述:本文介绍了如何使用UniDAC和SecureBridge从Delphi建立与MySQL的SSL连接。

# 正版采购狂欢节,企业采购正当时 #

相关链接:

UniDAC (Universal Data Access Components)是一款通用数据库访问组件,提供了多个数据库的直接访问,如针对Windows的Delphi, C++Builder, Lazarus (以及 Free Pascal) , Mac OS X, iOS, Android, Linux和64和32位的FreeBSD等等。我们将长期的经验集于这个小组件,提供统一的数据库连接访问(如oracle、微软SQL等等)。这意味着您可以在您的项目之间轻松地切换不同的数据库,以及创建跨数据库应用程序接口。

点击下载UniDAC最新版

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版本一起使用。本文将使用以下版本:

  • Debian v10.4 Linux发行版
  • MariaDB v10.3.22
  • Delphi v10.3.3
  • UniDAC v8.1.3
  • SecureBridge v9.2.4

为MySQL连接准备MySQL

如果您的服务器在虚拟专用服务器(VPS)上运行或已经由管理员安装,则可以跳过本部分,直接转到有关准备UniDAC以与SecureBridge一起使用的部分。

尽管我想在此处包括用于SSL连接指令的详细MySQL设置,但我发现它将重复Internet上已经存在的几乎相同的指令。相反,我只是将您指向FAQ,以设置您自己的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并将以下组件放在表单/数据模块上:

  • TUniConnection
  • TMySQLUniProvider
  • TCRSSLOIHandler
  • TSc文件存储

您的用例可能会有所不同,您可以将TScFileStorage更改为TScMemoryStorage或TScRegStorage。即使本文使用TScFileStorage,提供的代码示例也适用于所有这些组件。仅在提供的代码示例中更改组件名称就足够了。

设置UniConnection1,以便可以直接连接到MySQL服务器(无SSL)。您只需要将SpecificOptions.Protocol设置为mpSSL即可启动安全连接。如果未设置该特定选项,则连接将是常规的普通连接,因此记住将其打开很重要。然后,必须按照以下顺序将组件相互连接。

UniConnection1.IOHandler-> CRSSLIOHandler1

CRSSLIOHandler1.Storage-> ScFileStorage1

现在,我们必须将证书文件加载到ScFileStorage1组件。为此,您应该按照以下步骤操作:

1、双击ScFileStorage1。

2、在出现的窗口中切换到“ 证书”选项卡。

3、单击新建按钮。

  • 在CertName中键入ca-cert,然后单击Import from ...按钮。
  • 从文件系统中选择您的CA证书文件。

4、单击新建按钮。

  • 在CertName中键入client-cert,然后单击Import from ...按钮。
  • 从文件系统中选择客户端证书文件。

请注意,某些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连接。就我而言,我得到以下屏幕。

Devart数据库工具【教程】:使用UniDAC和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天免费试用版

了解更多产品信息或想要购买产品正版授权请点击【咨询在线客服】



标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,尊重他人劳动成果

文章转载自:UniDAC

登录 慧都网发表评论


暂无评论...

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
相关厂商
相关产品
UniDAC

UniDAC 是一个通用数据访问控件,支持几乎所有数据库格式,支持64位系统。

在线
客服
咨询
电话
400-700-1020
在线
QQ
购物车 反馈 返回
顶部
在线客服系统
live chat