微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

密钥工具如何工作:privateKeyEntry和trustedCertEntry?

如何解决密钥工具如何工作:privateKeyEntry和trustedCertEntry?

好吧,我先说说我对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 gateway: peer did not return a certificate

第二,我尝试将java.net.http.HttpClient设置为包含我的jks的SSLContext。而且有效。但是首先我必须在我的jks中放入ca.cerclient.cer。我不明白这一点:为什么我需要放ca.cer?因为没有将ca.cer存储在store.jks中,所以我进行了错误证书验证。

当我将client.cer放入jks时,keytool也会显示警告:Certificate already exists in keystore under alias <myKeyPair>. Do you still want to add it?为什么认为privateKeyEntry和TrustedCertEntry相同?

解决方法

元:由于问题的模糊性,答案很差,但是评论太久了。

首先,我尝试从curl发送请求。但是curl需要存储在jks中的私钥。我没有openssl并无法获取它,所以我使用Java代码提取了私钥。但是结果始终是相同的:istio gateway:对等方未返回证书

您的“提取”是错误的,或者您提供卷曲的方式是错误的,或者两者都没有,您都没有描述。首先,要明确一点,就像 any 客户端进行客户端身份验证一样,curl实际上需要私钥证书,通常还需要任何适用的链证书。您必须使用哪种文件格式,以及单个组合文件还是单独文件(添加:),或者根本不使用,取决于您使用的curl构建:curl supports seven SSL/TLS implementations,以及方式提供客户端密钥和证书的方法各不相同。使用curl -V(大写)查看其构建方式,然后查看手册页中系统或on the web上适用于该实现的部分。

第二,我尝试将java.net.http.HttpClient与包含我的jks的SSLContext设置一起使用。而且有效。但是首先我必须在我的jks中放入ca.cer和client.cer。我不明白这一点:为什么我需要放入cacer?因为没有ca.cer存储在store.jks中,所以我有错误证书验证。

可能是“链”或中间CA证书。标准要求使用SSL / TLS客户端(例如服务器)来发送将最终实体(客户端或服务器)证书连接​​到接收者信任库中的“根”所需的任何链证书。 (自RFC5280以来,并得到RFC8446的确认,实际上可以使用非根的锚,但这很少见。)甚至它甚至是链证书的 combination 。 s)根(或锚点)。 (某些依赖者有时仍可以构建链来验证未正确发送的证书;特别是浏览器通常会这样做,但大多数服务器却不这样做。)>

看看它,看看。如果是PEM格式,则可以在任何文本显示或编辑程序中查看它包含多少证书。如果是单个证书,则可以使用keytool -printcert -file $file显示详细信息-或因为已经导入了证书,所以可以显示keytool -list -v -alias name -keystore $ks [-storepass $pw]。如果它是PEM格式的多个证书,则可以用编辑器将其拆开,然后分别显示每个证书。如果它是DER格式的多个证书,您将无法轻松处理,但是幸运的是,很少使用该格式。 openssl x509 [-inform pem|der] -text -noout通常也用于显示证书文件的详细信息,但是您说不能使用它。

另外,当我将client.cer放入jks时,keytool也会显示警告:证书在keystore中已经存在别名下。您仍要添加吗?为什么认为privateKeyEntry和TrustedCertEntry是相同的?

如果您仅一次且正确地执行了此操作,则不应这样做。给予单独的证书 文件,则应keytool -importcert {em> client 证书到您创建并用于创建-certreq(在您的示例中为myKeyPair)的私钥条目的别名中,在 之后,您keytool -importcert所需的任何链证书,以及(可选)根或锚(每个)为不同别名。 (使用rootimedimed2等简单词作为别名通常很方便,但不是必需的。)或者,如果整个链都作为一个文件,PEM序列或DER序列,或“ p7b”(没有数据且没有签名的伪PKCS7 SignedData,通常用作一个或多个证书(例如链)的容器),无论是PEM还是DER,您都应导入该链只需一次操作。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。