Zum Inhalt

openssl: FFI-basierte OpenSSL-Anbindung für nginx-module-lua

Installation

Wenn Sie kein RPM-Repository-Abonnement eingerichtet haben, registrieren Sie sich. Danach können Sie mit den folgenden Schritten fortfahren.

CentOS/RHEL 7 oder Amazon Linux 2

yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install lua-resty-openssl

CentOS/RHEL 8+, Fedora Linux, Amazon Linux 2023

dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install lua5.1-resty-openssl

Um diese Lua-Bibliothek mit NGINX zu verwenden, stellen Sie sicher, dass nginx-module-lua installiert ist.

Dieses Dokument beschreibt lua-resty-openssl v1.9.0, veröffentlicht am 14. August 2026.


FFI-basierte OpenSSL-Anbindung für LuaJIT, die OpenSSL 3, 4 und die 1.1.1-Serie unterstützt.

Die Unterstützung für OpenSSL 1.1.0, 1.0.2 und BoringSSL wurde eingestellt, ist aber weiterhin im 0.x-Zweig verfügbar.

Build Status luarocks opm

Beschreibung

lua-resty-openssl ist eine FFI-basierte OpenSSL-Anbindungsbibliothek, die derzeit OpenSSL 3.x, 4.x und die 1.1.1-Serie unterstützt.

Überblick

Diese Bibliothek ist stark von luaossl inspiriert und verwendet eine Namenskonvention, die näher an der ursprünglichen OpenSSL-API liegt. Zum Beispiel wird eine Funktion namens X509_set_pubkey in der OpenSSL-C-API als resty.openssl.x509:set_pubkey bereitgestellt. CamelCase wird durch underscore_case ersetzt, zum Beispiel wird X509_set_serialNumber zu resty.openssl.x509:set_serial_number. Ein weiterer Unterschied zu luaossl ist, dass Fehler nie mit error() geworfen werden, sondern stattdessen als letzter Parameter zurückgegeben werden.

Jede von new() zurückgegebene Lua-Tabelle enthält ein cdata-Objekt ctx. Benutzer sollen nicht manuell ffi.gc setzen oder den entsprechenden Destruktor der ctx-Struktur aufrufen (wie die Funktionen *_free).

resty.openssl

Dieses Meta-Modul bietet eine Versions-Integritätsprüfung gegen die verknüpfte OpenSSL-Bibliothek.

openssl.load_library

Syntax: name, err = openssl.load_library()

Versucht, die OpenSSL-Shared-Libraries zu laden. Diese Funktion probiert einige bekannte Bibliotheksnamensmuster aus und gibt den Namen der crypto-Bibliothek zurück, wenn sie erfolgreich geladen wurde, oder einen Fehler, falls einer auftritt.

Wenn Sie innerhalb der resty-CLI oder OpenResty mit aktiviertem SSL laufen, ist der Aufruf dieser Funktion nicht notwendig.

openssl.load_modules

Syntax: openssl.load_modules()

Lädt alle verfügbaren Untermodule in das aktuelle Modul:

  bn = require("resty.openssl.bn"),
  cipher = require("resty.openssl.cipher"),
  digest = require("resty.openssl.digest"),
  hmac = require("resty.openssl.hmac"),
  kdf = require("resty.openssl.kdf"),
  pkey = require("resty.openssl.pkey"),
  objects = require("resty.openssl.objects"),
  rand = require("resty.openssl.rand"),
  version = require("resty.openssl.version"),
  x509 = require("resty.openssl.x509"),
  altname = require("resty.openssl.x509.altname"),
  chain = require("resty.openssl.x509.chain"),
  csr = require("resty.openssl.x509.csr"),
  crl = require("resty.openssl.x509.crl"),
  extension = require("resty.openssl.x509.extension"),
  extensions = require("resty.openssl.x509.extensions"),
  name = require("resty.openssl.x509.name"),
  store = require("resty.openssl.x509.store"),
  ssl = require("resty.openssl.ssl"),
  ssl_ctx = require("resty.openssl.ssl_ctx"),

Ab OpenSSL 3.0 sind auch provider, mac und ctx verfügbar.

