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.
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:
- cipher
- digest
- kdf
- mac
- pkcs12.encode
- pkey
- provider
- rand
- x509, x509.csr, x509.crl und einige x509.store-Funktionen
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 Erkennungopts.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