Sample code for 30+ languages & platforms
Lua Requires Chilkat v11.0.0+

Create JWK Set Containing Certificates

See more Certificates Examples

Demonstrates how to create a JWK Set containing N certificates.

Chilkat Lua Downloads

Lua
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())