Add support for printing SCTs (#277)

* Address PR comments
This commit is contained in:
John Wood
2022-06-29 17:35:59 -07:00
committed by GitHub
parent 3871aa0f39
commit 37a41318ba
13 changed files with 1864 additions and 57 deletions
+1
View File
@@ -1,4 +1,5 @@
certigo
certigo.exe
/gen-known-logs
man/
shell/
+2 -10
View File
@@ -1,23 +1,15 @@
module github.com/square/certigo
require (
github.com/Masterminds/goutils v1.1.0 // indirect
github.com/Masterminds/semver v1.4.2 // indirect
github.com/Masterminds/sprig v2.22.0+incompatible
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc // indirect
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf // indirect
github.com/fatih/color v1.13.0
github.com/google/uuid v1.0.0 // indirect
github.com/huandu/xstrings v1.2.0 // indirect
github.com/imdario/mergo v0.3.6 // indirect
github.com/google/certificate-transparency-go v1.1.3
github.com/mattn/go-colorable v0.1.12
github.com/mitchellh/copystructure v1.0.0 // indirect
github.com/mwitkow/go-http-dialer v0.0.0-20161116154839-378f744fb2b8
github.com/stretchr/testify v1.7.5
golang.org/x/crypto v0.0.0-20220214200702-86341886e292
golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4
gopkg.in/alecthomas/kingpin.v2 v2.2.6
gopkg.in/asn1-ber.v1 v1.0.0-20170511165959-379148ca0225
gopkg.in/yaml.v2 v2.4.0 // indirect
)
go 1.13
+1473 -12
View File
File diff suppressed because it is too large Load Diff
+5
View File
@@ -0,0 +1,5 @@
.PHONY: ctlogs
ctlogs:
go run github.com/square/certigo/internal/gen-known-logs --package lib > ../../lib/ctlogs.go
go fmt ../../lib/ctlogs.go
+9
View File
@@ -0,0 +1,9 @@
# gen-known-logs
A tool for generating the list of CT logs that certigo uses for printing operator information and log URLs for SCTs.
Logs are fetched parsed from https://www.gstatic.com/ct/log_list/v2/all_logs_list.json, documented [here](https://github.com/google/certificate-transparency-community-site/blob/master/docs/google/known-logs.md).
## Usage
From the current directory (`certigo/internal/gen-known-logs`), run `make ctlogs`. This will fetch the list of logs and place generated code in [lib/ctlogs.go](../../lib/ctlogs.go).
+69
View File
@@ -0,0 +1,69 @@
package main
import (
"encoding/json"
"flag"
"fmt"
"log"
"net/http"
"time"
)
var packageName = flag.String("package", "lib", "Package for the generated code")
// https://github.com/google/certificate-transparency-community-site/blob/master/docs/google/known-logs.md
const knownLogsAddr = "https://www.gstatic.com/ct/log_list/v2/all_logs_list.json"
type ctLog struct {
operator string
url string
}
func main() {
flag.Parse()
resp, err := http.Get(knownLogsAddr)
if err != nil {
log.Printf("Failed to fetch the list of known CT logs: %v", err)
return
}
defer resp.Body.Close()
var logs struct {
Operators []struct {
Name string `json:"name"`
Logs []struct {
ID string `json:"log_id"`
URL string `json:"url"`
} `json:"logs"`
} `json:"operators"`
}
if err := json.NewDecoder(resp.Body).Decode(&logs); err != nil {
log.Printf("Failed to parse the list of known CT logs: %v", err)
return
}
fmt.Printf(`// Autogenerated with github.com/square/certigo/internal/gen-known-logs
// Generated at %s
package %s
type ctLog struct {
operator string
url string
}
var knownLogs = map[string]*ctLog{
`, time.Now().Format(time.RFC3339), *packageName)
knownLogs := make(map[string]*ctLog)
for _, op := range logs.Operators {
for _, l := range op.Logs {
fmt.Printf("\t%q: {operator: %q, url: %q},\n", l.ID, op.Name, l.URL)
knownLogs[l.ID] = &ctLog{
operator: op.Name,
url: l.URL,
}
}
}
fmt.Println("}")
}
+92
View File
@@ -0,0 +1,92 @@
package lib
import (
"crypto/x509"
"encoding/asn1"
"encoding/base64"
"time"
cttls "github.com/google/certificate-transparency-go/tls"
ctx509 "github.com/google/certificate-transparency-go/x509"
ctutil "github.com/google/certificate-transparency-go/x509util"
)
func parseSCTList(cert *x509.Certificate) []*simpleSCT {
// ctutil contains a fork of crypto/x509 with support for SCTs. We must re-parse the
// whole certificate to get at them, so do a quick check to see if the SCT extension
// is present before re-parsing the cert unnecessarily.
if !hasSCTs(cert) {
return nil
}
var sctList []*simpleSCT
if scts, err := ctutil.ParseSCTsFromCertificate(cert.Raw); err == nil {
for _, sct := range scts {
id := sct.LogID.KeyID[:]
ssct := &simpleSCT{
Version: uint64(sct.SCTVersion),
LogID: id,
Timestamp: time.UnixMilli(int64(sct.Timestamp)),
SignatureAlgorithm: sctSignatureAlg(sct.Signature.Algorithm),
}
if log := getLogByID(id); log != nil {
ssct.LogOperator = log.operator
ssct.LogURL = log.url
}
sctList = append(sctList, ssct)
}
}
return sctList
}
func hasSCTs(cert *x509.Certificate) bool {
for _, e := range cert.Extensions {
if e.Id.Equal(asn1.ObjectIdentifier(ctx509.OIDExtensionCTSCT)) {
return true
}
}
return false
}
func getLogByID(id []byte) *ctLog {
b64 := base64.StdEncoding.EncodeToString(id)
return knownLogs[b64]
}
func sctSignatureAlg(alg cttls.SignatureAndHashAlgorithm) simpleSigAlg {
x509Alg := x509.UnknownSignatureAlgorithm
switch alg.Signature {
case cttls.RSA:
switch alg.Hash {
case cttls.MD5:
x509Alg = x509.MD5WithRSA
case cttls.SHA1:
x509Alg = x509.SHA1WithRSA
case cttls.SHA256:
x509Alg = x509.SHA256WithRSA
case cttls.SHA384:
x509Alg = x509.SHA384WithRSA
case cttls.SHA512:
x509Alg = x509.SHA512WithRSA
}
case cttls.DSA:
switch alg.Hash {
case cttls.SHA1:
x509Alg = x509.DSAWithSHA1
case cttls.SHA256:
x509Alg = x509.DSAWithSHA256
}
case cttls.ECDSA:
switch alg.Hash {
case cttls.SHA1:
x509Alg = x509.ECDSAWithSHA1
case cttls.SHA256:
x509Alg = x509.ECDSAWithSHA256
case cttls.SHA384:
x509Alg = x509.ECDSAWithSHA384
case cttls.SHA512:
x509Alg = x509.ECDSAWithSHA512
}
}
return simpleSigAlg(x509Alg)
}
+120
View File
@@ -0,0 +1,120 @@
// Autogenerated with github.com/square/certigo/internal/gen-known-logs
// Generated at 2022-06-29T17:31:27-07:00
package lib
type ctLog struct {
operator string
url string
}
var knownLogs = map[string]*ctLog{
"+tTJfMSe4vishcXqXOoJ0CINu/TknGtQZi/4aPhrjCg=": {operator: "Google", url: "https://ct.googleapis.com/logs/argon2017/"},
"pFASaQVaFVReYhGrN7wQP2KuVXakXksXFEU+GyIQaiU=": {operator: "Google", url: "https://ct.googleapis.com/logs/argon2018/"},
"Y/Lbzeg7zCzPC3KEJ1drM6SNYXePvXWmOLHHaFRL2I0=": {operator: "Google", url: "https://ct.googleapis.com/logs/argon2019/"},
"sh4FzIuizYogTodm+Su5iiUgZ2va+nDnsklTLe+LkF4=": {operator: "Google", url: "https://ct.googleapis.com/logs/argon2020/"},
"9lyUL9F3MCIUVBgIMJRWjuNNExkzv98MLyALzE7xZOM=": {operator: "Google", url: "https://ct.googleapis.com/logs/argon2021/"},
"KXm+8J45OSHwVnOfY6V35b5XfZxgCvj5TV0mXCVdx4Q=": {operator: "Google", url: "https://ct.googleapis.com/logs/argon2022/"},
"6D7Q2j71BjUy51covIlryQPTy9ERa+zraeF3fW0GvW4=": {operator: "Google", url: "https://ct.googleapis.com/logs/argon2023/"},
"sQzVWabWeEaBH335pRUyc5rEjXA76gMj2l04dVvArU4=": {operator: "Google", url: "https://ct.googleapis.com/logs/xenon2018/"},
"CEEUmABxUywWGQRgvPxH/cJlOvopLHKzf/hjrinMyfA=": {operator: "Google", url: "https://ct.googleapis.com/logs/xenon2019/"},
"B7dcG+V9aP/xsMYdIxXHuuZXfFeUt2ruvGE6GmnTohw=": {operator: "Google", url: "https://ct.googleapis.com/logs/xenon2020/"},
"fT7y+I//iFVoJMLAyp5SiXkrxQ54CX8uapdomX4i8Nc=": {operator: "Google", url: "https://ct.googleapis.com/logs/xenon2021/"},
"RqVV63X6kSAwtaKJafTzfREsQXS+/Um4havy/HD+bUc=": {operator: "Google", url: "https://ct.googleapis.com/logs/xenon2022/"},
"rfe++nz/EMiLnT2cHj4YarRnKV3PsQwkyoWGNOvcgoo=": {operator: "Google", url: "https://ct.googleapis.com/logs/xenon2023/"},
"aPaY+B9kgr46jO65KB1M/HFRXWeT1ETRCmesu09P+8Q=": {operator: "Google", url: "https://ct.googleapis.com/aviator/"},
"KTxRllTIOWW6qlD8WAfUt2+/WHopctykwwz05UVH9Hg=": {operator: "Google", url: "https://ct.googleapis.com/icarus/"},
"pLkJkLQYWBSHuxOizGdwCjw1mAT5G9+443fNDsgN3BA=": {operator: "Google", url: "https://ct.googleapis.com/pilot/"},
"7ku9t3XOYLrhQmkfq+GeZqMPfl+wctiDAMR7iXqo/cs=": {operator: "Google", url: "https://ct.googleapis.com/rocketeer/"},
"u9nfvB+KcbWTlCOXqpJ7RzhXlQqrUugakJZkNo4e0YU=": {operator: "Google", url: "https://ct.googleapis.com/skydiver/"},
"qJnYeAySkKr0YvMYgMz71SRR6XDQ+/WR73Ww2ZtkVoE=": {operator: "Google", url: "https://ct.googleapis.com/submariner/"},
"HQJLjrFJizRN/YfqPvwJlvdQbyNdHUlwYaR3PEOcJfs=": {operator: "Google", url: "https://ct.googleapis.com/daedalus/"},
"sMyD5aX5fWuvfAnMKEkEhyrH6IsTLGNQt8b9JuFsbHc=": {operator: "Google", url: "https://ct.googleapis.com/testtube/"},
"w78Dp+HKiEHGB7rj/0Jw/KXsRbGG675OLPP8d4Yw9fY=": {operator: "Google", url: "https://ct.googleapis.com/logs/crucible/"},
"UutLIl7IlpdIUGdfI+Q7wdAh4yFM5S7NX6h8IDzfygM=": {operator: "Google", url: "https://ct.googleapis.com/logs/solera2018/"},
"C3YOmouaaC+ImFsV6UdQGlZEa7qIMHhcOEKZQ4ZFDAA=": {operator: "Google", url: "https://ct.googleapis.com/logs/solera2019/"},
"H8cs5aG3mfQAw1m/+WyjkTVI6GRCIGEJUum6F3T3usc=": {operator: "Google", url: "https://ct.googleapis.com/logs/solera2020/"},
"o8mYRegKt84AFXs3Qt8CB90nKytgLs+Y7iwS25xa5+c=": {operator: "Google", url: "https://ct.googleapis.com/logs/solera2021/"},
"aXqvyhprU2+uISBQRt661+Dq6hPSQy5unY+zefK5qvM=": {operator: "Google", url: "https://ct.googleapis.com/logs/solera2022/"},
"+X6XuNM+96FZAqU6GeF5kOXcQGoDGCW6rZPpj5ucacs=": {operator: "Google", url: "https://ct.googleapis.com/logs/solera2023/"},
"H7w24ALt6X9AGZ6Gs1c7ikIX2AGHdGrQ2gOgYFTSDfQ=": {operator: "Cloudflare", url: "https://ct.cloudflare.com/logs/nimbus2017/"},
"23Sv7ssp7LH+yj5xbSzluaq7NveEcYPHXZ1PN7Yfv2Q=": {operator: "Cloudflare", url: "https://ct.cloudflare.com/logs/nimbus2018/"},
"dH7agzGtMxCRIZzOJU9CcMK//V5CIAjGNzV55hB7zFY=": {operator: "Cloudflare", url: "https://ct.cloudflare.com/logs/nimbus2019/"},
"Xqdz+d9WwOe1Nkh90EngMnqRmgyEoRIShBh1loFxRVg=": {operator: "Cloudflare", url: "https://ct.cloudflare.com/logs/nimbus2020/"},
"RJRlLrDuzq/EQAfYqP4owNrmgr7YyzG1P9MzlrW2gag=": {operator: "Cloudflare", url: "https://ct.cloudflare.com/logs/nimbus2021/"},
"QcjKsd8iRkoQxqE6CUKHXk4xixsD6+tLx2jwkGKWBvY=": {operator: "Cloudflare", url: "https://ct.cloudflare.com/logs/nimbus2022/"},
"ejKMVNi3LbYg6jjgUh7phBZwMhOFTTvSK8E6V6NS61I=": {operator: "Cloudflare", url: "https://ct.cloudflare.com/logs/nimbus2023/"},
"VhQGmi/XwuzT9eG9RLI+x0Z2ubyZEVzA75SYVdaJ0N0=": {operator: "DigiCert", url: "https://ct1.digicert-ct.com/log/"},
"h3W/51l8+IxDmV+9827/Vo1HVjb/SrVgwbTq/16ggw8=": {operator: "DigiCert", url: "https://ct2.digicert-ct.com/log/"},
"wRZK4Kdy0tQ5LcgKwQdw1PDEm96ZGkhAwfoHUWT2M2A=": {operator: "DigiCert", url: "https://yeti2018.ct.digicert.com/log/"},
"4mlLribo6UAJ6IYbtjuD1D7n/nSI+6SPKJMBnd3x2/4=": {operator: "DigiCert", url: "https://yeti2019.ct.digicert.com/log/"},
"8JWkWfIA0YJAEC0vk4iOrUv+HUfjmeHQNKawqKqOsnM=": {operator: "DigiCert", url: "https://yeti2020.ct.digicert.com/log/"},
"XNxDkv7mq0VEsV6a1FbmEDf71fpH3KFzlLJe5vbHDso=": {operator: "DigiCert", url: "https://yeti2021.ct.digicert.com/log/"},
"IkVFB1lVJFaWP6Ev8fdthuAjJmOtwEt/XcaDXG7iDwI=": {operator: "DigiCert", url: "https://yeti2022.ct.digicert.com/log/"},
"BZwB0yDgB4QTlYBJjRF8kDJmr69yULWvO0akPhGEDUo=": {operator: "DigiCert", url: "https://yeti2022-2.ct.digicert.com/log/"},
"Nc8ZG7+xbFe/D61MbULLu7YnICZR6j/hKu+oA8M71kw=": {operator: "DigiCert", url: "https://yeti2023.ct.digicert.com/log/"},
"SLDja9qmRzQP5WoC+p0w6xxSActW3SyB2bu/qznYhHM=": {operator: "DigiCert", url: "https://yeti2024.ct.digicert.com/log/"},
"fVkeEuF4KnscYWd8Xv340IdcFKBOlZ65Ay/ZDowuebg=": {operator: "DigiCert", url: "https://yeti2025.ct.digicert.com/log/"},
"b/FBtWR+QiL37wUs7658If1gjifSr1pun0uKN9ZjPuU=": {operator: "DigiCert", url: "https://nessie2018.ct.digicert.com/log/"},
"/kRhCLHQGreKYsz+q2qysrq/86va2ApNizDfLQAIgww=": {operator: "DigiCert", url: "https://nessie2019.ct.digicert.com/log/"},
"xlKg7EjOs/yrFwmSxDqHQTMJ6ABlomJSQBujNioXxWU=": {operator: "DigiCert", url: "https://nessie2020.ct.digicert.com/log/"},
"7sCV7o1yZA+S48O5G8cSo2lqCXtLahoUOOZHssvtxfk=": {operator: "DigiCert", url: "https://nessie2021.ct.digicert.com/log/"},
"UaOw9f0BeZxWbbg3eI8MpHrMGyfL956IQpoN/tSLBeU=": {operator: "DigiCert", url: "https://nessie2022.ct.digicert.com/log/"},
"s3N3B+GEUPhjhtYFqdwRCUp5LbFnDAuH3PADDnk2pZo=": {operator: "DigiCert", url: "https://nessie2023.ct.digicert.com/log/"},
"c9meiRtMlnigIH1HneayxhzQUV5xGSqMa4AQesF3crU=": {operator: "DigiCert", url: "https://nessie2024.ct.digicert.com/log/"},
"5tIxY0B3jMEQQQbXcbnOwdJA9paEhvu6hzId/R43jlA=": {operator: "DigiCert", url: "https://nessie2025.ct.digicert.com/log/"},
"3esdK3oNT6Ygi4GtgWhwfi6OnQHVXIiNPRHEzbbsvsw=": {operator: "DigiCert", url: "https://ct.ws.symantec.com/"},
"vHjh38X2PGhGSTNNoQ+hXwl5aSAJwIG08/aRfz7ZuKU=": {operator: "DigiCert", url: "https://vega.ws.symantec.com/"},
"p85KTmIH4K3e5f2qSx+GdodntdACpV1HMQ5+ZwqV6rI=": {operator: "DigiCert", url: "https://deneb.ws.symantec.com/"},
"FZcEiNe5l6Bb61JRKt7o0ui0oxZSZBIan6v71fha2T8=": {operator: "DigiCert", url: "https://sirius.ws.symantec.com/"},
"zbUXm3/BwEb+6jETaj+PAC5hgvr4iW/syLL1tatgSQA=": {operator: "Certly", url: "https://log.certly.io/"},
"dGG0oJz7PUHXUVlXWy52SaRFqNJ3CbDMVkpkgrfrQaM=": {operator: "Izenpe", url: "https://ct.izenpe.com/"},
"iUFEnHB0Lga5/JznsRa6ACSqNtWa9E8CBEBPAPfqhWY=": {operator: "Izenpe", url: "https://ct.izenpe.eus/"},
"nk/3PcPOIgtpIXyJnkaAdqv414Y21cz8haMadWKLqIs=": {operator: "WoSign", url: "https://ct.wosign.com/"},
"QbLcLonmPOSvG6e7Kb9oxt7m+fHMBH4w3/rjs7olkmM=": {operator: "WoSign", url: "https://ctlog.wosign.com/"},
"Y9AAYCbd4QuwYB9FJEaWXuK26izU+8layGalUK+Qdbc=": {operator: "WoSign", url: "https://ctlog2.wosign.com/"},
"yc+JCiEQnGZswXo+0GXJMNDgE1qf66ha8UIQuAckIao=": {operator: "Wang Shengnan", url: "https://ct.gdca.com.cn/"},
"kkow+Qkzb/Q11pk6EKx1osZBco5/wtZZrmGI/61AzgE=": {operator: "GDCA", url: "https://ctlog.gdca.com.cn/"},
"cX6nQgl1voSicjVT8Xd8Jt1Rr04QIUQJTZAZtGL7Zmg=": {operator: "GDCA", url: "https://log.gdca.com.cn/"},
"FDCNkMzQMBNQBcAcpSbYHoTodiTjm2JI4I9ySuo7tCo=": {operator: "GDCA", url: "https://log2.gdca.com.cn/"},
"23b9raxl59CVCIhuIVm9i5A1L1/q0+PcXiLrNQrMe5g=": {operator: "Sectigo", url: "https://dodo.ct.comodo.com/"},
"VYHUwhaQNgFK6gubVzxT8MDkOHhwJQgXL6OqHQcT0ww=": {operator: "Sectigo", url: "https://sabre.ct.comodo.com/"},
"b1N2rDHwMRnYmQCkURX/dxUcEdkCwQApBo2yCJo32RM=": {operator: "Sectigo", url: "https://mammoth.ct.comodo.com/"},
"rDua7X+pZ0dXFZ5tfVdWcvnZgQCUHpve/+yhMTt1eC0=": {operator: "Venafi", url: "https://ctlog.api.venafi.com/"},
"AwGd8/2FppqOvR+sxtqbpz5Gl3T+d/V5/FoIuDKMHWs=": {operator: "Venafi", url: "https://ctlog-gen2.api.venafi.com/"},
"pXesnO11SN2PAltnokEInfhuD0duwgPC7L7bGF8oJjg=": {operator: "CNNIC", url: "https://ctserver.cnnic.cn/"},
"NLtq1sPfnAPuqKSZ/3iRSGydXlysktAfe/0bzhnbSO8=": {operator: "StartCom", url: "https://ct.startssl.com/"},
"4BJ2KekEllZOPQFHmESYqkj4rbFmAOt5AqHvmQmQYnM=": {operator: "Beijing PuChuangSiDa Technology Ltd.", url: "https://www.certificatetransparency.cn/ct/"},
"U3tpo1ZDNanASQTjlZOywpjrjXpugwI2NcYnJIzWtEA=": {operator: "NORDUnet", url: "https://flimsy.ct.nordu.net:8080/"},
"qucLfzy41WbIbC8Wl5yfRF9pqw60U1WJsvd6AwEE880=": {operator: "NORDUnet", url: "https://plausible.ct.nordu.net/"},
"z1XiiSNJfDQNUgbQU1Ouslg0tS8fjclSaAnyEu/dfKY=": {operator: "SHECA", url: "http://ctlog.sheca.com/"},
"MtxZwtTEGWjVbhS8YayPDkXbOfrzwVWqQlL1AB+gxiM=": {operator: "SHECA", url: "https://ct.sheca.com/"},
"lgbALGkAM6odFF9ZxuJkjQVJ8N+WqrjbkVpw2OzzkKU=": {operator: "Akamai", url: "https://ct.akamai.com/"},
"OTdvVF97Rgf1l0LXaM1dJDe/NHO2U0pINLz3Lmgcg8k=": {operator: "Matt Palmer", url: "https://alpha.ctlogs.org/"},
"ZZszUPQ7EsxepatOx2XT/ebIgkN3d3jnIAP56yuMMSk=": {operator: "Let's Encrypt", url: "https://oak.ct.letsencrypt.org/2019/"},
"5xLysDd+GmL7jskMYYTx6ns3y1YdESZb8+DzS/JBVG4=": {operator: "Let's Encrypt", url: "https://oak.ct.letsencrypt.org/2020/"},
"lCC8Ho7VjWyIcx+CiyIsDdHaTV5sT5Q9YdtOL1hNosI=": {operator: "Let's Encrypt", url: "https://oak.ct.letsencrypt.org/2021/"},
"36Veq2iCTx9sre64X04+WurNohKkal6OOxLAIERcKnM=": {operator: "Let's Encrypt", url: "https://oak.ct.letsencrypt.org/2022/"},
"tz77JN+cTbp18jnFulj0bF38Qs96nzXEnh0JgSXttJk=": {operator: "Let's Encrypt", url: "https://oak.ct.letsencrypt.org/2023/"},
"hJ9ff1jSv3tU7L10YRzqRcScmPHWSBvG9p6MF08k888=": {operator: "Let's Encrypt", url: "https://testflume.ct.letsencrypt.org/2019/"},
"xj8iGMN9VqaqBrWW2o5T1NcVbR6brI5E0iAt5k1p2dw=": {operator: "Let's Encrypt", url: "https://testflume.ct.letsencrypt.org/2020/"},
"A+3x2pd2tvOMNB457Z1wenVwNpz5hE8yf+nhQTg2G2A=": {operator: "Let's Encrypt", url: "https://testflume.ct.letsencrypt.org/2021/"},
"Iyfv2jUlENvAGe9JGuP/HMWkebzjeHg2DuMYz/tk+Mg=": {operator: "Let's Encrypt", url: "https://testflume.ct.letsencrypt.org/2022/"},
"VTS3q1pqw6fL66ZUh7Ki1xtI9lD6F8UZfJegyyB288Y=": {operator: "Let's Encrypt", url: "https://testflume.ct.letsencrypt.org/2023/"},
"KWr6LVaLyg0uqESVaulyH8Nfo1Xs2plpOq/UWKca790=": {operator: "Let's Encrypt", url: "https://clicky.ct.letsencrypt.org/"},
"sLeEvIHA3cR1ROiD8FmFu5B30TTYq4iysuUzmAuOUIs=": {operator: "Up In The Air Consulting", url: "https://ct.filippo.io/behindthesofa/"},
"R0RHfHXeQm1cRO/UqSyWd1l/ZXqP4MrbxtYW7aSXxCU=": {operator: "Qihoo 360", url: "https://ct.browser.360.cn/2020/"},
"xtftntuOdPCnG01KmEvL66u9KMwf12Mp6IcmzUwlRmM=": {operator: "Qihoo 360", url: "https://ct.browser.360.cn/2021/"},
"ZjywnB/Nm6pidjzLU07sgFgSKAUHrGmkX804z0zHTPE=": {operator: "Qihoo 360", url: "https://ct.browser.360.cn/2022/"},
"4mR/bto0BQPGTU4QqGloH96cWizzsy1fIAuWNgWQiCM=": {operator: "Qihoo 360", url: "https://ct.browser.360.cn/2023/"},
"xc/lS2FRtJsULtJjvecykzY3mXmVUK5ENc0aaZfJw8M=": {operator: "Qihoo 360", url: "https://ct.browser.360.cn/v1/2020/"},
"SBRYfPKLCP5oP9K82UWZTC63TIroyH/OQpt80x1RvcQ=": {operator: "Qihoo 360", url: "https://ct.browser.360.cn/v1/2021/"},
"SRG41hTP09mfFtN2VF7huMz8UR9QnwgLoKCH2R367qk=": {operator: "Qihoo 360", url: "https://ct.browser.360.cn/v1/2022/"},
"tnQLEgAuAz/Q5+lB9Lo+4b/BSbUktM9ijVPv6h9AOo0=": {operator: "Qihoo 360", url: "https://ct.browser.360.cn/v1/2023/"},
"RTWUmNk6ieAoAwjTfWJtxCN1R1jc4DcANvurDt+Ka88=": {operator: "TrustAsia", url: "https://ct.trustasia.com/log1/"},
"pZWUO1NwvukG4AUNH7W7xqQOZfJlroUsdjY/rbIzNu0=": {operator: "TrustAsia", url: "https://ct.trustasia.com/log2020/"},
"qNxS9j1rJCXlMeN89ORKcU8UKiCAOw0E0uLuBmR5SiM=": {operator: "TrustAsia", url: "https://ct2021.trustasia.com/log2021/"},
"Z422Wz50Q7bzo3DV4TqxtDvgoNNR98p0IlDHxvpRqIo=": {operator: "TrustAsia", url: "https://ct.trustasia.com/log2021/"},
"w2X5s2VPMoPHnamOk9dBj1ure+MlLJjh0vBLuetCfSM=": {operator: "TrustAsia", url: "https://ct.trustasia.com/log2022/"},
"6H6nZgvCbPYALvVyXT/g4zG5OTu5L79Y6zuQSdr1Q1o=": {operator: "TrustAsia", url: "https://ct.trustasia.com/log2023/"},
"MG0pV2rSGp1K4SrK2KqKeDqmWjIRYKz/Ww7uTKMgHQU=": {operator: "TrustAsia", url: "https://ct2.trustasia.com/log2024/"},
}
+28 -29
View File
@@ -21,7 +21,6 @@ import (
"bytes"
"crypto/x509"
"encoding/json"
"encoding/pem"
"fmt"
"text/template"
"time"
@@ -125,6 +124,19 @@ URI Names:
Email Addresses:
{{wrapWith .Width "\n\t" (join ", " .EmailAddresses)}}
{{- end}}
{{- range .SCTList}}
Signed Certificate Timestamp:
Version: {{.Version | sctVersion}}
{{- if .LogOperator}}
Log Operator: {{.LogOperator}}
{{- end}}
{{- if .LogURL}}
Log URL: {{.LogURL}}
{{- end}}
Log ID: {{wrapWith 48 "\n\t " (.LogID | hexify)}}
Timestamp: {{.Timestamp | formatTime}}
Signature: {{.SignatureAlgorithm | highlightAlgorithm}}
{{- end}}
{{- if .Warnings}}
Warnings:
{{- range .Warnings}}
@@ -156,34 +168,6 @@ Email Addresses:
Warnings:{{range .Warnings}}
{{. | redify}}{{end}}{{end}}`
type certWithName struct {
name string
file string
cert *x509.Certificate
}
func (c certWithName) MarshalJSON() ([]byte, error) {
out := createSimpleCertificate(c.name, c.cert)
return json.Marshal(out)
}
func createSimpleCertificateFromX509(block *pem.Block) (simpleCertificate, error) {
raw, err := x509.ParseCertificate(block.Bytes)
if err != nil {
return simpleCertificate{}, fmt.Errorf("error reading cert: %s", err)
}
cert := certWithName{cert: raw}
if val, ok := block.Headers[nameHeader]; ok {
cert.name = val
}
if val, ok := block.Headers[fileHeader]; ok {
cert.file = val
}
return createSimpleCertificate(cert.name, cert.cert), nil
}
// EncodeX509ToJSON encodes an X.509 certificate into a JSON string.
func EncodeX509ToJSON(cert *x509.Certificate) []byte {
out := createSimpleCertificate("", cert)
@@ -227,6 +211,8 @@ func displayCert(cert simpleCertificate, verbose bool) []byte {
"oidShort": oidShort,
"printShortName": PrintShortName,
"printCommonName": PrintCommonName,
"formatTime": formatTime,
"sctVersion": sctVersion,
}
for k, v := range extras {
funcMap[k] = v
@@ -291,6 +277,10 @@ func timeString(t time.Time, c *color.Color) string {
return c.SprintfFunc()(t.Format("2006-01-02 15:04 MST"))
}
func formatTime(t time.Time) string {
return t.Format("2006-01-02 15:04 MST")
}
// certStart takes a given start time for the validity of
// a certificate and returns that time colored properly
// based on how close it is to expiry. If it's more than
@@ -363,3 +353,12 @@ func PrintShortName(name pkix.Name) (out string) {
return
}
func sctVersion(v uint64) string {
switch v {
case 0:
return "0 (v1)"
default:
return red.SprintFunc()("%d (unknown)", v)
}
}
+16 -5
View File
@@ -201,6 +201,7 @@ type simpleCertificate struct {
AltIPAddresses []net.IP `json:"ip_addresses,omitempty"`
URINames []string `json:"uri_names,omitempty"`
EmailAddresses []string `json:"email_addresses,omitempty"`
SCTList []*simpleSCT `json:"sct_list,omitempty"`
Warnings []string `json:"warnings,omitempty"`
PEM string `json:"pem,omitempty"`
@@ -208,6 +209,15 @@ type simpleCertificate struct {
Width int `json:"-"`
}
type simpleSCT struct {
Version uint64 `json:"version"`
LogOperator string `json:"log_operator,omitempty"`
LogURL string `json:"log_url,omitempty"`
LogID []byte `json:"log_id"`
Timestamp time.Time `json:"timestamp"`
SignatureAlgorithm simpleSigAlg `json:"signature_algorithm"`
}
type simplePKIXName struct {
Name pkix.Name
KeyID []byte
@@ -240,6 +250,7 @@ func createSimpleCertificate(name string, cert *x509.Certificate) simpleCertific
AltDNSNames: cert.DNSNames,
AltIPAddresses: cert.IPAddresses,
EmailAddresses: cert.EmailAddresses,
SCTList: parseSCTList(cert),
PEM: string(pem.EncodeToMemory(EncodeX509ToPEM(cert, nil))),
}
@@ -363,13 +374,13 @@ func algString(algo x509.SignatureAlgorithm) string {
// decodeKey returns the algorithm and key size for a public key.
func decodeKey(publicKey interface{}) (string, int) {
switch publicKey.(type) {
switch pk := publicKey.(type) {
case *dsa.PublicKey:
return "DSA", publicKey.(*dsa.PublicKey).P.BitLen()
return "DSA", pk.P.BitLen()
case *ecdsa.PublicKey:
return "ECDSA", publicKey.(*ecdsa.PublicKey).Curve.Params().BitSize
return "ECDSA", pk.Curve.Params().BitSize
case *rsa.PublicKey:
return "RSA", publicKey.(*rsa.PublicKey).N.BitLen()
return "RSA", pk.N.BitLen()
default:
return "", 0
}
@@ -398,7 +409,7 @@ func certWarnings(cert *x509.Certificate, uriNames []string) (warnings []string)
}
if len(cert.DNSNames) == 0 && len(cert.IPAddresses) == 0 && len(uriNames) == 0 && !cert.IsCA {
warnings = append(warnings, fmt.Sprintf("Certificate doesn't have any valid DNS/URI names or IP addresses set"))
warnings = append(warnings, "Certificate doesn't have any valid DNS/URI names or IP addresses set")
}
if len(cert.UnhandledCriticalExtensions) > 0 {
+24
View File
@@ -147,6 +147,30 @@ Dump a live cert chain (squareup-chain.crt)
\taccount.squareup.com, mkt.com, www.mkt.com, (esc)
\tmarket.squareup.com, gosq.com, www.gosq.com, (esc)
\tgosq.co, www.gosq.co (esc)
Signed Certificate Timestamp:
\tVersion: 0 (v1) (esc)
\tLog Operator: Google (esc)
\tLog URL: https://ct.googleapis.com/aviator/ (esc)
\tLog ID: 68:F6:98:F8:1F:64:82:BE:3A:8C:EE:B9:28:1D:4C:FC: (esc)
\t 71:51:5D:67:93:D4:44:D1:0A:67:AC:BB:4F:4F:FB:C4 (esc)
\tTimestamp: 2016-07-15 20:45 GMT (esc)
\tSignature: ECDSA-SHA256 (esc)
Signed Certificate Timestamp:
\tVersion: 0 (v1) (esc)
\tLog Operator: DigiCert (esc)
\tLog URL: https://ct1.digicert-ct.com/log/ (esc)
\tLog ID: 56:14:06:9A:2F:D7:C2:EC:D3:F5:E1:BD:44:B2:3E:C7: (esc)
\t 46:76:B9:BC:99:11:5C:C0:EF:94:98:55:D6:89:D0:DD (esc)
\tTimestamp: 2016-07-15 20:45 GMT (esc)
\tSignature: ECDSA-SHA256 (esc)
Signed Certificate Timestamp:
\tVersion: 0 (v1) (esc)
\tLog Operator: Google (esc)
\tLog URL: https://ct.googleapis.com/pilot/ (esc)
\tLog ID: A4:B9:09:90:B4:18:58:14:87:BB:13:A2:CC:67:70:0A: (esc)
\t 3C:35:98:04:F9:1B:DF:B8:E3:77:CD:0E:C8:0D:DC:10 (esc)
\tTimestamp: 2016-07-15 20:45 GMT (esc)
\tSignature: ECDSA-SHA256 (esc)
** CERTIFICATE 2 **
Input Format: PEM
+1 -1
View File
@@ -106,4 +106,4 @@ Set up test data.
> EOF
Dump a live cert chain (squareup-chain.crt) with leaf flag
$ certigo --verbose dump squareup-chain.crt --json --first
{"certificates":[{"serial":"260680855742043049380997676879525498489","not_before":"2016-07-15T20:15:52Z","not_after":"2017-07-31T20:45:50Z","signature_algorithm":"SHA256-RSA","is_self_signed":false,"subject":{"business_category":["Private Organization"],"common_name":"www.squareup.com","country":["US"],"ev_country":["US"],"ev_province":["Delaware"],"ev_registration_number":"4699855","key_id":"D4:17:14:6F:0B:C5:20:A1:D6:FE:21:7E:DC:9E:F8:57:9C:ED:AE:6A","locality":["San Francisco"],"organization":["Square, Inc."],"province":["California"]},"issuer":{"common_name":"Entrust Certification Authority - L1M","country":["US"],"key_id":"C3:F7:D0:B5:2A:30:AD:AF:0D:91:21:70:39:54:DD:BC:89:70:C7:3A","organization":["Entrust, Inc."],"organizational_unit":["See www.entrust.net/legal-terms","(c) 2014 Entrust, Inc. - for authorized use only"]},"basic_constraints":{"is_ca":false},"ocsp_server":["http://ocsp.entrust.net"],"issuing_certificate":["http://aia.entrust.net/l1m-chain256.cer"],"key_usage":["Digital Signature","Key Encipherment"],"extended_key_usage":["Server Auth","Client Auth"],"dns_names":["www.squareup.com","squareup.com","account.squareup.com","mkt.com","www.mkt.com","market.squareup.com","gosq.com","www.gosq.com","gosq.co","www.gosq.co"],"pem":"-----BEGIN CERTIFICATE-----\nMIIHnjCCBoagAwIBAgIRAMQdTn1Z7px7AAAAAFTMznkwDQYJKoZIhvcNAQELBQAw\ngboxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQL\nEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykg\nMjAxNCBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxLjAs\nBgNVBAMTJUVudHJ1c3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBMMU0wHhcN\nMTYwNzE1MjAxNTUyWhcNMTcwNzMxMjA0NTUwWjCBzTELMAkGA1UEBhMCVVMxEzAR\nBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28xEzARBgsr\nBgEEAYI3PAIBAxMCVVMxGTAXBgsrBgEEAYI3PAIBAhMIRGVsYXdhcmUxFTATBgNV\nBAoTDFNxdWFyZSwgSW5jLjEdMBsGA1UEDxMUUHJpdmF0ZSBPcmdhbml6YXRpb24x\nEDAOBgNVBAUTBzQ2OTk4NTUxGTAXBgNVBAMTEHd3dy5zcXVhcmV1cC5jb20wggEi\nMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDk+qX7IYPlzj+SJijzKDSOEh5x\nLDyVq6N8k+5bgSISr9pXbhJB2yFDsvzHn+s67B5x2jjwUfvvMYnS8Aad73UqeVJQ\n5zPhLh9TL0U6ltgVUbKeVvxcZlGVj34WgqDJL3rMAEAJzDPZJ/Td/GNBWtrDOpdZ\nGQoNwdf/xK26ep/RKiqJWjCDBVd8Grxq0xqxaNvdml6mMJS49s5Ku5e5kvHwq7E7\nsVX79h1k3IfYgPM5VFU0CLxBVwXwg2eQrDxxbQbgqf+am5vBaEB0olCIPrp4WImv\n2B5cQa5/9AjXihCusXmyvDp0UBZOoFy1D6La1eJyMxgUK3uj2C+Z2DkdpythAgMB\nAAGjggOIMIIDhDCBmgYDVR0RBIGSMIGPghB3d3cuc3F1YXJldXAuY29tggxzcXVh\ncmV1cC5jb22CFGFjY291bnQuc3F1YXJldXAuY29tggdta3QuY29tggt3d3cubWt0\nLmNvbYITbWFya2V0LnNxdWFyZXVwLmNvbYIIZ29zcS5jb22CDHd3dy5nb3NxLmNv\nbYIHZ29zcS5jb4ILd3d3Lmdvc3EuY28wggF+BgorBgEEAdZ5AgQCBIIBbgSCAWoB\naAB2AGj2mPgfZIK+OozuuSgdTPxxUV1nk9RE0QpnrLtPT/vEAAABVfBO8foAAAQD\nAEcwRQIgHRuE49MQdG9gn47iHetv5bNzKLcaP9uReKBa/0c7luECIQCE/Km4MXBr\n1fTTezjnGD5ZTxdcfnuStsy2FejS0ldWUQB2AFYUBpov18Ls0/XhvUSyPsdGdrm8\nmRFcwO+UmFXWidDdAAABVfBO9scAAAQDAEcwRQIgWG3bnNz07rT7yjGdjvCC6F9i\naiBxsWpnLmYxc0ycrogCIQD7a1RbCM8o+bGbTRmpZv9Z5M6beO+eoC/TXDFZdK58\nJAB2AKS5CZC0GFgUh7sTosxncAo8NZgE+RvfuON3zQ7IDdwQAAABVfBO+BQAAAQD\nAEcwRQIgVmnuQ6nwHIwGcXRAqXVvqAQJkdzbe5DpCYM/e5FD15wCIQCdGxXNam6p\nxblJX2oUnPdsxfUvP++u94bgKgJDUdDMgDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0l\nBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMGgGCCsGAQUFBwEBBFwwWjAjBggrBgEF\nBQcwAYYXaHR0cDovL29jc3AuZW50cnVzdC5uZXQwMwYIKwYBBQUHMAKGJ2h0dHA6\nLy9haWEuZW50cnVzdC5uZXQvbDFtLWNoYWluMjU2LmNlcjAzBgNVHR8ELDAqMCig\nJqAkhiJodHRwOi8vY3JsLmVudHJ1c3QubmV0L2xldmVsMW0uY3JsMEoGA1UdIARD\nMEEwNgYKYIZIAYb6bAoBAjAoMCYGCCsGAQUFBwIBFhpodHRwOi8vd3d3LmVudHJ1\nc3QubmV0L3JwYTAHBgVngQwBATAfBgNVHSMEGDAWgBTD99C1KjCtrw2RIXA5VN28\niXDHOjAdBgNVHQ4EFgQU1BcUbwvFIKHW/iF+3J74V5ztrmowCQYDVR0TBAIwADAN\nBgkqhkiG9w0BAQsFAAOCAQEAhb0ixKT20fiDn+0tjAM/WeqQZpQRyQFT1jIK8ERI\nHsTeEV291SiLaatV6laocpx7R/JgwAQc1bPItf3HguhetWeXSTFDBQyy4InN0ceB\nRQJDPl6gcmq9xC9KMgMgXmh0FDrG2yMHRC3Qz9dSPDTPTNrCjLvW1PPK0o1pQ9cz\nISdRtVnLz6/3tkx/bUNkT1TQ6mpslx5CBqyZS8LHzLr13Ei8D5P6RhsKXT6JS3Ki\nG2TfXmg9UFgsiNho7aRpLhyI66wNB+akENKPk0n23RkxpYkRtIcFUY9LIYBbvGHT\nQq1IhY7LwcjCwcGePa0CtcnnwrA6jPnlEpTR6bh1NW5IaA==\n-----END CERTIFICATE-----\n"}]}
{"certificates":[{"serial":"260680855742043049380997676879525498489","not_before":"2016-07-15T20:15:52Z","not_after":"2017-07-31T20:45:50Z","signature_algorithm":"SHA256-RSA","is_self_signed":false,"subject":{"business_category":["Private Organization"],"common_name":"www.squareup.com","country":["US"],"ev_country":["US"],"ev_province":["Delaware"],"ev_registration_number":"4699855","key_id":"D4:17:14:6F:0B:C5:20:A1:D6:FE:21:7E:DC:9E:F8:57:9C:ED:AE:6A","locality":["San Francisco"],"organization":["Square, Inc."],"province":["California"]},"issuer":{"common_name":"Entrust Certification Authority - L1M","country":["US"],"key_id":"C3:F7:D0:B5:2A:30:AD:AF:0D:91:21:70:39:54:DD:BC:89:70:C7:3A","organization":["Entrust, Inc."],"organizational_unit":["See www.entrust.net/legal-terms","(c) 2014 Entrust, Inc. - for authorized use only"]},"basic_constraints":{"is_ca":false},"ocsp_server":["http://ocsp.entrust.net"],"issuing_certificate":["http://aia.entrust.net/l1m-chain256.cer"],"key_usage":["Digital Signature","Key Encipherment"],"extended_key_usage":["Server Auth","Client Auth"],"dns_names":["www.squareup.com","squareup.com","account.squareup.com","mkt.com","www.mkt.com","market.squareup.com","gosq.com","www.gosq.com","gosq.co","www.gosq.co"],"sct_list":[{"version":0,"log_operator":"Google","log_url":"https://ct.googleapis.com/aviator/","log_id":"aPaY+B9kgr46jO65KB1M/HFRXWeT1ETRCmesu09P+8Q=","timestamp":"2016-07-15T20:45:53.53Z","signature_algorithm":"ECDSA-SHA256"},{"version":0,"log_operator":"DigiCert","log_url":"https://ct1.digicert-ct.com/log/","log_id":"VhQGmi/XwuzT9eG9RLI+x0Z2ubyZEVzA75SYVdaJ0N0=","timestamp":"2016-07-15T20:45:54.759Z","signature_algorithm":"ECDSA-SHA256"},{"version":0,"log_operator":"Google","log_url":"https://ct.googleapis.com/pilot/","log_id":"pLkJkLQYWBSHuxOizGdwCjw1mAT5G9+443fNDsgN3BA=","timestamp":"2016-07-15T20:45:55.092Z","signature_algorithm":"ECDSA-SHA256"}],"pem":"-----BEGIN CERTIFICATE-----\nMIIHnjCCBoagAwIBAgIRAMQdTn1Z7px7AAAAAFTMznkwDQYJKoZIhvcNAQELBQAw\ngboxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQL\nEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykg\nMjAxNCBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxLjAs\nBgNVBAMTJUVudHJ1c3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBMMU0wHhcN\nMTYwNzE1MjAxNTUyWhcNMTcwNzMxMjA0NTUwWjCBzTELMAkGA1UEBhMCVVMxEzAR\nBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28xEzARBgsr\nBgEEAYI3PAIBAxMCVVMxGTAXBgsrBgEEAYI3PAIBAhMIRGVsYXdhcmUxFTATBgNV\nBAoTDFNxdWFyZSwgSW5jLjEdMBsGA1UEDxMUUHJpdmF0ZSBPcmdhbml6YXRpb24x\nEDAOBgNVBAUTBzQ2OTk4NTUxGTAXBgNVBAMTEHd3dy5zcXVhcmV1cC5jb20wggEi\nMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDk+qX7IYPlzj+SJijzKDSOEh5x\nLDyVq6N8k+5bgSISr9pXbhJB2yFDsvzHn+s67B5x2jjwUfvvMYnS8Aad73UqeVJQ\n5zPhLh9TL0U6ltgVUbKeVvxcZlGVj34WgqDJL3rMAEAJzDPZJ/Td/GNBWtrDOpdZ\nGQoNwdf/xK26ep/RKiqJWjCDBVd8Grxq0xqxaNvdml6mMJS49s5Ku5e5kvHwq7E7\nsVX79h1k3IfYgPM5VFU0CLxBVwXwg2eQrDxxbQbgqf+am5vBaEB0olCIPrp4WImv\n2B5cQa5/9AjXihCusXmyvDp0UBZOoFy1D6La1eJyMxgUK3uj2C+Z2DkdpythAgMB\nAAGjggOIMIIDhDCBmgYDVR0RBIGSMIGPghB3d3cuc3F1YXJldXAuY29tggxzcXVh\ncmV1cC5jb22CFGFjY291bnQuc3F1YXJldXAuY29tggdta3QuY29tggt3d3cubWt0\nLmNvbYITbWFya2V0LnNxdWFyZXVwLmNvbYIIZ29zcS5jb22CDHd3dy5nb3NxLmNv\nbYIHZ29zcS5jb4ILd3d3Lmdvc3EuY28wggF+BgorBgEEAdZ5AgQCBIIBbgSCAWoB\naAB2AGj2mPgfZIK+OozuuSgdTPxxUV1nk9RE0QpnrLtPT/vEAAABVfBO8foAAAQD\nAEcwRQIgHRuE49MQdG9gn47iHetv5bNzKLcaP9uReKBa/0c7luECIQCE/Km4MXBr\n1fTTezjnGD5ZTxdcfnuStsy2FejS0ldWUQB2AFYUBpov18Ls0/XhvUSyPsdGdrm8\nmRFcwO+UmFXWidDdAAABVfBO9scAAAQDAEcwRQIgWG3bnNz07rT7yjGdjvCC6F9i\naiBxsWpnLmYxc0ycrogCIQD7a1RbCM8o+bGbTRmpZv9Z5M6beO+eoC/TXDFZdK58\nJAB2AKS5CZC0GFgUh7sTosxncAo8NZgE+RvfuON3zQ7IDdwQAAABVfBO+BQAAAQD\nAEcwRQIgVmnuQ6nwHIwGcXRAqXVvqAQJkdzbe5DpCYM/e5FD15wCIQCdGxXNam6p\nxblJX2oUnPdsxfUvP++u94bgKgJDUdDMgDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0l\nBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMGgGCCsGAQUFBwEBBFwwWjAjBggrBgEF\nBQcwAYYXaHR0cDovL29jc3AuZW50cnVzdC5uZXQwMwYIKwYBBQUHMAKGJ2h0dHA6\nLy9haWEuZW50cnVzdC5uZXQvbDFtLWNoYWluMjU2LmNlcjAzBgNVHR8ELDAqMCig\nJqAkhiJodHRwOi8vY3JsLmVudHJ1c3QubmV0L2xldmVsMW0uY3JsMEoGA1UdIARD\nMEEwNgYKYIZIAYb6bAoBAjAoMCYGCCsGAQUFBwIBFhpodHRwOi8vd3d3LmVudHJ1\nc3QubmV0L3JwYTAHBgVngQwBATAfBgNVHSMEGDAWgBTD99C1KjCtrw2RIXA5VN28\niXDHOjAdBgNVHQ4EFgQU1BcUbwvFIKHW/iF+3J74V5ztrmowCQYDVR0TBAIwADAN\nBgkqhkiG9w0BAQsFAAOCAQEAhb0ixKT20fiDn+0tjAM/WeqQZpQRyQFT1jIK8ERI\nHsTeEV291SiLaatV6laocpx7R/JgwAQc1bPItf3HguhetWeXSTFDBQyy4InN0ceB\nRQJDPl6gcmq9xC9KMgMgXmh0FDrG2yMHRC3Qz9dSPDTPTNrCjLvW1PPK0o1pQ9cz\nISdRtVnLz6/3tkx/bUNkT1TQ6mpslx5CBqyZS8LHzLr13Ei8D5P6RhsKXT6JS3Ki\nG2TfXmg9UFgsiNho7aRpLhyI66wNB+akENKPk0n23RkxpYkRtIcFUY9LIYBbvGHT\nQq1IhY7LwcjCwcGePa0CtcnnwrA6jPnlEpTR6bh1NW5IaA==\n-----END CERTIFICATE-----\n"}]}
+24
View File
@@ -147,4 +147,28 @@ Dump a live cert chain (squareup-chain.crt) with leaf flag
\taccount.squareup.com, mkt.com, www.mkt.com, (esc)
\tmarket.squareup.com, gosq.com, www.gosq.com, (esc)
\tgosq.co, www.gosq.co (esc)
Signed Certificate Timestamp:
\tVersion: 0 (v1) (esc)
\tLog Operator: Google (esc)
\tLog URL: https://ct.googleapis.com/aviator/ (esc)
\tLog ID: 68:F6:98:F8:1F:64:82:BE:3A:8C:EE:B9:28:1D:4C:FC: (esc)
\t 71:51:5D:67:93:D4:44:D1:0A:67:AC:BB:4F:4F:FB:C4 (esc)
\tTimestamp: 2016-07-15 20:45 GMT (esc)
\tSignature: ECDSA-SHA256 (esc)
Signed Certificate Timestamp:
\tVersion: 0 (v1) (esc)
\tLog Operator: DigiCert (esc)
\tLog URL: https://ct1.digicert-ct.com/log/ (esc)
\tLog ID: 56:14:06:9A:2F:D7:C2:EC:D3:F5:E1:BD:44:B2:3E:C7: (esc)
\t 46:76:B9:BC:99:11:5C:C0:EF:94:98:55:D6:89:D0:DD (esc)
\tTimestamp: 2016-07-15 20:45 GMT (esc)
\tSignature: ECDSA-SHA256 (esc)
Signed Certificate Timestamp:
\tVersion: 0 (v1) (esc)
\tLog Operator: Google (esc)
\tLog URL: https://ct.googleapis.com/pilot/ (esc)
\tLog ID: A4:B9:09:90:B4:18:58:14:87:BB:13:A2:CC:67:70:0A: (esc)
\t 3C:35:98:04:F9:1B:DF:B8:E3:77:CD:0E:C8:0D:DC:10 (esc)
\tTimestamp: 2016-07-15 20:45 GMT (esc)
\tSignature: ECDSA-SHA256 (esc)