openssl.luaossl_compat

Syntax: openssl.luaossl_compat()

Stellt eine luaossl-artige API bereit, die die camelCase-Benennung verwendet; Benutzer können einen Drop-in-Ersatz erwarten.

Zum Beispiel wird pkey:get_parameters auf pkey:getParameters abgebildet.

Beachten Sie, dass nicht die gesamte luaossl-API implementiert wurde. Bitte lesen Sie die README als maßgebliche Quelle.

openssl.get_fips_mode

Syntax: enabled = openssl.get_fips_mode()

Gibt einen booleschen Wert zurück, der angibt, ob der FIPS-Modus aktiviert ist.

openssl.set_fips_mode

Syntax: ok, err = openssl.set_fips_mode(enabled)

Schaltet den FIPS-Modus ein oder aus.

lua-resty-openssl unterstützt die folgenden Modi:

OpenSSL 1.0.2-Serie mit fips 2.0-Modul

Kompilieren Sie das Modul gemäß der Sicherheitsrichtlinie,

OpenSSL 3 FIPS-Provider

Siehe https://wiki.openssl.org/index.php/OpenSSL_3.0 Abschnitt 7. Kompilieren Sie den Provider gemäß der Anleitung, installieren Sie die fipsmodule.cnf, die zum Hash des FIPS-Providers fips.so passt.

Ab OpenSSL 3.0 aktiviert und deaktiviert diese Funktion auch die Standard- Eigenschaften für EVP-Funktionen. Wenn aktiviert, werden alle Anwendungen, die die EVP_*-API verwenden, auf FIPS-konforme Implementierungen umgeleitet und haben keinen Zugriff auf nicht-FIPS-konforme Algorithmen.

Der Aufruf dieser Funktion entspricht dem Laden des fips-Providers und dem Aufruf von openssl.set_default_properties("fips=yes").

Wenn der FIPS-Provider geladen ist, aber die Standardeigenschaften nicht gesetzt sind, verwenden Sie Folgendes, um explizit die FIPS-Implementierung abzurufen.

local provider = require "resty.openssl.provider"
assert(provider.load("fips"))
local cipher = require "resty.openssl.cipher"
local c = assert(cipher.new("aes256"))
print(c:get_provider_name()) -- gibt "default" aus
local c = assert(cipher.new("aes256", "fips=yes"))
print(c:get_provider_name()) -- gibt "fips" aus

openssl.get_fips_version_text

Syntax: text, err = openssl.get_fips_version_text()

Gibt den Versionsstring des FIPS-Moduls zurück. Verfügbar ab OpenSSL 3.0.

openssl.set_default_properties

Syntax: ok, err = openssl.set_default_properties(props)

Setzt die Standardeigenschaften für alle zukünftigen EVP-Algorithmusabrufe, implizit wie explizit. Siehe "ALGORITHM FETCHING" in crypto(7) für Informationen über implizites und explizites Abrufen.

openssl.list_cipher_algorithms

Syntax: ret = openssl.list_cipher_algorithms(hide_provider?)

Gibt verfügbare Cipher-Algorithmen in einem Array zurück. Setzen Sie hide_provider auf true, um den Providernamen aus dem Ergebnis zu entfernen.

openssl.list_digest_algorithms

Syntax: ret = openssl.list_digest_algorithms(hide_provider?)

Gibt verfügbare Digest-Algorithmen in einem Array zurück. Setzen Sie hide_provider auf true, um den Providernamen aus dem Ergebnis zu entfernen.

openssl.list_mac_algorithms

Syntax: ret = openssl.list_mac_algorithms(hide_provider?)

Gibt verfügbare MAC-Algorithmen in einem Array zurück. Setzen Sie hide_provider auf true, um den Providernamen aus dem Ergebnis zu entfernen.

openssl.list_kdf_algorithms

Syntax: ret = openssl.list_kdf_algorithms(hide_provider?)

Gibt verfügbare KDF-Algorithmen in einem Array zurück. Setzen Sie hide_provider auf true, um den Providernamen aus dem Ergebnis zu entfernen.

