我想执行下面的curl命令并指定我自己的密钥存储。
我尝试使用 --cacert 选项并指定 cacert jks 的路径。
curl --ssl-reqd --url 'smtp://mailhost.myorg.com:587' --user 'usrid:pwd' --mail-from '[email protected]' --mail-rcpt '[email protected]' --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
但是导致了错误。
curl: (77) Problem with the SSL CA cert (path? access rights?)
正如 Amit 引用的那样,
curl --cacert
需要 PEM 格式的文件 - 但 Java cacerts
文件是 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
which maybe使得这对于SO来说有点切题,因为你的问题根本不是关于编程的。您可以选择一个或几个您想要建立和验证的连接所需的证书,而不是执行“所有”证书。 但对于 RedHat(如标记的)来说,这是不必要的。在 RedHat(和基于 RH 的)Open JDK 软件包中
JRE/lib/security/cacerts
实际上是
/etc/pki/java/cacerts
的符号链接,它由不同的软件包 ca-certificates.noarch
提供——它还提供已经采用 PEM 格式的 same证书
/etc/pki/tls/cert.pem
所以你可以直接使用它(尽管名称显示为单数,但它实际上包含,或者更确切地说链接到包含many证书的文件)并且以NSS格式在
/etc/pki/nssdb/*
中使用,这是curl
的RH包使用的默认情况下。因此,默认情况下,您的 curl
已使用与您可以从 Java cacerts
文件获取的相同证书,因此这项工作根本不会完成任何任务。--cacert
时,您需要指定证书 - 例如 -
/tmp/ca.crt
来自文档--cacert (HTTPS) 告诉curl 使用指定的证书文件来验证对等方。该文件可能包含多个 CA 证书。这
证书必须采用 PEM 格式。如果多次使用此选项
次,将使用最后一次。--capath (HTTPS) 告诉curl 使用指定的证书目录来验证对等点。证书必须是 PEM 格式,并且 目录必须已使用提供的 c_rehash 实用程序进行处理 与 openssl。 Windows 下不支持证书目录 (因为 c_rehash 使用符号链接来创建它们)。使用--capath 可以让curl建立https连接比 如果 --cacert 文件包含许多 CA 证书,则使用 --cacert。如果 该选项会使用多次,最后一次将被使用。
因此,如果您指定
--cacert
,CA 证书将存储在指定的文件中。这些 CA 证书用于验证 cURL 连接到的远程服务器的证书。
--capath
选项用于指定包含CA证书的目录而不是单个文件。
使用
openssl
$ openssl pkcs12 -in my-keystore.p12 -out my-keystore.pem -passin pass:${keystorePassword} -passout pass:${myPemPassword}
$ curl --cert my-keystore.pem:${myPemPassword} "https://example.com"
其中
${myPemPassword}
是您选择的任何内容(即它不必匹配
${keystorePassword}
。