Ssl keytool如何工作:privateKeyEntry和trustedCertEntry?
好的,首先我要说一下我所知道的SSL是如何工作的 最重要的是,我需要了解客户端证书是如何工作的,因为我在设置mTls istio网关时遇到了问题 所以,首先我需要密钥对,私有和公共。如果理解正确,我将使用以下命令创建它们:Ssl keytool如何工作:privateKeyEntry和trustedCertEntry?,ssl,istio,keytool,Ssl,Istio,Keytool,好的,首先我要说一下我所知道的SSL是如何工作的 最重要的是,我需要了解客户端证书是如何工作的,因为我在设置mTls istio网关时遇到了问题 所以,首先我需要密钥对,私有和公共。如果理解正确,我将使用以下命令创建它们: keytool -genkey -alias myKeyPair -keyalg RSA -keysize 2048 store.jks 如果我查看密钥库,将有一个PrivateKeyEntry。接下来,我创建证书请求: keytool -certreq -keyalg R
keytool -genkey -alias myKeyPair -keyalg RSA -keysize 2048 store.jks
如果我查看密钥库,将有一个PrivateKeyEntry。接下来,我创建证书请求:
keytool -certreq -keyalg RSA -alias myKeyPair -file request.csr -keystore store.jks
过了一会儿,我收到了一个签名的客户端证书client.cer
和证书受信任的CACA.cer
。
现在有一些问题:
首先,我尝试从curl发送请求。但是curl需要存储在jks中的私钥。我没有openssl,也无法获得它,所以我使用java代码提取私钥。但是结果总是一样的:istio网关:对等方没有返回证书
其次,我尝试使用java.net.http.HttpClient
和包含jks的SSLContext
设置。它成功了。但是首先我必须把ca.cer
和client.cer
放在我的jks中。这一点我无法理解:为什么我需要放入ca.cer
?因为没有ca.cer
存储在store.jks
中,我有错误证书验证
另外,当我将client.cer放在jks中时,keytool会显示一条警告:
证书已存在于别名下的密钥库中。你还想添加它吗?
为什么它认为privateKeyEntry和trustedCertEntry是一样的?Meta:由于问题的模糊性,答案很差,但是评论太长了
首先,我尝试从curl发送请求。但是curl需要存储在jks中的私钥。我没有openssl,也无法获得它,所以我使用java代码提取私钥。但结果总是一样的:istio网关:对等方没有返回证书
要么你的“摘录”是错误的,要么你提供给curl的方式是错误的,要么两者都是错误的,你都没有描述。首先,要明确的是,与任何进行客户端身份验证的客户端一样,curl实际上需要私钥和证书,通常还需要任何适用的链证书。您必须使用的文件格式,以及单个组合文件或单独文件(添加:)还是完全没有,取决于您使用的curl版本:,并且提供客户机密钥和证书的方式各不相同。使用curl-V
(大写)查看它是如何构建的,然后查看手册页中系统或应用于该实现的部分
其次,我尝试使用java.net.http.HttpClient和包含jks的SSLContext设置。它成功了。但首先我必须把ca.cer和client.cer放在我的jks中。这一点我无法理解:为什么我需要把ca.cer放进去?因为没有存储在store.jks中的ca.cer,我有错误证书验证
可能是“链”或中间CA证书。标准要求SSL/TLS客户端(如服务器)发送将终端实体(客户端或服务器)证书连接到接收方信任库中通常为“根”的任何链证书。(由于RFC5280,并经RFC8446确认,实际上可以使用非根的锚点,但很少这样做。)甚至可能是链证书和根(或锚点)的组合。(有些relier有时仍然可以构建链,在证书未正确发送时验证证书;浏览器尤其倾向于这样做,但大多数服务器不这样做。)
看看它,看看它。如果是PEM格式,您可以通过任何文本显示或编辑程序查看它包含多少个证书。如果它是单个证书,您可以使用keytool-printcert-file$file
--显示详细信息,或者因为您已经导入了它,keytool-list-v-别名-keystore$ks[-storepass$pw]
。如果是多个PEM格式的证书,您可以使用编辑器将其拆分并分别显示。如果是DER格式的多个证书,您将无法轻松处理,但幸运的是,这种格式很少使用opensslx509[-inform pem | der]-text-noout
也常用于显示证书文件的详细信息,但您说您不能使用它
另外,当我将client.cer放在jks中时,keytool会显示一条警告:别名下的密钥库中已经存在证书。你还想添加它吗?为什么它认为privateKeyEntry和trustedCertEntry是相同的
如果你只做了一次,而且是正确的,那就不应该了。提供单独的证书
在文件中,您应该
keytool-importcert
将客户端证书添加到您创建的私钥条目的别名,并用于创建-certreq
,在您的示例中,它是myKeyPair
,然后将keytool-importcert
任何所需的链证书,以及可选的根证书或锚点添加到不同的别名。(通常可以方便地(但不是必需的)使用简单的单词,如root
、imed
、imed2
等作为别名。)或者,如果将整个链作为一个文件,则可以使用PEM序列或DER序列,或“p7b”(一个虚拟PKCS7 SignedData,没有数据也没有签名,通常用作一个或多个证书的容器,如链)无论是PEM还是DER,您都应该在一次操作中导入该链。Meta:由于问题的模糊性,答案很差,但注释太长
首先,我尝试从curl发送请求。但是curl需要存储在jks中的私钥。我没有openssl,也无法获取私钥,所以我使用java代码提取私钥。但是结果总是一样的:istio网关:peer没有返回证书
要么你的“摘录”错误,要么你提供给curl的方式错误,要么两者都错误,你都没有描述。首先,要明确的是,就像任何进行客户端身份验证的客户端一样,curl实际上需要私钥和证书,通常还需要任何适用的链证书。你必须使用什么文件格式,以及是否使用