openssl.list_ssl_ciphers

Syntax: cipher_string, err = openssl.list_ssl_ciphers(cipher_list?, ciphersuites?, protocol?)

Gibt die Standard-SSL-Cipher als Zeichenkette zurück. cipher_list (vor TLSv1.3) und ciphersuites (TLSv1.3) können verwendet werden, um die Cipher-Einstellungen zu erweitern, die zu protocol passen. OpenSSL 4.x lehnt "SSLv3" ab, da die SSLv3-Unterstützung entfernt wurde.

openssl.list_ssl_ciphers()
openssl.list_ssl_ciphers("ECDHE-ECDSA-AES128-SHA")
openssl.list_ssl_ciphers("ECDHE-ECDSA-AES128-SHA", nil, "TLSv1.2")
openssl.list_ssl_ciphers("ECDHE-ECDSA-AES128-SHA", "TLS_CHACHA20_POLY1305_SHA256", "TLSv1.3")

resty.openssl.ctx

Ein Modul zur Bereitstellung von OSSL_LIB_CTX-Kontextwechseln.

OSSL_LIB_CTX ist ein interner OpenSSL-Bibliothekskontexttyp. Anwendungen können einen eigenen zuweisen, können aber auch NULL verwenden, um einen Standardkontext mit Funktionen zu verwenden, die ein OSSL_LIB_CTX-Argument akzeptieren.

Siehe OSSL_LIB_CTX.3 für tiefere Lektüre.

Der Kontext wirkt sich derzeit auf folgende Module aus:

Dieses Modul ist ab OpenSSL 3.0 verfügbar.

ctx.new

Syntax: ok, err = ctx.new(request_context_only?, conf_file?)

Erstellt einen neuen Kontext und verwendet ihn als Standardkontext für dieses Modul. Wenn request_context_only auf true gesetzt ist, wird der Kontext nur innerhalb des aktuellen Request-Kontexts verwendet. conf_file kann optional eine OpenSSL-Konfigurationsdatei angeben, um den Kontext zu erstellen.

Der erstellte Kontext wird automatisch mit seinem angegebenen Lebenszyklus freigegeben.

-- initialisiert eine AES-Cipher-Instanz nur aus der angegebenen Provider-Implementierung
-- für den aktuellen Request, ohne andere Teile des Codes zu beeinträchtigen
-- oder zukünftige Requests daran zu hindern, denselben Algorithmus zu verwenden.
assert(require("resty.openssl.ctx").new(true))
local p = assert(require("resty.openssl.provider").load("myprovider"))
local c = require("resty.openssl.cipher").new("aes256")
print(c:encrypt(string.rep("0", 32), string.rep("0", 16), "🦢"))
-- Provider und ctx müssen nicht freigegeben werden, sie werden automatisch vom GC erfasst

ctx.free

Syntax: ctx.free(request_context_only?)

Gibt den Kontext frei, der zuvor von ctx.new erstellt wurde.

resty.openssl.err

Ein Modul zur Bereitstellung von Fehlermeldungen.

err.format_error

Syntax: msg = err.format_error(ctx_msg?, return_code?, all_errors?)

Syntax: msg = err.format_all_errors(ctx_msg?, return_code?)

Gibt die letzte Fehlermeldung vom letzten Fehlercode zurück. Fehler werden formatiert als:

[ctx_msg]: https://github.com/fffonion/lua-resty-openssl/blob/1.9.0/code: [return_code]: error:[error code]:[library name]:[func name]:[reason string]:[file name]:[line number]:

Für OpenSSL-Versionen vor 3.0 werden Fehler formatiert als:

[ctx_msg]: https://github.com/fffonion/lua-resty-openssl/blob/1.9.0/code: [return_code]: [file name]:[line number]:error:[error code]:[library name]:[func name]:[reason string]:

Wenn all_errors auf true gesetzt ist, werden alle Fehler, nicht nur der letzte, in einer einzigen Zeichenkette zurückgegeben. Alle Fehler, die von dieser Bibliothek intern geworfen werden, werfen nur den letzten Fehler.

Zum Beispiel:

