OpenSSL

密码学和SSL/TLS工具包

openssl-pkeyutl

名称

openssl-pkeyutl - 公钥算法命令

语法

openssl pkeyutl [-help] [-in 文件] [-rawin] [-digest 算法] [-out 文件] [-sigfile 文件] [-inkey 文件名|uri] [-keyform DER|PEM|P12|ENGINE] [-passin 参数] [-peerkey 文件] [-peerform DER|PEM|P12|ENGINE] [-pubin] [-certin] [-rev] [-sign] [-verify] [-verifyrecover] [-encrypt] [-decrypt] [-derive] [-kdf 算法] [-kdflen 长度] [-pkeyopt 选项:] [-pkeyopt_passin 选项[:密码参数]] [-hexdump] [-asn1parse] [-engine id] [-engine_impl] [-rand 文件] [-writerand 文件] [-provider 名称] [-provider-path 路径] [-propquery 属性查询] [-config 配置文件]

描述

此命令可用于使用任何支持的算法执行低级公钥操作。

选项

-help

打印用法信息。

-in 文件名

指定要从中读取数据的输入文件名,如果没有指定此选项,则为标准输入。

-rawin

这表示输入数据是原始数据,未经过任何消息摘要算法哈希处理。用户可以使用-digest选项指定摘要算法。此选项仅可与-sign-verify一起使用,并且必须与Ed25519和Ed448算法一起使用。

-digest 算法

指定用于在使用输入密钥签名或验证输入数据之前对其进行哈希处理的摘要算法。如果签名算法不需要摘要算法,则可以省略此选项(例如,EdDSA)。如果省略此选项但签名算法需要摘要算法,则将使用默认值。对于RSA、DSA和ECDSA等签名算法,SHA-256将是默认的摘要算法。对于SM2,它将是SM3。如果存在此选项,则必须同时指定-rawin选项。

-out 文件名

指定要写入的输出文件名,默认为标准输出。

-sigfile 文件

签名文件,仅在-verify操作中需要

-inkey 文件名|uri

输入密钥,默认情况下应为私钥。

-keyform DER|PEM|P12|ENGINE

密钥格式;默认为未指定。有关详细信息,请参阅openssl-format-options(1)

-passin 参数

输入密钥密码源。有关参数格式的更多信息,请参阅openssl-passphrase-options(1)

-peerkey 文件

对等密钥文件,由密钥派生(协商)操作使用。

-peerform DER|PEM|P12|ENGINE

对等密钥格式;默认为未指定。有关详细信息,请参阅openssl-format-options(1)

-pubin

默认情况下,从密钥输入读取私钥。使用此选项,将改为读取公钥。如果输入不包含公钥但包含私钥,则使用其公钥部分。

-certin

输入是一个包含公钥的证书。

-rev

反转输入缓冲区的顺序。这对于某些库(如CryptoAPI)有用,这些库以小端格式表示缓冲区。

-sign

对输入数据(必须是哈希值)进行签名并输出签名结果。这需要私钥。

-verify

针对签名文件验证输入数据(必须是哈希值),并指示验证成功或失败。

-verifyrecover

验证输入数据(必须是哈希值)并输出恢复的数据。

-encrypt

使用公钥加密输入数据。

-decrypt

使用私钥解密输入数据。

-derive

使用对等密钥派生共享密钥。

-kdf 算法

使用密钥派生函数算法。目前支持的算法为TLS1-PRFHKDF。注意:通常必须为此设置其他参数和KDF输出长度才能使其正常工作。有关每个算法支持的字符串参数,请参阅EVP_PKEY_CTX_set_hkdf_md(3)EVP_PKEY_CTX_set_tls1_prf_md(3)

-kdflen 长度

设置KDF的输出长度。

-pkeyopt 选项:

指定为选项:值的公钥选项。有关更多详细信息,请参阅下面的注释。

-pkeyopt_passin 选项[:密码参数]

允许从标准输入或密码源读取公钥选项选项。如果仅指定选项,则系统将提示用户在标准输入中输入密码。或者,可以指定密码参数,它可以是openssl-passphrase-options(1)支持的任何值。

-hexdump

十六进制转储输出数据。

-asn1parse

解析ASN.1输出数据,这在与-verifyrecover选项结合使用时很有用,此时ASN1结构已签名。

-engine id

请参阅openssl(1)中的“引擎选项”。此选项已弃用。

-engine_impl

