{"id":28425118,"url":"https://github.com/letsencrypt/x509search","last_synced_at":"2025-07-21T20:31:12.702Z","repository":{"id":295963783,"uuid":"880496606","full_name":"letsencrypt/x509search","owner":"letsencrypt","description":"A library to build custom search tools for X.509 certificates","archived":false,"fork":false,"pushed_at":"2025-05-06T23:19:59.000Z","size":31,"stargazers_count":3,"open_issues_count":1,"forks_count":1,"subscribers_count":9,"default_branch":"main","last_synced_at":"2025-06-25T16:42:46.321Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/letsencrypt.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-10-29T20:41:06.000Z","updated_at":"2025-04-04T04:20:34.000Z","dependencies_parsed_at":"2025-05-28T09:35:06.698Z","dependency_job_id":"7ee93de9-a33d-4438-8929-04e9887ce0cd","html_url":"https://github.com/letsencrypt/x509search","commit_stats":null,"previous_names":["letsencrypt/x509search"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/letsencrypt/x509search","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/letsencrypt%2Fx509search","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/letsencrypt%2Fx509search/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/letsencrypt%2Fx509search/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/letsencrypt%2Fx509search/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/letsencrypt","download_url":"https://codeload.github.com/letsencrypt/x509search/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/letsencrypt%2Fx509search/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266374925,"owners_count":23919493,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-21T11:47:31.412Z","response_time":64,"last_error":null,"robots_txt_status":null,"robots_txt_updated_at":null,"robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-06-05T10:36:18.436Z","updated_at":"2025-07-21T20:31:12.674Z","avatar_url":"https://github.com/letsencrypt.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# x509search\n\nA library to build custom search tools for X.509 certificates\n\n## Usage\n\nHere's an example of using x509search to scan through a tiled CT log for\nprecertificates issued by Let's Encrypt:\n\n```go\npackage main\n\nimport (\n\t\"context\"\n\t\"crypto/x509\"\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/letsencrypt/x509search\"\n\t\"github.com/letsencrypt/x509search/staticctapi\"\n)\n\nfunc main() {\n\trome2025h1, err := staticctapi.NewLog(\"https://rome2025h1.fly.storage.tigris.dev/\")\n\tif err != nil {\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\tos.Exit(1)\n\t}\n\n\tnow := time.Now()\n\tsearch := x509search.Search{\n\t\t// Filter by the Organization Name of the certificate issuer\n\t\tFilter: func(cert *x509.Certificate) bool {\n\t\t\tif len(cert.Issuer.Organization) != 1 {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn cert.Issuer.Organization[0] == \"Let's Encrypt\"\n\t\t},\n\t\t// Print out the issuer and subject info every time there's a match\n\t\tMatchCallback: func(cert *x509.Certificate) {\n\t\t\tfmt.Printf(\"Issuer: %s Subject: %s\\n\", cert.Issuer.String(), cert.Subject.String())\n\t\t},\n\t\t// Configure a single data source: the Rome2025h1 tiled log\n\t\tDataSources: []x509search.Sourcer{\n\t\t\tstaticctapi.DataSource{\n\t\t\t\tLog:                    rome2025h1,\n\t\t\t\tIncludePrecertificates: true,\n\t\t\t\tIncludeCertificates:    false,\n\t\t\t\tStartTimeInclusive:     now.Add(-3*time.Hour - 1*time.Minute),\n\t\t\t\tEndTimeInclusive:       now.Add(-3 * time.Hour),\n\t\t\t\tMaxConnections:         10,\n\t\t\t},\n\t\t},\n\t}\n\n\tsearch.Execute(context.Background())\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fletsencrypt%2Fx509search","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fletsencrypt%2Fx509search","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fletsencrypt%2Fx509search/lists"}