Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ssl keytool如何工作:privateKeyEntry和trustedCertEntry?_Ssl_Istio_Keytool - Fatal编程技术网

Ssl keytool如何工作:privateKeyEntry和trustedCertEntry?

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

好的,首先我要说一下我所知道的SSL是如何工作的

最重要的是,我需要了解客户端证书是如何工作的,因为我在设置mTls istio网关时遇到了问题

所以,首先我需要密钥对,私有和公共。如果理解正确,我将使用以下命令创建它们:

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
和证书受信任的CA
CA.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实际上需要私钥和证书,通常还需要任何适用的链证书。你必须使用什么文件格式,以及是否使用