This is a tool to work with Sigstore Trusted Roots.
The trtool project aims to follow the Unix philosophy as much as possible, which implies "Rule of Silence", if nothing unexpected happens the program stays silent.
This project is still in pre-alpha.
$ ./trtool init \
-ca test_data/fulcio-chain.pem \
-ca-start 2024-04-03T00:00:00Z \
-ca-uri https://fulcio.test.foo | jq > tr.json
$ ./trtool add -f tr.json \
-type tlog \
-uri https://foo.bar \
-pem test_data/rekor.pkcs1.pem \
-start 2024-04-03T00:00:00Z | jq > tr2.json
$ ./trtool add -f tr2.json \
-type ctlog \
-uri https://ct.bar \
-pem test_data/rekor.pkix.pem \
-start 2024-04-03T00:00:00Z | jq > tr3.json
Inspect the final result
{
"mediaType": "application/vnd.dev.sigstore.trustedroot+json;version=0.1",
"tlogs": [
{
"baseUrl": "https://foo.bar",
"hashAlgorithm": "SHA2_256",
"publicKey": {
"rawBytes": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyuEumAOUjCAEM2unKrmJohSqGzAH6+TsETWSPYsB98xDIO5zdL43LD/dpEXW9DnRdGYKnlDCLYyFYiR7/gToxmiZgprn45ZvNxQQDnwHuUdIVnfYvDV5nTSrqMW7WZ1bWckkw5P00BNVXLCWBW6KCGflcZODXd8Nrk8lWzl32iUbKh48WbumvfmcIBdrouXrJ/fzGV3OYLiIk9dMP6ux18cceJeeMyn2rTnSknOMQP95OsdOh0G22bSbQFtCnGeNW+TOXsA5q9w59V56/gqGZksOAqLcZu2IhLq33q8r6kh47t2kGcvBFi6QUuqzavT2zguEHdP7nQNCYzfioEo3zwIDAQAB",
"keyDetails": "PKIX_RSA_PKCS1V15_2048_SHA256",
"validFor": {
"start": "2024-04-03T00:00:00Z"
}
},
"logId": {
"keyId": "/TKbCUU9CPkeXPLkZSBMayyIieby0t5s3hpm/mWvTDU="
}
}
],
"certificateAuthorities": [
{
"subject": {
"organization": "Umbrella Corporation",
"commonName": "Root"
},
"uri": "https://fulcio.test.foo",
"certChain": {
"certificates": [
{
"rawBytes": "MIICCTCCAbCgAwIBAgIUHDmuvTRvs0QKLbLB0NzHRNv9uiowCgYIKoZIzj0EAwIwRzEdMBsGA1UEChMUVW1icmVsbGEgQ29ycG9yYXRpb24xJjAkBgNVBAMTHUZ1bGNpbyBJbnRlcm1lZGlhdGUgLSBvZmZsaW5lMB4XDTI0MDIwMzAwMDAwMFoXDTI1MDIwMjAwMDAwMFowRjEdMBsGA1UEChMUVW1icmVsbGEgQ29ycG9yYXRpb24xJTAjBgNVBAMTHEZ1bGNpbyBJbnRlcm1lZGlhdGUgLSBvbmxpbmUwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASuVV0y56oOg+wDp1tuNqhO+kJN7v4LfWeybgXpymTS1iTJi9KG+C4vwHHIoDUm903ibl5hcrzHNfimhEIvGfUEo3sweTAOBgNVHQ8BAf8EBAMCAQYwEwYDVR0lBAwwCgYIKwYBBQUHAwMwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQURKRBGoDKyxxvYjKI1hf5XwgzqVUwHwYDVR0jBBgwFoAUSbfpoJQP5tM7K+6m+DH2rLIfnmowCgYIKoZIzj0EAwIDRwAwRAIgRl7ocUZySscxipHEsoR8pyq3CQq8eBtIk/ED9pfDVnACIBxf/2FPQ5OrGOtTvMATGobgVT7I47hq0ielUk4Ahu7X"
},
{
"rawBytes": "MIIB3jCCAYOgAwIBAgIURCy5Zqzr3D6OLlWiCK4Wbd6nlXQwCgYIKoZIzj0EAwIwLjEdMBsGA1UEChMUVW1icmVsbGEgQ29ycG9yYXRpb24xDTALBgNVBAMTBFJvb3QwHhcNMjQwMjAzMDAwMDAwWhcNMjkwMjAxMDAwMDAwWjBHMR0wGwYDVQQKExRVbWJyZWxsYSBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdRnVsY2lvIEludGVybWVkaWF0ZSAtIG9mZmxpbmUwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR1jMWmUFKDhsPSGJ5/JhIT/4Tu5jfhNPoxhvSHduDgypcVDHR1+0Z00sziPFO0xo6JcQ+Iy0LGHGatxNB7Al81o2YwZDAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBATAdBgNVHQ4EFgQUSbfpoJQP5tM7K+6m+DH2rLIfnmowHwYDVR0jBBgwFoAUD4GinE5klrSpTJF1qN/OOS3RdJkwCgYIKoZIzj0EAwIDSQAwRgIhAPKj4S458+h4ZGTEmew773VsnfQtg8QdnnkdMYrik1M5AiEAy31ef0w8KqhknNn6m3L1nLUxLfsQQ+KEyLYYpVQIfHE="
},
{
"rawBytes": "MIIBojCCAUmgAwIBAgIUVDnTWXahSkBcdF4a07xIFFeur1YwCgYIKoZIzj0EAwIwLjEdMBsGA1UEChMUVW1icmVsbGEgQ29ycG9yYXRpb24xDTALBgNVBAMTBFJvb3QwHhcNMjQwMjAzMDAwMDAwWhcNMzQwMTMxMDAwMDAwWjAuMR0wGwYDVQQKExRVbWJyZWxsYSBDb3Jwb3JhdGlvbjENMAsGA1UEAxMEUm9vdDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABFElGoh/aqZ/RCy/IRd+7ZNggDS+cwRMMb501j5eH/qKH0k/mnY5Lq3duBX6BGD+Q5TtEo8tmQ24+Zy33QsUobmjRTBDMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgECMB0GA1UdDgQWBBQPgaKcTmSWtKlMkXWo3845LdF0mTAKBggqhkjOPQQDAgNHADBEAiBvOyX8IMiCTqMD1JC+qw8J3lqqmzaou4nwMbIlG8hbXAIgHaYjlnp7IMyJQ+nF6p/MXOK0Uh6S7vC6zRcVhBIbG1w="
}
]
},
"validFor": {
"start": "2024-04-03T00:00:00Z"
}
}
],
"ctlogs": [
{
"baseUrl": "https://ct.bar",
"hashAlgorithm": "SHA2_256",
"publicKey": {
"rawBytes": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyuEumAOUjCAEM2unKrmJohSqGzAH6+TsETWSPYsB98xDIO5zdL43LD/dpEXW9DnRdGYKnlDCLYyFYiR7/gToxmiZgprn45ZvNxQQDnwHuUdIVnfYvDV5nTSrqMW7WZ1bWckkw5P00BNVXLCWBW6KCGflcZODXd8Nrk8lWzl32iUbKh48WbumvfmcIBdrouXrJ/fzGV3OYLiIk9dMP6ux18cceJeeMyn2rTnSknOMQP95OsdOh0G22bSbQFtCnGeNW+TOXsA5q9w59V56/gqGZksOAqLcZu2IhLq33q8r6kh47t2kGcvBFi6QUuqzavT2zguEHdP7nQNCYzfioEo3zwIDAQAB",
"keyDetails": "PKIX_RSA_PKCS1V15_2048_SHA256",
"validFor": {
"start": "2024-04-03T00:00:00Z"
}
},
"logId": {
"keyId": "/TKbCUU9CPkeXPLkZSBMayyIieby0t5s3hpm/mWvTDU="
}
}
]
}
The astute reader will notice that both the CT log and transparency
log have the same public key, but were added with different keys. This
is because the public key loaded is actually the same, but one is
encoded with PKCS#1
and the other with PKIX
. During serialization
to JSON only PKIX
is supported, per
sigstore/protobuf-specs
PKCS#1
encoding is deprecated.
$ % ./trtool verify -f tr3.json
$ echo $?
0
In verbose mode
$ ./trtool verify -v -f tr3.json
Verifying OU='Umbrella Corporation' CN='Root' of length 3
Loaded OU='Umbrella Corporation' CN='Fulcio Intermediate - online' CA:true MaxPathLen 0 at pos 0
issuer OU='Umbrella Corporation' CN='Fulcio Intermediate - offline'
Loaded OU='Umbrella Corporation' CN='Fulcio Intermediate - offline' CA:true MaxPathLen 1 at pos 1
issuer OU='Umbrella Corporation' CN='Root'
Loaded OU='Umbrella Corporation' CN='Root' CA:true MaxPathLen 2 at pos 2
issuer OU='Umbrella Corporation' CN='Root'
------------------------------------------------------------------------
Trusted root is valid