{"id":37029156,"url":"https://github.com/tomitribe/churchkey","last_synced_at":"2026-01-14T03:29:49.063Z","repository":{"id":47049661,"uuid":"129688692","full_name":"tomitribe/churchkey","owner":"tomitribe","description":"Library to open various key files such as OpenSSH and PEM","archived":false,"fork":false,"pushed_at":"2024-03-15T14:25:22.000Z","size":1234,"stargazers_count":5,"open_issues_count":3,"forks_count":3,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-11-07T02:00:45.203Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tomitribe.png","metadata":{"files":{"readme":"README.adoc","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-04-16T05:23:15.000Z","updated_at":"2022-05-14T19:00:55.000Z","dependencies_parsed_at":"2022-09-07T19:41:14.245Z","dependency_job_id":null,"html_url":"https://github.com/tomitribe/churchkey","commit_stats":null,"previous_names":[],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/tomitribe/churchkey","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomitribe%2Fchurchkey","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomitribe%2Fchurchkey/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomitribe%2Fchurchkey/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomitribe%2Fchurchkey/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tomitribe","download_url":"https://codeload.github.com/tomitribe/churchkey/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomitribe%2Fchurchkey/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28408843,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T01:52:23.358Z","status":"online","status_checked_at":"2026-01-14T02:00:06.678Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","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":"2026-01-14T03:29:48.037Z","updated_at":"2026-01-14T03:29:49.052Z","avatar_url":"https://github.com/tomitribe.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Churchkey\n\nChurchkey is a Java library that can parse and export public and private key files in several formats including:\n\n  - JSON Web Key (JWK)\n  - PEM\n  - OpenSSH\n  - SSH2\n\n## Reading keys\n\n*Step 1* Pass the bytes of the key file to Churchkey. No need to tell Churchkey what kind of key it is.\n\n[source,java]\n----\nfinal String pemFile = \"\" +\n        \"-----BEGIN PUBLIC KEY-----\\n\" +\n        \"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyzNurU19lqnYhx5QI72sIX1lh\\n\" +\n        \"8cTehTmboC+DLG7UuaUHqs096M754HtP2IiHFcIQqwYNzHgKmjmfGdbk9JBkz/DN\\n\" +\n        \"eDVsA5nc7qTnsSgULXTxwHSF286IJdco5kasaJm4Xurlm3V+2oiTugraBsi1J0Ht\\n\" +\n        \"0OtHgJIlIaGxK7mY/QIDAQAB\\n\" +\n        \"-----END PUBLIC KEY-----\\n\";\n\nfinal Key key = Keys.decode(pemFile.getBytes());\n----\n\n*Step 2* Churchkey will parse the contents of the key file and tell you what kind of key it found!\n\n[source,java]\n----\nAssert.assertEquals(Key.Algorithm.RSA, key.getAlgorithm());\nAssert.assertEquals(Key.Format.PEM, key.getFormat());\nAssert.assertEquals(Key.Type.PUBLIC, key.getType());\n----\n\n*Step 3*  You can then cast the key to the correct java.security interface\n\n[source,java]\n----\nAssert.assertTrue(key.getKey() instanceof RSAPublicKey);\n----\n\nSee the complete link:https://github.com/tomitribe/churchkey/blob/master/src/test/java/org/supertribe/ExampleTest.java#L39[source]\n\n## Writing/Converting Keys\n\nThe following will read (decode) a PEM file and then convert (encode) it to a JWK format\n\n[source,java]\n----\n// Read the PEM file\nfinal Key key = Keys.decode(pemFile.getBytes());\n\n// Write the key as JWK\nfinal byte[] jwkBytes = key.encode(Key.Format.JWK);\n\nfinal String jwk = new String(jwkBytes);\n\nfinal String expected = \"\" +\n        \"{\\n\" +\n        \"  \\\"kty\\\": \\\"RSA\\\",\\n\" +\n        \"  \\\"e\\\": \\\"AQAB\\\",\\n\" +\n        \"  \\\"n\\\": \\\"sszbq1NfZap2IceUCO9rCF9ZYfHE3oU5m6Avgyxu1LmlB6rNPejO-eB7T9i\" +\n        \"IhxXCEKsGDcx4Cpo5nxnW5PSQZM_wzXg1bAOZ3O6k57EoFC108cB0hdvOiCXXKOZGrGiZu\" +\n        \"F7q5Zt1ftqIk7oK2gbItSdB7dDrR4CSJSGhsSu5mP0\\\"\\n\" +\n        \"}\\n\";\n\nJsonAsserts.assertJson(expected, jwk);\n----\n\nSee the complete link:https://github.com/tomitribe/churchkey/blob/master/src/test/java/org/supertribe/Pem2JwkTest.java#L48[source]\n\n## Get the Public key from a Private key\n\nThe following will read (decode) a private key PEM file and then obtain and write out the public PEM.\n\n[source,java]\n----\nfinal String pemFile = \"\" +\n        \"-----BEGIN EC PRIVATE KEY-----\\n\" +\n        \"MHcCAQEEIDV2ischPSu7JmDEhNlW9KpUiYl3AAANcMxRIEAxqk6hoAoGCCqGSM49\\n\" +\n        \"AwEHoUQDQgAERUSiTdfyjPPvepCpRGirABPcUo8QBaMJHoRf4D3XWBryDRMCZU20\\n\" +\n        \"GPXomXCQbIxJZtkOULn918lHK/CvytRW9A==\\n\" +\n        \"-----END EC PRIVATE KEY-----\\n\";\n\n// Read the PEM file\nfinal Key key = Keys.decode(pemFile.getBytes());\n\n// Get the public key\nfinal Key publicKey = key.getPublicKey();\n\n// Write the public key as PEM (or any other format)\nfinal byte[] encoded = publicKey.encode(Key.Format.PEM);\n\nassertEquals(\"\" +\n        \"-----BEGIN PUBLIC KEY-----\\n\" +\n        \"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAERUSiTdfyjPPvepCpRGirABPcUo8Q\\n\" +\n        \"BaMJHoRf4D3XWBryDRMCZU20GPXomXCQbIxJZtkOULn918lHK/CvytRW9A==\\n\" +\n        \"-----END PUBLIC KEY-----\\n\", new String(encoded));\n----\n\nSee the complete link:https://github.com/tomitribe/churchkey/blob/master/src/test/java/org/supertribe/PublicFromPrivateTest.java#L41[source]\n\n\n## Supported Key Formats\nChurchkey is a Java library that can read RSA and DSA that look like any of the following:\n\n### JSON Web Key (JWK)\n\n[source,json]\n----\n{\n  \"kty\": \"RSA\",\n  \"n\": \"sszbq1NfZap2IceUCO9rCF9ZYfHE3oU5m6Avgyxu1LmlB6rNPejO-eB7T9iIhxXCEKsGDcx4Cpo5nxnW5PSQZM_wzXg1bAOZ3O6k57EoFC108cB0hdvOiCXXKOZGrGiZuF7q5Zt1ftqIk7oK2gbItSdB7dDrR4CSJSGhsSu5mP0\",\n  \"e\": \"AQAB\",\n  \"d\": \"VWV8gV5nkMISe927eW0IHM6VfS8gzPqqYgbmymq9YIJuLLRKJIh92mB55M_RnVsp_hYA5TREHSQ94xxPQ7j_ASohev1Etv7Hr9AFixa7Q6sRdT1DY7YO1kf_wLk0Urg2bHrvAvukcmBAV9-OHKDkRUY-e03ZK3cCfetsHP41RmE\",\n  \"p\": \"6Uj9tL8PB-8nDschkBJUjjFdBpG_CgewLJwoDYc8WSbGUlw9uigZGXNHw5XSG_JI9V0T9HwfePryq11Gyg6fJQ\",\n  \"q\": \"xDW-MI04a6Kb1gZD-ud0PrSuWAwzpBP_j0BQQwElSWbaDuJXJsSu11TYBeHYrWqvE2Gi7CAKrMy8MwnYRoM2-Q\",\n  \"dp\": \"EcJBtgm5XjRBd-mGz43lq_FsEHz12xCcw7ibf_QkjvDZthlZhZtZ1csl0mjMVt5J2YvdYgY06yPHZ24xXl5glQ\",\n  \"dq\": \"w2eShd_etLM456lNwm8HgfuHNgDQ3TNdbFjslg5qB_P6bqBTkzSFu8WvbgxCMlLxEShHjUlL2FP9igbf8Tl0YQ\",\n  \"qi\": \"yTa2sQrLQCFkLuc3Zi-0xIHyD-ohb1WDLiT08H1dSPfx-Y5l8pNn_fG7N5GWFic-ae5h-GKbX14e4MAE5fYgKA\"\n}\n----\n\n### Various PEM Files\n----\n-----BEGIN RSA PRIVATE KEY-----\nMIICXQIBAAKBgQCyzNurU19lqnYhx5QI72sIX1lh8cTehTmboC+DLG7UuaUHqs09\n6M754HtP2IiHFcIQqwYNzHgKmjmfGdbk9JBkz/DNeDVsA5nc7qTnsSgULXTxwHSF\n286IJdco5kasaJm4Xurlm3V+2oiTugraBsi1J0Ht0OtHgJIlIaGxK7mY/QIDAQAB\nAoGAVWV8gV5nkMISe927eW0IHM6VfS8gzPqqYgbmymq9YIJuLLRKJIh92mB55M/R\n...\n-----END RSA PRIVATE KEY-----\n----\n\n----\n-----BEGIN RSA PUBLIC KEY-----\nMIGJAoGBALLM26tTX2WqdiHHlAjvawhfWWHxxN6FOZugL4MsbtS5pQeqzT3ozvng\ne0/YiIcVwhCrBg3MeAqaOZ8Z1uT0kGTP8M14NWwDmdzupOexKBQtdPHAdIXbzogl\n1yjmRqxombhe6uWbdX7aiJO6CtoGyLUnQe3Q60eAkiUhobEruZj9AgMBAAE=\n-----END RSA PUBLIC KEY-----\n----\n\n----\n-----BEGIN DSA PRIVATE KEY-----\nMIIBugIBAAKBgQDfcPOECx1ps5f4GNl4fwpzO4X07FJemfPTVJoThX7P8MzueD5f\nOKio1ppYSTvVRhcLDEW8NBKhoEtXgZ4L/g0f3jADftCpy0z0zRGoyj/4m00X97CN\n0X+1E2IUqe1ua+RQfEzd/XIYPSUFEe3NACznW8gy/HfsoQeUsyxAFkOEEwIVAJy7\n...\n-----END DSA PRIVATE KEY-----\n----\n\n----\n-----BEGIN PRIVATE KEY-----\nMIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBALLM26tTX2WqdiHH\nlAjvawhfWWHxxN6FOZugL4MsbtS5pQeqzT3ozvnge0/YiIcVwhCrBg3MeAqaOZ8Z\n1uT0kGTP8M14NWwDmdzupOexKBQtdPHAdIXbzogl1yjmRqxombhe6uWbdX7aiJO6\nCtoGyLUnQe3Q60eAkiUhobEruZj9AgMBAAECgYBVZXyBXmeQwhJ73bt5bQgczpV9\n...\n-----END PRIVATE KEY-----\n----\n\n----\n-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyzNurU19lqnYhx5QI72sIX1lh\n8cTehTmboC+DLG7UuaUHqs096M754HtP2IiHFcIQqwYNzHgKmjmfGdbk9JBkz/DN\neDVsA5nc7qTnsSgULXTxwHSF286IJdco5kasaJm4Xurlm3V+2oiTugraBsi1J0Ht\n0OtHgJIlIaGxK7mY/QIDAQAB\n-----END PUBLIC KEY-----\n----\n\n### OpenSSH\n\nCommon locations for these would be in:\n\n - `~/.ssh/id_rsa` (PEM format shown above)\n - `~/.ssh/id_rsa.pub` (`ssh-` format shown here)\n\n----\nssh-dss AAAAB3NzaC1kc3MAAACBAN9w84QLHWmzl/gY2Xh/CnM7hfTsUl6Z89NUmhOFfs/wzO54Pl84qKjWmlhJO9VGFwsMRbw0EqGgS1eBngv+DR/eMAN+0KnLTPTNEajKP/ibTRf3sI3Rf7UTYhSp7W5r5FB8TN39chg9JQUR7c0ALOdbyDL8d+yhB5SzLEAWQ4QTAAAAFQCcu9GKMJJyX8go6w1gn93Xi1/EDwAAAIBJYC9VGyg80b7DF8+fHKfezGEjjRgJOVMJQA946vA3A+cntFUU+Y1LayXJ2y... dblevins@mingus.lan\n----\n\n----\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQCyzNurU19lqnYhx5QI72sIX1lh8cTehTmboC+DLG7UuaUHqs096M754HtP2IiHFcIQqwYNzHgKmjmfGdbk9JBkz/DNeDVsA5nc7qTnsSgULXTxwHSF286IJdco5kasaJm4Xurlm3V+2oiTugraBsi1J0Ht0OtHgJIlIaGxK7mY/Q== dblevins@mingus.lan\n----\n\n### SSH2\n\nCommonly mistaken for PEM, but different.\n\n----\n---- BEGIN SSH2 PUBLIC KEY ----\nComment: \"1024-bit RSA, converted by dblevins@mingus.lan from OpenSSH\"\nAAAAB3NzaC1yc2EAAAADAQABAAAAgQCyzNurU19lqnYhx5QI72sIX1lh8cTehTmboC+DLG\n7UuaUHqs096M754HtP2IiHFcIQqwYNzHgKmjmfGdbk9JBkz/DNeDVsA5nc7qTnsSgULXTx\nwHSF286IJdco5kasaJm4Xurlm3V+2oiTugraBsi1J0Ht0OtHgJIlIaGxK7mY/Q==\n---- END SSH2 PUBLIC KEY ----\n----\n\n## Maven Coordinates\n\n[source,xml]\n----\n\u003cdependency\u003e\n  \u003cgroupId\u003eio.churchkey\u003c/groupId\u003e\n  \u003cartifactId\u003echurchkey\u003c/artifactId\u003e\n  \u003cversion\u003e1.21\u003c/version\u003e\n\u003c/dependency\u003e\n----\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftomitribe%2Fchurchkey","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftomitribe%2Fchurchkey","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftomitribe%2Fchurchkey/lists"}