我不了解加密连接的 MySQL 文档。服务器配置了证书,除非我误读了它,否则文档说客户端也必须有证书。
但是,如果我使用 'mysql --ssl' 启动客户端,则 \s 报告该连接是使用 DHE-RSA-AES256-GCM-SHA384 进行 SSL 加密的,即使我没有在客户端使用任何证书。/etc/my.cnf.d/client.cnf 在 [client] 部分没有任何证书,我也没有 .my.cnf
我怎么可能与 SSL 连接?是不是真的加密了?
我不了解加密连接的 MySQL 文档。服务器配置了证书,除非我误读了它,否则文档说客户端也必须有证书。
但是,如果我使用 'mysql --ssl' 启动客户端,则 \s 报告该连接是使用 DHE-RSA-AES256-GCM-SHA384 进行 SSL 加密的,即使我没有在客户端使用任何证书。/etc/my.cnf.d/client.cnf 在 [client] 部分没有任何证书,我也没有 .my.cnf
我怎么可能与 SSL 连接?是不是真的加密了?
是的,连接是加密的。我认为您在这里混淆了一些事情。让我尝试为您简化它:
SSL是一种通过安全网络交换数据的协议,为了建立连接,服务器必须有证书才能使用。为了获得证书,您必须获得一个。这通常由证书颁发机构 (CA)或使用自签名的证书颁发机构完成,但我们将在这里保持简单并坚持使用 CA。
如果您在设置 SSL 时使用的证书是有效的,并且被尝试建立连接的客户端信任,那么连接尝试应该会成功。客户端不需要在这里出示证书,但它确实需要信任证书的颁发者。这通常通过在您的机器上拥有一份 CA 证书的副本并验证服务器提供的证书是否由 CA 签名/颁发来完成。这大致对应于
--ssl-mode=VERIFY_CA
and--ssl-mode=VERIFY_IDENTITY
(它检查证书中的主机名是否与您尝试连接的服务器)。--ssl-ca
MySQL 允许客户端在使用、--ssl-cert
和选项验证服务器身份时选择要使用的证书,并且--ssl-key
为了使传输连接成功,客户端提供的证书必须由颁发服务器的同一 CA 颁发证书。这是可选的,如果您不提供,则客户端将在其存储中查找相应的证书。此外,一旦您建立了 SSL 连接,您就可以使用证书(通常使用某种PKI技术)对帐户进行身份验证,这实际上将取代使用密码登录 - 但这里要理解的关键是,当流程开始时在您尝试登录时,SSL 连接已经建立。当您使用此方法时,您通常会发现客户端证书与颁发服务器证书的 CA 是由同一 CA 颁发的。
我用下面的比喻来向我教的人解释:
证书的主题相当广泛,但对您而言,关键是了解客户端信任服务器以建立安全连接与您使用客户端证书跨该连接进行身份验证之间的区别。
SSL 通信从一个
handshake
阶段开始,在此阶段 apublic-crypto-key
被发送到客户端以供将来使用。所以你不必拥有它,你的客户无论如何都会得到它。那我们为什么需要这些
Public SSL certificate
?Public SSL certificate
确实包括public-crypto-key
,因此您实际上可以将public-crypto-key
来自服务器的数据与public-crypto-key
来自您的Public SSL certificate
. 除非您还想检查这是否public-crypto-key
是由某些特定的Certificate Authority (CA)
.无论如何,为什么我们需要检查这是否
public-crypto-key
是由某些特定的Certificate Authority (CA)
?当您通过 IP 将您的 MYSQL 服务器连接到您的数据库客户端时,您真的不关心它。因为您知道 MySQL 服务器的 IP,并且您已经信任它。Certificate Authority (CA)
是一种legacy
来自另一种使用 SSL 的安全协议而闻名HTTPS
。在HTTPS
您连接到未知 IP 地址时,您应该确定一件事 -a domain name
。域名可以每分钟重新分配给一个新的 IP 地址。它可以重新分配给您自己的本地主机(通过“主机”文件的配置)。想象一个复杂的计算机病毒进入您的计算机,部署一个网络服务器并将您的“your-bank.com”网络域重新分配给该网络服务器。下次打开浏览器时,您输入您的银行帐户凭据,但 Web 服务器不会让您访问您的银行帐户,而是将您的凭据发送给黑客。会很不爽,对吧?为了避免这种情况人们发明了HTTPS
。在 HTTPS 中,您的浏览器会为您做一些检查。它需要一个
public-crypto-key
来自 web 服务器的,只是为了将它与Public SSL certificates
来自受信任的已知列表进行比较Certificate Authority (CA)
。然后它检查分配给它的域名,Public SSL certificates
并确定该 Web 服务器是否确实允许为所提供的域提供内容。但是,为什么我们的“复杂病毒”不能解析 a并从真实网站中
handshake
提取 a只是为了将其提供给您的浏览器?public-crypto-key
答案是——“它可以”。它可以允许
HTTPS
授权通过,但随后欺诈性 Web 服务器将需要与您的浏览器“对话”。并且要能够“交谈”欺诈性网络服务器就需要使用private-crypto-key
服务器消息来加密,但private-crypto-key
很难实现。看,我们赢了。
结束。
除了一件事,AWS 使用域名来访问 RDS,而不是 IP 地址。所以我们确实需要
Public SSL certificates
. 但是 MySQL_Workbench 不是一个网络浏览器,所以你会想,它可能对Certificate Authorities
. 但实际上 MySQL_Workbench 确实知道Certificate Authority (CA)
并激活它,您需要转到“SSL”选项卡并将“使用 SSL”下拉列表设置为“要求并验证 CA”——在这种情况下,您需要向your.pem
“SSL CA”提供文件文件:”字段。回到你的问题:“当我没有提供证书时,为什么客户端报告连接是 SSL 加密的?”
因为它是用一些证书加密的,你的客户要么使用 MySQL 服务器提供的证书,要么验证 CA 并可能拒绝它。现在你告诉我,你为什么要设置你的数据库客户端来接受来自 MySQL 服务器的任何证书,绕过 CA 的验证?