当前位置: 首页 > 知识库问答 >
问题:

Terraform自签名证书Openssl验证失败

杜俊逸
2023-03-14

我试图使用Terraform创建一个自签名证书,以便在测试/开发环境中内部使用。

我首先创建一个CA私钥,自签名证书。

然后,为要启用HTTPS的内部域名创建证书签名请求和私钥。

然后我在证书上签字。以下是我使用的整个Terraform清单:

resource "tls_private_key" "ca" {
  algorithm = "ECDSA"
  ecdsa_curve = "P384"
}

resource "tls_self_signed_cert" "ca" {
  key_algorithm = "${tls_private_key.ca.algorithm}"
  private_key_pem = "${tls_private_key.ca.private_key_pem}"

  subject {
    common_name = "Example CA"
    organization = "Example, Ltd"
    country = "GB"
  }

  validity_period_hours = 43800
  is_ca_certificate = true

  allowed_uses = [
    "key_encipherment",
    "digital_signature",
    "server_auth",
    "client_auth",
  ]
}

resource "tls_private_key" "registry" {
  algorithm = "ECDSA"
  ecdsa_curve = "P384"
}

resource "tls_cert_request" "registry" {
  key_algorithm = "${tls_private_key.registry.algorithm}"
  private_key_pem = "${tls_private_key.registry.private_key_pem}"

  subject {
    common_name = "registry.test.example.com"
    organization = "Example, Ltd"
    country = "GB"
  }

  dns_names = ["registry.test.example.com"]
}

resource "tls_locally_signed_cert" "registry" {
  cert_request_pem = "${tls_cert_request.registry.cert_request_pem}"

  ca_key_algorithm = "${tls_private_key.ca.algorithm}"
  ca_private_key_pem = "${tls_private_key.ca.private_key_pem}"
  ca_cert_pem = "${tls_self_signed_cert.ca.cert_pem}"

  validity_period_hours = 43800

  allowed_uses = [
    "key_encipherment",
    "digital_signature",
    "server_auth",
    "client_auth",
  ]
}

我查了Terraform舱单。然后我从状态文件中提取生成的证书并将它们保存到文件中。

我试图用openssl验证最终证书,但得到一个错误:

$ openssl verify -CAfile ca-cert.pem registry.pem 
registry.pem: C = GB, ST = , L = , postalCode = , O = "Example, Ltd", OU = , CN = registry.example.com
error 20 at 0 depth lookup:unable to get local issuer certificate

你知道问题出在哪里吗?我花了很多时间想弄清楚这一点。

基本上,我想用它来为我的测试/开发环境中的私有Docker注册表启用HTTPS。

共有1个答案

慎志国
2023-03-14

您需要将cert_signing添加到tls_private_key.ca.allowed_uses:

resource "tls_self_signed_cert" "ca" {
  key_algorithm = "${tls_private_key.ca.algorithm}"
  private_key_pem = "${tls_private_key.ca.private_key_pem}"

  subject {
    common_name = "Example CA"
    organization = "Example, Ltd"
    country = "GB"
  }

  validity_period_hours = 43800
  is_ca_certificate = true

  allowed_uses = [
    "key_encipherment",
    "digital_signature",
    "server_auth",
    "client_auth",
    "cert_signing"
  ]
}

参见:https://www.terraform.io/docs/providers/tls/r/self_signed_cert.html#cert_signing

 类似资料:
  • 我想创建一个签名并使用openssl验证它。我想有我的签名的十六进制输出。 这是我的密码 我得到这个错误: 如果我在创建签名的过程中删除了-hex,它就可以工作了。

  • 我的手被https、ssl、PKI之类的东西弄得脏兮兮的。对于自签名证书,有一点我不太理解。假设我想创建一个自签名证书,并在我们想要建立安全连接时将其发送给我的朋友。 所以步骤是: 创建一个私钥。 创建一个公钥。 用我的公钥在证书上签名。 因此,当我的朋友得到我的证书时,他必须验证他得到的证书是我的,他需要解密数字签名。但为了解密和验证他必须拥有我的私钥。所以,我有点困惑。

  • 我正在用以下组件构建自己的证书链: 根证书是自签名证书,中间证书由根证书和用户由中间证书签名。 现在我想验证一个用户证书是否有其根证书的锚。 具有 验证是可以的。在下一步中,我将使用 验证结果显示 什么是错的?

  • 我正在尝试使用公钥验证散列的ECDSA签名。我写了一个小的围棋程序,成功地做到了这一点,但是我不能把它移植到C语言中。 这是我的输入数据: < li >公钥:< code > mfkwewyhkozizj 0 caqyikozij0 dackcdqgaedd 9 vxm phjv 4 vofo 0 zofplr r5 iczxquxsr 9 eka ouo 9 b 7 wl 1 daggi 0 e

  • 我正在为嵌入式Linux设备添加HTTPS支持。我尝试通过以下步骤生成自签名证书: 这是可行的,但我得到一些错误,例如,谷歌Chrome:

  • 我正在编写一些代码,试图对一些数据进行签名。在将openssl生成的私钥转换为Java密钥库之后,我将Java签名类与SHA256withRSA一起使用。我试图确认openssl中Java类返回的签名,但由于某些原因,我无法让openssl进行验证。我最终需要在iOS Swift 3中实现这个签名验证,但在找到库之前,我想尝试根据openssl标准检查Java签名。 例如,我从我们的登录服务器得到