java - 了解 ssl 文件和机制
问题描述
你好,我想让有人解释一下 ssl 的工作原理,最重要的是解释一下这些文件扩展名是什么以及它们的用途是什么,例如我正在尝试连接到 kafka,我有一个脚本,它提取了我的 kafka 的 mu kubernetes 集群中的秘密,我有多个文件,不知道 tey 的用途:所以如果有人能解释一下什么是 .trustore .keystore .pem .p12 .key .crt .ca.crt ...谢谢你,我知道这可能很模糊,但我是使用 ssl 和 kafka 的新手,所以如果有人对此有一些基本的解释,那真的会对我有所帮助。
谢谢您的帮助
解决方案
这是一个非常复杂的话题,你应该使用谷歌。我将尝试在这里回答,但如果您不了解 SSL、PKI 和非对称加密概念,您可能会迷失在我的解释中。您可以在 Youtube 上找到视频以及互联网上的大量教程和解释。
每个 SSL 证书由两部分组成:
- SSL 证书本身 - 这是一个公共部分,它包含通用名称、有关证书及其所有者的一些其他重要信息。最重要的部分可能是 PUBLIC KEY 和 CA 签名
- 私钥 - 这本质上是密码 - 它是私有部分,您绝不能与任何人共享
私钥和公钥在数学上相互绑定。你用一个密钥加密的内容可以用另一个密钥解密。拥有 PRIVATE 密钥的人可以轻松地从中派生 PUBLIC 密钥,但它不能以另一种方式工作。这就是非对称加密的原理。
证书和密钥只是两个文件。扩展并不重要。但为方便起见,.key
后缀用于私钥。对于证书,我们通常使用.crt
,.pem
或.der
.
重要的是如何对证书和私钥进行编码。它可以是 PEM 编码或 DER 编码:
- PEM:这是人类可读的格式。您可以告诉 PEM 编码证书,因为第一行包含
-----BEGIN CERTIFICATE-----
行。 - DER:这是二进制格式。如果你在编辑器中打开这个文件,那将是一堆不可读的废话,因为它只是一堆 0 和 1
现在你可以看到后缀.der
从哪里来.pem
。.crt
suffix 仅用作.pem
suffix 的替代品。这样每个人都可以分辨出'这个最有可能的证书'。
每个证书的重要部分是它必须由某人签名。某人是证书颁发机构。证书颁发机构只是另一个公钥/私钥对。它归某个高度信任的组织所有。证书颁发机构可以使用他们的私钥签署您的证书。他们的私钥非常安全。您可以获得的是公钥,这就是ca.crt
或ca.pem
包含ca.der
的内容。重要的部分是您可以使用 CA 公钥来验证由他们的私钥完成的签名。签名是您证书的一部分。
互联网上有公开信任的证书颁发机构,每个网络浏览器都信任它们。这些是经过审计和普遍信任的组织。
您可以自己创建证书颁发机构证书和私钥。问题是当您使用它来签署证书时,没有人会信任它。这就是为什么您必须ca.crt
同时提供文件并提供文件的原因。连同您的服务器证书,whatever.crt
您还必须发送ca.crt
并告诉试图验证它的人“嘿!这是我用来签署该证书的 CA,请相信它。这取决于他们是否相信它:)
现在.p12
扩展。这是证书的另一种形式。PKCS#12 是证书“容器”或“存档”。您可以将您的私钥文件 ( .key
) 和证书文件 (.crt
或.pem
文件.der
) 放在一起,然后将它们“放在”一个文件中。您可以将其视为 ZIP 存档,但显然它不是 ZIP 文件。您也可以使用密码保护它。您可以使用openssl
实用程序创建 pkcs#12 容器。
truststore
并且keystore
是 Java 概念。我个人讨厌它们,因为它们只是使事情过于复杂并且没有增加任何价值。大多数 Java 应用程序都可以使用 pem/crt/key/p12/der 文件。卡夫卡最近也包括支持,但我会说它有点半生不熟。
truststore
也是包含“信任证书”的“存档”或“容器”。换句话说,它包含证书颁发机构文件(一个或多个)。所以ca.crt
文件去那里(不是它的私钥!只是ca.crt
)。它可以包含多个证书。当 Java 应用程序启动时,它将读取文件并信任文件内由证书颁发机构签署的任何证书(例如,当您从该 java 连接到某些受 SSL 保护的网页或服务器时)。信任库通常受密码保护。
keystore
也是“存档”或“容器”。.p12
您从存档创建密钥库。因此密钥库包含与文件相同的内容.p12
。证书 + 其私钥。密钥库通常受密码保护。
keystore
并truststore
使用 Javakeytool
实用程序创建。如前所述,您需要.p12
文件来创建它们,因此通常的过程是:
- 我将
openssl
用来生成私钥 - 我将使用
openssl
生成 CSR(.csr
后缀)或证书签名请求文件 - 此文件是未签名证书 - 我会将
.csr
文件发送给证书颁发机构,他们将对其进行签名并提供回.crt
或.pem
或.der
文件(或什至所有文件,以便我可以选择)。他们还会向您发送ca.crt
文件。 - 我将使用
openssl
put.crt
和.key
file.p12
归档 - 我将使用
keytool
归档.p12
归档keystore
。 - 我将使用
keytool
将ca.crt
文件truststore
归档
大多数支持 SSL 的应用程序(我不确定是否 Kafka,但例如 Elasticsearch)都有一些内置工具来帮助您设置自己的证书颁发机构和证书以用于开发/测试目的。它们不是用于生产的,但我认为很多人都以这种方式使用它们。无论如何。
推荐阅读
- django - Django REST ManyToManyField 使用序列化器获取相关值
- ruby-on-rails - 使用 HTTParty 获取/设置会话
- c# - 如何让迷宫加载到我的表单上?
- matlab - 为什么matlab过滤器阶数限制为三分之一的数据长度减一?
- r - 具有比例ggplot的多个条形图
- vba - 为什么这个数组适用于一个单元格引用而不是多个?
- c# - PHP Regex verses Dot Net Regex for date pattern mm/dd/yyyy in a string
- html - 如何将黑色导航栏添加到现有的透明导航栏?
- html - ejs中的表单动作和方法
- python - AttributeError:“列表”对象在从文本中删除标点符号时没有属性“翻译”