SQL Server
SQL Server
Create JWK Set Containing Certificates
See more Certificates Examples
Demonstrates how to create a JWK Set containing N certificates.Chilkat SQL Server Downloads
-- Important: See this note about string length limitations for strings returned by sp_OAMethod calls.
--
CREATE PROCEDURE ChilkatSample
AS
BEGIN
DECLARE @hr int
-- Important: Do not use nvarchar(max). See the warning about using nvarchar(max).
DECLARE @sTmp0 nvarchar(4000)
DECLARE @success int
SELECT @success = 0
-- 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.
DECLARE @cert1 int
EXEC @hr = sp_OACreate 'Chilkat.Cert', @cert1 OUT
IF @hr <> 0
BEGIN
PRINT 'Failed to create ActiveX component'
RETURN
END
EXEC sp_OAMethod @cert1, 'LoadFromFile', @success OUT, 'qa_data/certs/brasil_cert.pem'
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @cert1, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @cert1
RETURN
END
DECLARE @cert2 int
EXEC @hr = sp_OACreate 'Chilkat.Cert', @cert2 OUT
EXEC sp_OAMethod @cert2, 'LoadFromFile', @success OUT, 'qa_data/certs/testCert.cer'
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @cert2, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @cert1
EXEC @hr = sp_OADestroy @cert2
RETURN
END
-- We'll need this crypt object re-encode the SHA1 thumbprint from hex to base64.
DECLARE @crypt int
EXEC @hr = sp_OACreate 'Chilkat.Crypt2', @crypt OUT
DECLARE @json int
EXEC @hr = sp_OACreate 'Chilkat.JsonObject', @json OUT
-- Let's begin with the 1st cert:
EXEC sp_OASetProperty @json, 'I', 0
EXEC sp_OAMethod @json, 'UpdateString', @success OUT, 'keys[i].kty', 'RSA'
EXEC sp_OAMethod @json, 'UpdateString', @success OUT, 'keys[i].use', 'sig'
DECLARE @hexThumbprint nvarchar(4000)
EXEC sp_OAGetProperty @cert1, 'Sha1Thumbprint', @hexThumbprint OUT
DECLARE @base64Thumbprint nvarchar(4000)
EXEC sp_OAMethod @crypt, 'ReEncode', @base64Thumbprint OUT, @hexThumbprint, 'hex', 'base64'
EXEC sp_OAMethod @json, 'UpdateString', @success OUT, 'keys[i].kid', @base64Thumbprint
EXEC sp_OAMethod @json, 'UpdateString', @success OUT, '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.
DECLARE @pubKey int
EXEC @hr = sp_OACreate 'Chilkat.PublicKey', @pubKey OUT
EXEC sp_OAMethod @cert1, 'GetPublicKey', @success OUT, @pubKey
DECLARE @pubKeyJwk int
EXEC @hr = sp_OACreate 'Chilkat.JsonObject', @pubKeyJwk OUT
EXEC sp_OAMethod @pubKey, 'GetJwk', @sTmp0 OUT
EXEC sp_OAMethod @pubKeyJwk, 'Load', @success OUT, @sTmp0
EXEC sp_OAMethod @pubKeyJwk, 'StringOf', @sTmp0 OUT, 'n'
EXEC sp_OAMethod @json, 'UpdateString', @success OUT, 'keys[i].n', @sTmp0
EXEC sp_OAMethod @pubKeyJwk, 'StringOf', @sTmp0 OUT, 'e'
EXEC sp_OAMethod @json, 'UpdateString', @success OUT, 'keys[i].e', @sTmp0
-- Now add the entire X.509 certificate
EXEC sp_OAMethod @cert1, 'GetEncoded', @sTmp0 OUT
EXEC sp_OAMethod @json, 'UpdateString', @success OUT, 'keys[i].x5c[0]', @sTmp0
-- Now do the same for cert2..
EXEC sp_OASetProperty @json, 'I', 1
EXEC sp_OAMethod @json, 'UpdateString', @success OUT, 'keys[i].kty', 'RSA'
EXEC sp_OAMethod @json, 'UpdateString', @success OUT, 'keys[i].use', 'sig'
EXEC sp_OAGetProperty @cert2, 'Sha1Thumbprint', @hexThumbprint OUT
EXEC sp_OAMethod @crypt, 'ReEncode', @base64Thumbprint OUT, @hexThumbprint, 'hex', 'base64'
EXEC sp_OAMethod @json, 'UpdateString', @success OUT, 'keys[i].kid', @base64Thumbprint
EXEC sp_OAMethod @json, 'UpdateString', @success OUT, 'keys[i].x5t', @base64Thumbprint
EXEC sp_OAMethod @cert2, 'GetPublicKey', @success OUT, @pubKey
EXEC sp_OAMethod @pubKey, 'GetJwk', @sTmp0 OUT
EXEC sp_OAMethod @pubKeyJwk, 'Load', @success OUT, @sTmp0
EXEC sp_OAMethod @pubKeyJwk, 'StringOf', @sTmp0 OUT, 'n'
EXEC sp_OAMethod @json, 'UpdateString', @success OUT, 'keys[i].n', @sTmp0
EXEC sp_OAMethod @pubKeyJwk, 'StringOf', @sTmp0 OUT, 'e'
EXEC sp_OAMethod @json, 'UpdateString', @success OUT, 'keys[i].e', @sTmp0
-- Now add the entire X.509 certificate
EXEC sp_OAMethod @cert2, 'GetEncoded', @sTmp0 OUT
EXEC sp_OAMethod @json, 'UpdateString', @success OUT, 'keys[i].x5c[0]', @sTmp0
-- Emit the JSON..
EXEC sp_OASetProperty @json, 'EmitCompact', 0
EXEC sp_OAMethod @json, 'Emit', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @cert1
EXEC @hr = sp_OADestroy @cert2
EXEC @hr = sp_OADestroy @crypt
EXEC @hr = sp_OADestroy @json
EXEC @hr = sp_OADestroy @pubKey
EXEC @hr = sp_OADestroy @pubKeyJwk
END
GO