local f = io.open("t/fixtures/ec_key_encrypted.pem"):read("*a")
local privkey, err = require("resty.openssl.pkey").new(f, {
    format = "PEM",
    type = "pr",
    passphrase = "wrongpasswrod",
})
ngx.say(err)
-- pkey.new:load_key: error:4800065:PEM routines:PEM_do_header:bad decrypt:crypto/pem/pem_lib.c:467:

err.get_last_error_code

Syntax: code = err.get_last_error_code()

Gibt den letzten Fehlercode zurück.

err.get_lib_error_string

Syntax: lib_error_message = err.get_lib_error_string(code?)

Gibt den Bibliotheksnamen des letzten Fehlercodes als Zeichenkette zurück. Wenn code gesetzt ist, geben Sie den Bibliotheksnamen zurück, der dem angegebenen Fehlercode entspricht.

err.get_reason_error_string

Syntax: reason_error_message = err.get_reason_error_string(code?)

Gibt den Grund des letzten Fehlercodes als Zeichenkette zurück. Wenn code gesetzt ist, geben Sie den Grund zurück, der dem angegebenen Fehlercode entspricht.

resty.openssl.version

Ein Modul zur Bereitstellung von Versionsinformationen.

resty.openssl.provider

Modul zur Interaktion mit Providern. Dieses Modul funktioniert nur mit OpenSSL 3.0 oder höher.

provider.load

Syntax: pro, err = provider.load(name, try?)

Lädt den Provider mit name. Wenn try auf true gesetzt ist, deaktiviert OpenSSL die Fallback-Provider nicht, wenn der Provider nicht geladen und initialisiert werden kann. Wenn der Provider jedoch erfolgreich geladen wird, werden die Fallback-Provider deaktiviert.

Standardmäßig lädt diese Funktion den Provider in den Standardkontext, was bedeutet, dass er sich auf andere Anwendungen im selben Prozess auswirkt, die ebenfalls den Standardkontext verwenden. Wenn ein solches Verhalten nicht gewünscht ist, erwägen Sie die Verwendung von ctx, um den Provider nur auf einen begrenzten Bereich zu laden.

provider.istype

Syntax: ok = pkey.provider(table)

Gibt true zurück, wenn die Tabelle eine Instanz von provider ist. Gibt andernfalls false zurück.

provider.is_available

Syntax: ok, err = provider.is_available(name)

Prüft, ob ein benannter Provider für die Verwendung verfügbar ist.

provider.set_default_search_path

Syntax: ok, err = provider.set_default_search_path(name)

Legt den Standard-Suchpfad fest, der für die Suche nach Providern verwendet wird.

provider:unload

Syntax: ok, err = pro:unload(name)

Entlädt einen Provider, der zuvor von provider.load geladen wurde.

provider:self_test

Syntax: ok, err = pro:self_test(name)

Führt die Selbsttests eines Providers auf Abruf aus. Wenn die Selbsttests fehlschlagen, wird der Provider keine weiteren Dienste und Algorithmen bereitstellen.

provider:get_params

Syntax: ok, err = pro:get_params(key1, key2?...)

Gibt einen oder mehrere Provider-Parameterwerte zurück.

local pro = require "resty.openssl.provider"

local p = pro.load("default")

local name = assert(p:get_params("name"))
print(name)
-- gibt "OpenSSL Default Provider" aus

local result = assert(p:get_params("name", "version", "buildinfo", "status"))
print(require("cjson").encode(result))
-- gibt Provider-Metadaten aus; version und buildinfo variieren je nach OpenSSL-Release

resty.openssl.pkey

Modul zur Interaktion mit privaten und öffentlichen Schlüsseln (EVP_PKEY).

Jeder Schlüsseltyp unterstützt möglicherweise nur einen Teil der Operationen:

