跳到主要内容
ecdsa.com
C · 命令行

LibreSSL

OpenBSD 的 LibreSSL,2014年从 OpenSSL 分出的分支,用于 OpenBSD 和 macOS 的系统工具:ECDSA 同为 DER 格式,密钥格式也相同;支持 Ed25519 但不支持 Ed448;通过自有 API 提供 ML-KEM;不支持 ML-DSA,也不支持 RFC 6979。
许可证
OpenSSL AND ISC
检查的版本
4.3.1 ·
源代码
github.com/libressl/portable
文档
man.openbsd.org/

兼容性概览

ECDSAEdDSA后量子

ECDSA 曲线
P-224P-256P-384P-521secp256k1brainpoolP256r1brainpoolP384r1brainpoolP512r1
EdDSA
Ed25519
公钥格式
spki-pemspki-derx509
私钥格式
pkcs8-pempkcs8-derencrypted-pkcs8sec1-pemsec1-der

LibreSSL 保留了大家熟悉的 OpenSSL libcrypto/libssl API 和命令行,同时删除了遗留代码,并新增了自己的 libtls。macOS 把一个较旧的 LibreSSL 用作系统密码库:在 macOS 27.0.1 上,/usr/bin/openssl version 输出 LibreSSL 3.3.6,ssh -V 显示的也是这个库。本页的事实基于 Alpine 3.24.2 的软件包 LibreSSL 4.3.1 检查得出(上游当时已发布 4.3.3),该软件包把命令安装为 libressl——除非添加兼容包,否则调用 openssl 的脚本会在那里失败。

ECDSA 的行为与 OpenSSL 的默认设置一致:DER 签名、随机 nonce、不做 low-S 规范化,验证时接受 high-S。与 OpenSSL 3.2+ 不同,它没有确定性的 RFC 6979 选项。对于原始 r‖s 签名,EVP_DigestVerify 返回 -1,命令行输出 Error Verifying Data,而针对其他数据的有效签名则输出 Verification Failure——注意它们的大小写与 OpenSSL 的消息不同,这会让用 grep 匹配确切文本的脚本失效。

曲线涵盖 P-224 到 P-521、secp256k1 和 Brainpool r1 曲线;Ed25519 通过 EVP_PKEY_ED25519 使用,完全没有 Ed448。密钥文件与 OpenSSL 互通:公钥使用 SPKI 和证书,私钥使用 PKCS#8(未加密和加密)和 SEC1;ecparam -genkey 写出的是 SEC1 EC PRIVATE KEY,因此当其他工具需要 PKCS#8 时,要像示例那样用 pkcs8 -topk8 转换。

后量子支持并不完整:ML-KEM-768 和 ML-KEM-1024 通过 LibreSSL 自己在 <openssl/mlkem.h> 中提供的 MLKEM_* 函数使用,而不是通过 EVP 或命令行;ML-DSA 则根本不存在(Algorithm ML-DSA-65 not found)。可以在后量子 KEM 工具中比较这些算法;如需 ML-DSA 签名,应使用 OpenSSL 3.5 或更高版本。

事实及其依据的检查

