OpenSSL 生成不同类型的自签名证书

信息安全 tls 证书 openssl
2021-08-31 14:21:31

有谁知道如何使用 OpenSSL 为以下公钥类型生成证书:

  1. DSA - 用于DHE_DSS密钥交换。
  2. Diffie-Hellman - 用于DH_DSSDH_RSA密钥交换。
  3. ECDH - 用于ECDH_ECDSAECDH_RSA密钥交换。
  4. ECDSA - 用于ECDHE_ECDSA密钥交换。

我可以在网上找到的大部分内容都会教您如何生成 RSA 类型证书。

2个回答

(EC)DSA

对于 DSA 密钥对,请使用以下命令:

openssl dsaparam -out dsakey.pem -genkey 1024

其中“1024”是以位为单位的大小。第一个 DSA 标准要求大小必须是 64 的倍数,在 512..1024 范围内。然后另一个版本不推荐使用低于 1024 的大小,因此有效的 DSA 密钥大小的长度为 1024 位,仅此而已。当前版本指定有效 DSA 密钥的长度为 1024、2048 或 3072 位。OpenSSL 接受其他长度。如果要最大化互操作性,请使用 1024 位。

对于 ECDSA 密钥对,请使用:

openssl ecparam -genkey -out eckey.pem -name prime256v1

要查看 OpenSSL 支持哪些曲线名称,请使用: openssl ecparam -list_curves

(为了获得最佳的互操作性,请遵循 NIST 曲线 P-256,OpenSSL 以“prime256v1”的名称知道该曲线。)

拥有 DSA 或 ECDSA 密钥对后,您可以生成包含公钥并使用私钥签名的自签名证书:

openssl req -x509 -new -key dsakey.pem -out cert.pem

(将“dsakey.pem”替换为“eckey.pem”以使用上面生成的 EC 密钥。)


(EC)DH

对于 Diffie-Hellman(有或没有椭圆曲线),事情更复杂,因为 DH 不是签名算法:

  • 您将无法使用 DH 密钥生成自签名证书。
  • 您不能使用 DH 密钥对证书发出 PKCS#10 请求,因为 PKCS#10 请求应该是自签名的(此自签名用作所有权证明)。

虽然 OpenSSL具有颁发包含 DH 公钥的证书所需的支持;此页面可能包含指针。挑战在于说服命令行工具OpenSSL去做。在 OpenSSL 文档的丛林中,我还没有找到一个完整的方法来做到这一点。不过,密钥对很容易生成。

要使用 OpenSSL 命令行工具生成 DH 密钥对,您必须分两步完成:

openssl dhparam -out dhparam.pem 1024
openssl genpkey -paramfile dhparam.pem -out dhkey.pem

对于 ECDH 密钥对,请使用以下命令:

openssl ecparam -out ecparam.pem -name prime256v1
openssl genpkey -paramfile ecparam.pem -out ecdhkey.pem

但是,包含 ECDH 公钥的证书的格式恰好与包含 ECDSA 公钥的证书的格式完全相同;实际上,该格式包含“EC 公钥”,但没有指明预期的算法(ECDH 或 ECDSA)。因此,ECDSA 的任何私钥和证书(用于生成 ECDSA 签名的私钥、自签名证书或由任何其他 CA 签名的证书)都适用于 ECDH-* 密码套件。

我不知道如何使用 OpenSSL 命令行工具生成的一种情况是静态 Diffie-Hellman(非 EC)证书。但是请注意,OpenSSL 也不支持带有静态 DH 密码套件的 SSL/TLS,因此即使您可以生成证书,它也不适用于 OpenSSL。

(事实上​​,没有人在实践中使用静态 DH。)

只是挖掘一个老问题。我最近需要为测试目的创建一个 DH 证书。这是如何做到的。首先根据汤姆的回答创建 DH 参数和私钥:

openssl dhparam -out dhparam.pem 1024
openssl genpkey -paramfile dhparam.pem -out dhkey.pem

接下来创建公钥文件:

openssl pkey -in dhkey.pem -pubout -out dhpubkey.pem

现在您需要一个 CSR 文件。CSR 是自签名的,这显然不能用于 DH,因为 DH 不是签名算法。但是无论如何都要为不同的密钥创建一个(可以签名的密钥,例如 RSA)。要创建 RSA 密钥和关联的 CSR:

openssl genrsa -out rsakey.pem 1024
openssl req -new -key rsakey.pem -out rsa.csr

最后,您从 RSA CSR 和 DH 公钥生成 DH 证书。无法创建自签名 DH 证书,因为(如上所述)DH 不是签名算法。因此,您需要设置 CA 证书/密钥。在这个例子中,我假设你之前已经创建了一个 CAkey.pem 和 CAcert.pem:

openssl x509 -req -in rsa.csr -CAkey CAkey.pem -CA CAcert.pem -force_pubkey dhpubkey.pem -out dhcert.pem -CAcreateserial

您的 DH 证书将在 dhcert.pem