Schlüsseltyp Vorhandenen Schlüssel laden Schlüsselerzeugung Verschlüsseln/Entschlüsseln Signieren/Verifizieren Schlüsselaustausch Verkapseln/Entkapseln
RSA Y Y Y Y Y (RSASVE, OpenSSL 3.5+)
DH Y Y Y
EC Y Y Y (ECDSA) Y (ECDH) Y (DHKEM, OpenSSL 3.5+)
Ed25519 Y Y Y (PureEdDSA)
X25519 Y Y Y (ECDH) Y (DHKEM, OpenSSL 3.5+)
Ed448 Y Y Y (PureEdDSA)
X448 Y Y Y (ECDH) Y (DHKEM, OpenSSL 3.5+)
ML-DSA (OpenSSL 3.5+) Y Y Y
SLH-DSA (OpenSSL 3.5+) Y Y Y
ML-KEM (OpenSSL 3.5+) Y Y Y
ML-KEM TLS-Hybrid (OpenSSL 3.5+) Providerabhängig Y Y

Eine direkte Unterstützung für Ver- und Entschlüsselung für EC und ECX existiert nicht, aber Prozesse wie ECIES sind mit pkey:derive, kdf und cipher möglich.

pkey.new

Vorhandenen Schlüssel laden

Syntax: pk, err = pkey.new(string, opts?)

Unterstützt das Laden eines privaten oder öffentlichen Schlüssels im PEM-, DER- oder JWK-Format, das als erstes Argument string übergeben wird.

Der zweite Parameter opts akzeptiert eine optionale Tabelle, um das Schlüsselladeverhalten einzuschränken.

  • opts.format: setzen Sie explizit "PEM", "DER", "JWK", um ein bestimmtes Format zu laden, oder "*" für automatische Erkennung
  • opts.type: setzen Sie explizit "pr" für einen privaten Schlüssel, "pu" für einen öffentlichen Schlüssel; setzen Sie "*" für automatische Erkennung

Beim Laden eines PEM-kodierten RSA-Schlüssels kann es sich entweder um einen PKCS#8-kodierten SubjectPublicKeyInfo/PrivateKeyInfo oder einen PKCS#1-kodierten RSAPublicKey/RSAPrivateKey handeln.

Beim Laden eines verschlüsselten PEM-kodierten Schlüssels kann die passphrase zum Entschlüsseln entweder in opts.passphrase oder opts.passphrase_cb gesetzt werden:

