将密钥库与curl一起使用

问题描述 投票:0回答:3

我想执行下面的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?)
shell curl openshift redhat
3个回答
5
投票

正如 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
文件获取的相同证书,因此这项工作根本不会完成任何任务。
    


1
投票
--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证书的目录而不是单个文件。

    


0
投票

使用
    openssl
  • 将公钥和私钥导出到 .pem 文件
    在curl命令中使用.pem文件
  • 例如

$ 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}
    

© www.soinside.com 2019 - 2024. All rights reserved.