lr-*_*pal 7 shell curl redhat openshift
我想执行下面的curl 命令并指定我自己的密钥存储。
我尝试使用 --cacert 选项并指定 cacert jks 的路径。
curl --ssl-reqd --url 'smtp://mailhost.myorg.com:587' --user 'usrid:pwd' --mail-from 'fromaddr@myorg.com' --mail-rcpt 'toaddr@myorg.com' --upload-file mail.txt -vv --cacert /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.272.b10-1.el7_9.x86_64/jre/lib/security/cacerts
Run Code Online (Sandbox Code Playgroud)
但它导致了一个错误。
curl: (77) Problem with the SSL CA cert (path? access rights?)
Run Code Online (Sandbox Code Playgroud)
正如 Amit 引用的那样,curl --cacert
需要 PEM 格式的文件——但 Javacacerts
文件是 JKS 格式,这是有很大不同的。
您可以使用脚本将证书从 JKS 格式转换为 PEM 格式,如下所示:
jks=/usr/lib/jvm/$javaversion/jre/lib/security/cacerts
for c in $(keytool -keystore $jks -storepass changeit -list | awk -F, '/trustedCert/{print $1}'); do
keytool -keystore $jks -storepass changeit -exportcert -alias $c -rfc
done >pemfile
# for Java9 up use -cacerts instead of -keystore $jks
Run Code Online (Sandbox Code Playgroud)
这可能使得这个话题与 SO 有点切题,因为你的问题根本不是关于编程的。您可以选择一个或几个证书,而不是执行所有证书,这是您想要建立和验证的连接所需的。
但对于 RedHat(如标记的)来说,这是没有必要的。在 RedHat(和基于 RH 的)中,Open JDK 包JRE/lib/security/cacerts
实际上是一个符号链接/etc/pki/java/cacerts
,由另一个包提供ca-certificates.noarch
- 该包还提供了PEM 格式中已有的相同/etc/pki/tls/cert.pem
证书,因此您可以直接使用它(尽管名称显示为单数)它实际上包含,或者更确切地说链接到包含许多证书的文件)并且采用 NSS 格式,/etc/pki/nssdb/*
这是 RH 软件包curl
默认使用的格式。因此,curl
默认情况下,您已经使用了可以从 Java 文件中获取的相同证书cacerts
,因此这项工作根本不会完成任何任务。
使用时--cacert
需要指定证书 - 例如 -/tmp/ca.crt
来自文档:
--cacert (HTTPS) 告诉curl 使用指定的证书文件来验证对等点。该文件可能包含多个 CA 证书。证书必须采用 PEM 格式。如果多次使用此选项,则将使用最后一次。
--capath (HTTPS) 告诉curl 使用指定的证书目录来验证对等点。证书必须采用 PEM 格式,并且目录必须已使用 openssl 提供的 c_rehash 实用程序进行处理。Windows 下不支持证书目录(因为 c_rehash 使用符号链接来创建它们)。如果 --cacert 文件包含许多 CA 证书,则使用 --capath 可以比使用 --cacert 更有效地允许 curl 建立 https 连接。如果多次使用此选项,则将使用最后一次。
因此,如果您指定--cacert
,CA 证书将存储在指定的文件中。这些 CA 证书用于验证 cURL 连接到的远程服务器的证书。
该--capath
选项用于指定包含 CA 证书的目录而不是单个文件。