pkey.new(pem_or_der_text, {
  format = "*", -- Auswahl von "PEM", "DER", "JWK" oder "*" für automatische Erkennung
  type = "*", -- Auswahl von "pr" für privaten Schlüssel, "pu" für öffentlichen Schlüssel und "*" für automatische Erkennung
  passphrase = "secret password", -- die PEM-Verschlüsselungspassphrase
  passphrase_cb = function()
    return "secret password"
  end, -- die PEM-Verschlüsselungspassphrase-Callback-Funktion
}

Beim Laden von JWK gibt es einige Einschränkungen: - Stellen Sie sicher, dass der kodierte JSON-Text übergeben wird; er muss base64-dekodiert worden sein. - Die Einschränkung von opts.type für JWK-Schlüssel erfordert OpenSSL 3.0 oder höher und lua-resty-openssl 1.6.0 oder höher. Mit OpenSSL 1.1.1 oder älteren lua-resty-openssl-Releases entscheiden die Parameter im bereitgestellten JSON, ob ein privater oder öffentlicher Schlüssel geladen wird; die Angabe von type führt zu einem Fehler; auch der öffentliche Schlüsselteil für OKP-Schlüssel (der x-Parameter) wird nicht berücksichtigt und aus dem privaten Schlüsselteil (der d-Parameter) abgeleitet, falls dieser angegeben ist. - Es werden nur die Schlüsseltypen RSA, P-256, P-384 und P-512 EC, Ed25519, X25519, Ed448 und X448 OKP unterstützt. - Signaturen und Verifikationen müssen die Option ecdsa_use_raw verwenden, um mit JWS-Standards zu funktionieren für EC-Schlüssel. Siehe pkey:sign und pkey.verify für Details. - Wenn Sie außerhalb von OpenResty laufen, müssen Sie eine JSON-Bibliothek (cjson oder dkjson) und basexx installieren.

Schlüsselerzeugung

Syntax: pk, err = pkey.new(config?)

Erzeugt einen neuen öffentlichen oder privaten Schlüssel.

Um einen RSA-Schlüssel zu erzeugen, kann die Tabelle config die Felder bits und exp enthalten, um die Schlüsselerzeugung zu steuern. Wenn config weggelassen wird, erzeugt diese Funktion einen 2048-Bit-RSA-Schlüssel mit exponent von 65537, was äquivalent ist zu:

local key, err = pkey.new({
  type = 'RSA',
  bits = 2048,
  exp = 65537
})

Um einen EC- oder DH-Schlüssel zu erzeugen, lesen Sie bitte pkey.paramgen für mögliche Werte der Tabelle config. Zum Beispiel:

local key, err = pkey.new({
  type = 'EC',
  curve = 'prime256v1',
})

Ab OpenSSL 3.0 kann jeder Schlüsseltyp, der von einem geladenen Provider implementiert wird, per Namen angefordert werden. Zum Beispiel bietet OpenSSL 3.5 oder höher Post-Quanten-Schlüsseltypen an, darunter:

local ml_dsa = assert(pkey.new({ type = "ML-DSA-44" }))
local ml_kem = assert(pkey.new({ type = "ML-KEM-768" }))
local slh_dsa = assert(pkey.new({ type = "SLH-DSA-SHA2-128s" }))

config.properties kann verwendet werden, um eine Provider-Implementierung für diese Provider-nativen Schlüsseltypen auszuwählen.

Es ist auch möglich, PEM-kodierte EC- oder DH-Parameter an config.param für die Schlüsselerzeugung zu übergeben:

local dhparam = pkey.paramgen({
  type = 'DH',
  group = 'dh_1024_160'
})
-- ODER
-- local dhparam = io.read("dhparams.pem"):read("*a")

local key, err = pkey.new({
  type = 'DH',
  param = dhparam,
}) 

Es ist auch möglich, rohe pkeyopt-Kontrollzeichenfolgen in der Tabelle config zu übergeben, wie sie im CLI-Programm genpkey verwendet werden. Siehe openssl-genpkey(1) für eine Liste der Optionen.

Zum Beispiel:

pkey.new({
  type = 'RSA',
  bits = 2048,
  exp = 65537,
})
-- ist dasselbe wie
pkey.new({
  type = 'RSA',
  exp = 65537,
  "rsa_keygen_bits:4096",
})

Schlüsselzusammensetzung

Syntax: pk, err = pkey.new(config?)

Stellt einen öffentlichen oder privaten Schlüssel unter Verwendung vorhandener Parameter zusammen. Um eine Liste der Parameter für jeden Schlüssel zu sehen, lesen Sie pkey:set_parameters.

Nur type und params sollten in der Tabelle config vorhanden sein, alle anderen Schlüssel werden ignoriert.

local private_bn = require "resty.openssl.bn".new("7F48282CCA4C1A65D589C06DBE9C42AE50FBFFDF3A18CBB48498E1DE47F11BE1A3486CD8FA950D68F111970F922279D8", 16)
local p_384, err = assert(require("resty.openssl.pkey").new({
    type = "EC",
    params = {
        private = private_bn,
        group = "secp384r1",
    }
}))

pkey.istype

Syntax: ok = pkey.istype(table)

Gibt true zurück, wenn die Tabelle eine Instanz von pkey ist. Gibt andernfalls false zurück.

pkey.paramgen

Syntax: pem_txt, err = pk.paramgen(config)

Erzeugt Parameter für EC- oder DH-Schlüssel und gibt sie als PEM-kodierten Text aus.

Für EC-Schlüssel:

Parameter Beschreibung
type "EC"
curve EC-Kurven. Wenn weggelassen, wird standardmäßig "prime192v1" verwendet. Um eine Liste der unterstützten EC-Kurven zu sehen, verwenden Sie openssl ecparam -list_curves.

Für DH-Schlüssel:

Parameter Beschreibung
type "DH"
bits Erzeugt einen neuen DH-Parameter mit einer bits langen Primzahl. Wenn weggelassen, wird standardmäßig 2048 verwendet. Ab OpenSSL 3.0 sind nur bits gleich 2048 erlaubt.
group Verwendet vordefinierte Gruppen, anstatt eine neue zu erzeugen. bit wird ignoriert, wenn group gesetzt ist.

Mögliche Werte für group sind: - RFC7919 "ffdhe2048", "ffdhe3072", "ffdhe4096", "ffdhe6144", "ffdhe8192" - RFC5114 "dh_1024_160", "dh_2048_224", "dh_2048_256" - RFC3526 "modp_1536", "modp_2048", "modp_3072", "modp_4096", "modp_6144", "modp_8192"

local pem, err = pkey.paramgen({
  type = 'EC',
  curve = 'prime192v1',
})

local pem, err = pkey.paramgen({
  type = 'DH',
  group = 'ffdhe4096',
})

Es ist auch möglich, rohe pkeyopt-Kontrollzeichenfolgen in der Tabelle config zu übergeben, wie sie im CLI-Programm genpkey verwendet werden. Siehe openssl-genpkey(1) für eine Liste der Optionen.

pkey:get_provider_name

Syntax: name = pkey:get_provider_name()

Gibt den Providernamen von pkey zurück.

Diese Funktion ist ab OpenSSL 3.0 verfügbar.

pkey:gettable_params, pkey:settable_params, pkey:get_param, pkey:set_params

Fragt setzbare oder abrufbare Parameter ab und setzt oder ruft Parameter ab. Siehe Generischer EVP-Parameter-Getter/Setter.

pkey:get_parameters

Syntax: parameters, err = pk:get_parameters()

Gibt eine Tabelle zurück, die die parameters der pkey-Instanz enthält.

Für ECX-Schlüssel und, separat, OpenSSL-3-Provider-native Schlüssel wie ML-KEM, ML-DSA, SLH-DSA und ML-KEM-TLS-Hybrid-Schlüssel, legt die Tabelle binäre public- und private-Felder offen, wenn der Provider es erlaubt, diese Komponenten zu exportieren. Einige Provider exportieren absichtlich keine private Komponente.

pkey:set_parameters

Syntax: ok, err = pk:set_parameters(params)

Setzt die Parameter des pkey aus einer Tabelle params. Wenn der Parameter nicht in der Tabelle params gesetzt ist, bleibt er in der pkey-Instanz unverändert.

Für ECX-Schlüssel und, separat, OpenSSL-3-Provider-native Schlüssel, enthalten public und private die rohen binären Schlüsselkomponenten. Das Setzen einer der Komponenten ersetzt den zugrunde liegenden unveränderlichen Provider-Schlüssel, während das pkey-Objekt erhalten bleibt.

local pk, err = require("resty.openssl.pkey").new()
local parameters, err = pk:get_parameters()
local e = parameters.e
ngx.say(e:to_number())
-- gibt 65537 aus

local ok, err = pk:set_parameters({
  e = require("resty.openssl.bn").from_hex("100001")
})

local ok, err = pk:set_parameters(parameters)

Parameter für RSA-Schlüssel:

Parameter Beschreibung Typ
n Modulus, gemeinsam für öffentlichen und privaten Schlüssel bn
e Öffentlicher Exponent bn
d Privater Exponent bn
p Erster Faktor von n bn
q Zweiter Faktor von n bn
dmp1 d mod (p - 1), Exponent1 bn
dmq1 d mod (q - 1), Exponent2 bn
iqmp (InverseQ)(q) = 1 mod p, Koeffizient bn

Parameter für EC-Schlüssel:

Parameter Beschreibung Typ
private Privater Schlüssel bn
public Öffentlicher Schlüssel bn
x x-Koordinate des öffentlichen Schlüssels bn
y y-Koordinate des öffentlichen Schlüssels bn
group Die benannte Kurvengruppe [NID] als Zahl, wenn als set_parameters() übergeben, ist auch die Textdarstellung möglich. Dies unterscheidet sich von luaossl, wo eine EC_GROUP-Instanz zurückgegeben wird.

Es ist nicht möglich, x, y zusammen mit public zu setzen, da x und y im Grunde eine andere Darstellung von public sind. Außerdem ist es derzeit nur möglich, x