Lua Requires Chilkat v11.0.0+
Lua
Create JWK Set Containing Certificates
See more Certificates Examples
Demonstrates how to create a JWK Set containing N certificates.Chilkat Lua Downloads
local chilkat = require("chilkat")
-- This example creates the following JWK Set from two certificates:
-- {
-- "keys": [
-- {
-- "kty": "RSA",
-- "use": "sig",
-- "kid": "BB8CeFVqyaGrGNuehJIiL4dfjzw",
-- "x5t": "BB8CeFVqyaGrGNuehJIiL4dfjzw",
-- "n": "nYf1jpn7cFdQ...9Iw",
-- "e": "AQAB",
-- "x5c": [
-- "MIIDBTCCAe2...Z+NTZo"
-- ]
-- },
-- {
-- "kty": "RSA",
-- "use": "sig",
-- "kid": "M6pX7RHoraLsprfJeRCjSxuURhc",
-- "x5t": "M6pX7RHoraLsprfJeRCjSxuURhc",
-- "n": "xHScZMPo8F...EO4QQ",
-- "e": "AQAB",
-- "x5c": [
-- "MIIC8TCCAdmgA...Vt5432GA=="
-- ]
-- }
-- ]
-- }
-- First get two certificates from files.
local cert1 = chilkat.Cert.new()
local success = cert1:load_from_file("qa_data/certs/brasil_cert.pem")
if not success then
print(cert1.last_error_text)
return
end
local cert2 = chilkat.Cert.new()
success = cert2:load_from_file("qa_data/certs/testCert.cer")
if not success then
print(cert2.last_error_text)
return
end
-- We'll need this crypt object re-encode the SHA1 thumbprint from hex to base64.
local crypt = chilkat.Crypt2.new()
local json = chilkat.JsonObject.new()
-- Let's begin with the 1st cert:
json.i = 0
json:update_string("keys[i].kty", "RSA")
json:update_string("keys[i].use", "sig")
local hexThumbprint = cert1.sha1_thumbprint
local base64Thumbprint = crypt:re_encode(hexThumbprint, "hex", "base64")
json:update_string("keys[i].kid", base64Thumbprint)
json:update_string("keys[i].x5t", base64Thumbprint)
-- (We're assuming these are RSA certificates)
-- To get the modulus (n) and exponent (e), we need to get the cert's public key and then get its JWK.
local pubKey = chilkat.PublicKey.new()
cert1:get_public_key(pubKey)
local pubKeyJwk = chilkat.JsonObject.new()
pubKeyJwk:load(pubKey:get_jwk())
json:update_string("keys[i].n", pubKeyJwk:string_of("n"))
json:update_string("keys[i].e", pubKeyJwk:string_of("e"))
-- Now add the entire X.509 certificate
json:update_string("keys[i].x5c[0]", cert1:get_encoded())
-- Now do the same for cert2..
json.i = 1
json:update_string("keys[i].kty", "RSA")
json:update_string("keys[i].use", "sig")
hexThumbprint = cert2.sha1_thumbprint
base64Thumbprint = crypt:re_encode(hexThumbprint, "hex", "base64")
json:update_string("keys[i].kid", base64Thumbprint)
json:update_string("keys[i].x5t", base64Thumbprint)
cert2:get_public_key(pubKey)
pubKeyJwk:load(pubKey:get_jwk())
json:update_string("keys[i].n", pubKeyJwk:string_of("n"))
json:update_string("keys[i].e", pubKeyJwk:string_of("e"))
-- Now add the entire X.509 certificate
json:update_string("keys[i].x5c[0]", cert2:get_encoded())
-- Emit the JSON..
json.emit_compact = false
print(json:emit())