【问题标题】:Export java ca certificate so that it is usable from go导出 java ca 证书,以便它可以从 go 中使用
【发布时间】:2020-12-27 18:31:18
【问题描述】:

我需要将java服务与go app集成,可以配置指定检查TLS时使用的CA证书文件。我不熟悉go。 Java REST 端点使用自签名证书进行保护。

我正在尝试像这样使用keytool 导出它:

keytool -export -alias rootca -file ca.crt -keystore cacerts

ca.crt 文件可以通过 keytool 本身的命令检查:

keytool -printcert -v -file ca.crt

现在,当我尝试在 go 应用程序中使用此文件时,即 prometheus,通过将 tls_config 和指向导出文件的 ca_cert 值传递给我得到一个错误:

err="创建 HTTP 客户端时出错:无法使用指定的 CA 证书 /etc/prometheus/ssl/ca.crt"

Prometheus 使用 go 的标准 crypto/tls 所以我的问题是:

  • 我导出 Java 文件的方式是否正确且可用?
  • 如何将导出的 Java CA 文件转换为 Go 能够理解和使用的格式?

【问题讨论】:

  • 证书可能是二进制格式。如果它不包含可读的标题(只需使用文本编辑器打开它),您需要将其转换为 PEM:openssl x509 -in cert.cer -out cert.pem
  • @Marc 是的,它是二进制的,但是建议的命令不起作用。它失败了4654165440:error:0909006C:PEM routines:get_name:no start line:crypto/pem/pem_lib.c:745:Expecting: TRUSTED CERTIFICATE
  • 您可以告诉 openssl 实际输入格式:openssl x509 -in cert.cer -out cert.pem -inform DER,甚至可以选择使用-outform PEM 输出格式。您也可以尝试将-rfc 选项改为keytool -printcert 以PEM 格式输出。

标签: java go ssl


【解决方案1】:

根据keytool 的手册页,在-exportcert 命令下:

证书默认以二进制编码输出。

有问题的编码是DER,它是证书数据的二进制表示。

但是,Go 标准库需要 PEM 编码,它只是 DER 数据的 base64 加上一些页眉/页脚。

你有(至少)两个选择:

告诉keytool 以 PEM 格式导出

这是通过使用-exportcerts 命令的-rfc 标志来完成的。根据手册页:

如果指定了 -rfc 选项,则 printable 中的输出 由 Internet RFC 1421 证书编码定义的编码格式 标准。

RFC1421 是用于 PEM 的。

从 DER 转换为 PEM

这可以通过以下方式使用 openssl 来完成:

openssl -in exported_file.der -inform DER -out ca.crt

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 2019-12-19
    • 2020-08-23
    • 2019-10-10
    • 2020-11-06
    • 2015-09-18
    相关资源
    最近更新 更多