以下内容均非抄自文档。检查脚本 content/libraries/verify/libressl/run.sh 于2026年10月20日在容器镜像 alpine:3.24.2 中运行了 LibreSSL 4.3.1;本页内容必须与它的输出一致,每条事实都列出了对应的输出行。

  • ECDSA 签名编码

    der

    EVP_DigestSign 和 libressl dgst -sign 生成 ASN.1 DER。

    检查记录
    fact ecdsa-signature-encoding = der
  • ECDSA 的 nonce

    random

    随机 nonce:同一条消息的两个签名不同;没有确定性选项。

    检查记录
    fact ecdsa-nonce = random
  • 签名时的 low-S

    either

    s 没有经过规范化:64 个签名中出现了 high-S 值。

    检查记录
    fact ecdsa-low-s-sign = either
  • 验证时的 high-S

    accepts-high-s

    把 s 替换为 n − s 的 DER 签名验证通过。

    检查记录
    fact ecdsa-low-s-verify = accepts-high-s
  • 签名调用对哪些内容做哈希

    hashes-message-or-digest

    EVP_DigestSign 会先计算哈希;ECDSA_sign 对摘要签名,该签名针对原消息验证通过。

    检查记录
    fact ecdsa-prehash = hashes-message-or-digest
  • 格式错误的 ECDSA 签名

    returns-error

    对于原始 r‖s 签名和 3 字节的数据块,EVP_DigestVerify 都返回 -1。

    检查记录
    fact ecdsa-malformed-signature = returns-error
    evidence ecdsa-malformed-signature: EVP_DigestVerify returned -1 for raw r||s and -1 for 3 bytes
  • 验证失败时的输出

    distinguishable

    对于非 DER 签名,dgst -verify 输出 Error Verifying Data;对于针对其他数据的有效签名,则输出 Verification Failure。

    检查记录
    fact cli-verify-output = distinguishable
    evidence cli-verify-output: valid: Verified OK; 64 zero bytes: Error Verifying Data; valid signature over other data: Verification Failure
  • ECDSA 曲线

    P-224P-256P-384P-521secp256k1brainpoolP256r1brainpoolP384r1brainpoolP512r1

    P-224、P-256、P-384、P-521、secp256k1 和 brainpoolP256r1/P384r1/P512r1 的签名与验证均成功。

    检查记录
    fact ecdsa-curves = P-224, P-256, P-384, P-521, secp256k1, brainpoolP256r1, brainpoolP384r1, brainpoolP512r1
  • EdDSA

    Ed25519

    通过 EVP_PKEY_ED25519 支持 Ed25519;EVP_PKEY_ED448 未定义。

    检查记录
    fact eddsa = Ed25519
    evidence eddsa: EVP_PKEY_ED448 is not defined in the headers
  • 后量子算法

    ML-KEM

    ML-KEM-768 和 ML-KEM-1024 通过 MLKEM_* API 完成了往返测试;genpkey -algorithm ML-DSA-65 报错 Algorithm ML-DSA-65 not found。

    检查记录
    fact pqc = ML-KEM
    evidence pqc: ML-KEM rank 3: public key 1184 bytes, ciphertext 1088 bytes, round trip ok
    evidence pqc: ML-KEM rank 4: public key 1568 bytes, ciphertext 1568 bytes, round trip ok
    evidence pqc: genpkey -algorithm ML-DSA-65: Algorithm ML-DSA-65 not found
    evidence pqc: ML-KEM names in s_client help: none
  • 公钥格式

    spki-pemspki-derx509

    PEM 和 DER 格式的 SPKI 以及证书中的公钥,都验证通过了同一个签名。

    检查记录
    fact public-key-formats = spki-pem, spki-der, x509
  • 私钥格式

    pkcs8-pempkcs8-derencrypted-pkcs8sec1-pemsec1-der

    PEM 和 DER 格式的 PKCS#8、加密的 PKCS#8,以及 PEM 和 DER 格式的 SEC1 均签名成功;ecparam -genkey 写出的是 SEC1。

    检查记录
    fact private-key-formats = pkcs8-pem, pkcs8-der, encrypted-pkcs8, sec1-pem, sec1-der
    evidence private-key-formats: genpkey -algorithm EC: works
    evidence private-key-formats: ecparam -genkey writes -----BEGIN EC PRIVATE KEY-----

用法

用 libressl 命令创建 P-256 密钥,转换为 PKCS#8,签名并验证,再演示 Ed25519 可用而 ML-DSA 不可用。
# Alpine and some distributions install LibreSSL's tool as "libressl", not "openssl".
L=libressl
$L ecparam -name prime256v1 -genkey -noout -out key.pem   # SEC1 "EC PRIVATE KEY"
$L pkcs8 -topk8 -nocrypt -in key.pem -out key.p8.pem       # PKCS#8 for other tools
$L pkey -in key.pem -pubout -out pub.pem

printf 'order #1042 approved' > msg.txt
$L dgst -sha256 -sign key.p8.pem -out sig.der msg.txt
$L dgst -sha256 -verify pub.pem -signature sig.der msg.txt

# Ed25519 works; ML-DSA does not exist in LibreSSL.
$L genpkey -algorithm ED25519 -out ed.pem && echo "Ed25519 key: $(head -1 ed.pem)"
$L genpkey -algorithm ML-DSA-65 2>&1 | grep -i "not found"

代码片段测试工具会在容器镜像 alpine:3.24.2 中原样运行每个示例,只要输出不匹配,运行就会失败。

环境准备
apk add --no-cache -q libressl=4.3.1-r0 >/dev/null
命令
OPENSSL_CONF=/dev/null sh usage.sh
输出必须匹配(正则表达式)
Verified OK\nEd25519 key: -----BEGIN PRIVATE KEY-----\nAlgorithm ML-DSA-65 not found

库