-engine选项一起使用时,它还指定对加密操作使用引擎id

-rand 文件-writerand 文件

有关详细信息,请参阅openssl(1)中的“随机状态选项”

-provider 名称
-provider-path 路径
-propquery 属性查询

请参阅openssl(1)中的“提供程序选项”provider(7)property(7)

-config 配置文件

请参阅openssl(1)中的“配置选项”

注释

支持的操作和选项根据密钥算法及其实现而有所不同。OpenSSL操作和选项如下所示。

除非另有说明,否则所有算法都支持digest:alg选项,该选项指定用于签名、验证和verifyrecover操作的摘要。alg的值应表示EVP_get_digestbyname()函数中使用的摘要名称,例如sha1。此值不用于对输入数据进行哈希处理。它(由某些算法)用于检查传入数据长度的合理性,以及创建构成签名的结构(例如,RSASSA PKCS#1 v1.5签名中的DigestInfo)。

此命令不会对输入数据进行哈希处理(除非使用-rawin),而是直接将数据用作签名算法的输入。根据密钥类型、签名类型和填充模式,输入数据的最大可接受长度会有所不同。对于RSA,签名数据不能长于密钥模数。在ECDSA和DSA的情况下,数据不应长于字段大小,否则将被静默截断为字段大小。无论如何,输入大小不得大于最大支持的摘要大小。

换句话说,如果摘要的值为sha1,则输入应为SHA-1哈希函数输出的20字节长二进制编码。

RSA算法

RSA算法通常支持加密、解密、签名、验证和verifyrecover操作。但是,某些填充模式仅支持这些操作的子集。支持以下其他pkeyopt

rsa_padding_mode:模式

这设置RSA填充模式。模式的可接受值为pkcs1(用于PKCS#1填充)、none(用于无填充)、oaep(用于OAEP模式)、x931(用于X9.31模式)和pss(用于PSS)。

在PKCS#1填充中,如果未设置消息摘要,则直接对提供的签名数据进行签名或验证,而不是使用DigestInfo结构。如果设置了摘要,则使用DigestInfo结构,并且其长度必须与摘要类型相对应。

请注意,对于pkcs1填充,为了防止Bleichenbacher攻击,如果填充检查失败,解密将不会失败。使用none并手动检查解密后的消息以验证解密后的值是否具有正确的PKCS#1 v1.5填充。

对于oaep模式,仅支持加密和解密。

对于x931,如果设置了摘要类型,则将其用于格式化块数据,否则第一个字节将用于指定X9.31摘要ID。可以以这种模式执行签名、验证和verifyrecover。

对于pss模式,仅支持签名和验证,并且必须指定摘要类型。

rsa_pss_saltlen:长度

仅对于pss模式,此选项指定盐长度。支持三个特殊值:digest将盐长度设置为摘要长度,max将盐长度设置为最大允许值。在验证时,auto会导致根据PSS块结构自动确定盐长度。

rsa_mgf1_md:摘要

对于PSS和OAEP填充,设置MGF1摘要。如果未在PSS模式下显式设置MGF1摘要,则使用签名摘要。

rsa_oaep_md:摘要

设置用于OAEP哈希函数的摘要。如果未显式设置,则使用SHA1。

rsa_pkcs1_implicit_rejection:标志

禁用(设置为0)或启用(设置为1)与PKCS#1 v1.5解密一起使用隐式拒绝。启用时(默认情况下),为了防止Bleichenbacher攻击,库将生成一个确定性随机明文,如果填充检查失败,它将将其返回给调用方。禁用时,调用方有责任以无侧信道的方式处理返回的错误。

RSA-PSS算法

RSA-PSS算法是RSA算法的受限版本,它仅支持使用PSS填充的签名和验证操作。支持以下其他-pkeyopt

rsa_padding_mode:模式rsa_pss_saltlen:长度rsa_mgf1_md:摘要

这些与RSA算法具有相同的含义,但有一些额外的限制。填充模式只能设置为pss,这是默认值。

如果密钥具有参数限制,则摘要、MGF1摘要和盐长度将设置为参数中指定的值。摘要和MG不可更改,盐长度不可设置为小于最小限制的值。

DSA算法

DSA算法仅支持签名和验证操作。目前,除了digest之外,没有其他-pkeyopt选项。默认情况下假定使用SHA1摘要。

DH算法

DH算法仅支持派生操作,没有其他-pkeyopt选项。

EC算法

EC算法支持签名、验证和派生操作。签名和验证操作使用ECDSA,派生使用ECDH。对于-pkeyopt digest选项,默认情况下假定使用SHA1。

X25519和X448算法

X25519和X448算法仅支持密钥派生。目前没有其他选项。

ED25519和ED448算法

这些算法仅支持签名和验证。OpenSSL 仅实现了这些算法的“纯”变体,因此可以将原始数据直接传递给它们,而无需先对其进行哈希处理。必须与这些算法一起使用选项-rawin,并且未指定-digest。此外,OpenSSL 仅支持这些算法的“一次性”操作。这意味着必须先将要签名/验证的整个文件读入内存,然后才能对其进行处理。应避免对非常大的文件进行签名或验证。此外,必须知道文件的大小才能使其正常工作。如果无法确定文件的大小(例如,如果输入是 stdin),则签名或验证操作将失败。

SM2

SM2 算法支持签名、验证、加密和解密操作。对于签名和验证操作,SM2 需要传入一个区分 ID 字符串。支持以下-pkeyopt

distid:string

这设置了在 SM2 签名或验证操作中使用的 ID 字符串。在验证 SM2 签名时,ID 字符串必须与签名数据时使用的字符串相同。否则,验证将失败。

hexdistid:hex_string

这设置了在 SM2 签名或验证操作中使用的 ID 字符串。在验证 SM2 签名时,ID 字符串必须与签名数据时使用的字符串相同。否则,验证将失败。使用此选项提供的 ID 字符串应为有效的十六进制值。

示例

使用私钥对某些数据进行签名

openssl pkeyutl -sign -in file -inkey key.pem -out sig

恢复已签名的数据(例如,如果使用 RSA 密钥)

openssl pkeyutl -verifyrecover -in sig -inkey key.pem

验证签名(例如,DSA 密钥)

openssl pkeyutl -verify -in file -sigfile sig -inkey key.pem

使用消息摘要值对数据进行签名(目前仅对 RSA 有效)

openssl pkeyutl -sign -in file -inkey key.pem -out sig -pkeyopt digest:sha256

派生共享密钥值

openssl pkeyutl -derive -inkey key.pem -peerkey pubkey.pem -out secret

使用摘要SHA256和共享密钥以及由单个字节 0xFF 组成的种子,对 48 个字节的 TLS1 PRF 进行十六进制转储

openssl pkeyutl -kdf TLS1-PRF -kdflen 48 -pkeyopt md:SHA256 \
   -pkeyopt hexsecret:ff -pkeyopt hexseed:ff -hexdump

使用scrypt派生密钥,其中密码从命令行读取

openssl pkeyutl -kdf scrypt -kdflen 16 -pkeyopt_passin pass \
   -pkeyopt hexsalt:aabbcc -pkeyopt N:16384 -pkeyopt r:8 -pkeyopt p:1

使用相同的算法派生,但从环境变量 MYPASS 读取密钥

openssl pkeyutl -kdf scrypt -kdflen 16 -pkeyopt_passin pass:env:MYPASS \
   -pkeyopt hexsalt:aabbcc -pkeyopt N:16384 -pkeyopt r:8 -pkeyopt p:1

使用SM2(7)私钥和特定 ID 对某些数据进行签名

openssl pkeyutl -sign -in file -inkey sm2.key -out sig -rawin -digest sm3 \
   -pkeyopt distid:someid

使用SM2(7)证书和特定 ID 验证某些数据

openssl pkeyutl -verify -certin -in file -inkey sm2.cert -sigfile sig \
   -rawin -digest sm3 -pkeyopt distid:someid

使用带有 OAEP 填充和 SHA256 的私钥解密某些数据

openssl pkeyutl -decrypt -in file -inkey key.pem -out secret \
   -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256

另请参阅

openssl(1)openssl-genpkey(1)openssl-pkey(1)openssl-rsautl(1) openssl-dgst(1)openssl-rsa(1)openssl-genrsa(1)openssl-kdf(1) EVP_PKEY_CTX_set_hkdf_md(3)EVP_PKEY_CTX_set_tls1_prf_md(3)

历史

-engine选项在 OpenSSL 3.0 中已弃用。

版权所有 2006-2023 OpenSSL 项目作者。保留所有权利。

根据 Apache 许可证 2.0(“许可证”)许可。除非符合许可证,否则您不得使用此文件。您可以在源代码分发中的 LICENSE 文件或https://www.openssl.org/source/license.html中获得副本。