{"id":21801396,"url":"https://github.com/jimmy-park/cert-cmake","last_synced_at":"2026-05-19T00:02:48.697Z","repository":{"id":149123968,"uuid":"600827256","full_name":"jimmy-park/cert-cmake","owner":"jimmy-park","description":"Generate cert.h for loading in-memory cert","archived":false,"fork":false,"pushed_at":"2025-03-01T04:39:16.000Z","size":50,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-01T05:23:51.988Z","etag":null,"topics":["certificate","cmake","cpp","cpp17","header-only"],"latest_commit_sha":null,"homepage":"","language":"CMake","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jimmy-park.png","metadata":{"files":{"readme":"README.md","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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-02-12T18:04:56.000Z","updated_at":"2025-03-01T04:39:20.000Z","dependencies_parsed_at":"2024-03-12T14:47:58.210Z","dependency_job_id":"27e6ced8-c5c1-4b2c-9ffd-2e6b48ffefb4","html_url":"https://github.com/jimmy-park/cert-cmake","commit_stats":null,"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jimmy-park%2Fcert-cmake","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jimmy-park%2Fcert-cmake/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jimmy-park%2Fcert-cmake/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jimmy-park%2Fcert-cmake/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jimmy-park","download_url":"https://codeload.github.com/jimmy-park/cert-cmake/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244752335,"owners_count":20504254,"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","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":["certificate","cmake","cpp","cpp17","header-only"],"created_at":"2024-11-27T11:17:44.895Z","updated_at":"2026-05-19T00:02:43.657Z","avatar_url":"https://github.com/jimmy-park.png","language":"CMake","funding_links":[],"categories":[],"sub_categories":[],"readme":"# cert-cmake\n\n[![CI](https://github.com/jimmy-park/cert-cmake/actions/workflows/ci.yaml/badge.svg)](https://github.com/jimmy-park/cert-cmake/actions/workflows/ci.yaml)\n[![Latest](https://github.com/jimmy-park/cert-cmake/actions/workflows/latest.yaml/badge.svg)](https://github.com/jimmy-park/cert-cmake/actions/workflows/latest.yaml)\n\nGenerate `cert.h` for loading in-memory cert\n\nRequire C++17 due to `inline` variable\n\n## CMake Options\n\n| Option         | Default       | Description                                             |\n| -------------- | ------------- | ------------------------------------------------------- |\n| `CERT_SOURCE`  | `(undefined)` | Specify the location of certificates (URL or file path) |\n| `CERT_INSTALL` | `OFF`         | Install `cert.h` and CMake targets                      |\n\n- `CERT_SOURCE`\n  - When this isn't defined, download the latest CA bundle maintained by [curl](https://curl.se/docs/caextract.html)\n\n\u003e [!NOTE]\n\u003e If you want to use a local PEM file, `CERT_SOURCE` must be an absolute path.\n\n## Usage\n\n### Build\n\n```sh\ncmake --list-presets all                    # List all CMake presets\ncmake --preset windows                      # Configure\ncmake --build --preset windows              # Build\nctest --preset windows                      # Test\ncmake --build --preset windows -t install   # Install\n```\n\n### Integration\n\nRequire CMake 3.23+\n\n```CMake\ninclude(FetchContent)\nFetchContent_Declare(\n    cert-cmake\n    URL https://github.com/jimmy-park/cert-cmake/archive/main.tar.gz\n)\nFetchContent_MakeAvailable(cert-cmake)\n\n# If you're using CPM.cmake\n# CPMAddPackage(\n#     NAME cert-cmake\n#     URL https://github.com/jimmy-park/cert-cmake/archive/main.tar.gz\n# )\n\nadd_executable(main main.cpp)\ntarget_link_libraries(main PRIVATE cert::cert)\n```\n\n## Example\n\n### curl\n\n```cpp\nstatic constexpr auto blob = curl_blob {\n    const_cast\u003cchar*\u003e(kCert),\n    sizeof(kCert),\n    CURL_BLOB_NOCOPY\n};\n\nauto* curl = curl_easy_init();\ncurl_easy_setopt(curl, CURLOPT_CAINFO_BLOB, \u0026blob);\ncurl_easy_setopt(curl, CURLOPT_URL, \"https://nghttp2.org/httpbin/get\");\ncurl_easy_perform(curl);\ncurl_easy_cleanup(curl);\n```\n\n### OpenSSL\n\n```cpp\ntemplate \u003cauto func\u003e\nstruct Deleter {\n    template \u003ctypename T\u003e\n    constexpr void operator()(T* ptr) const { func(ptr); }\n};\n\nusing X509Info = STACK_OF(X509_INFO);\nvoid FreeX509Info(X509Info* ptr) { sk_X509_INFO_pop_free(ptr, X509_INFO_free); }\nusing X509Ptr = std::unique_ptr\u003cX509Info, Deleter\u003cFreeX509Info\u003e\u003e;\nusing BioPtr = std::unique_ptr\u003cBIO, Deleter\u003cBIO_free_all\u003e\u003e;\n\nvoid LoadCert(void* ssl_context)\n{\n    // https://www.openssl.org/docs/manmaster/man3/OPENSSL_thread_stop.html\n    struct OpenSSLCleaner {\n        ~OpenSSLCleaner() { OPENSSL_thread_stop(); }\n    };\n    thread_local const OpenSSLCleaner openssl_clenaer;\n    \n    static const auto x509_ptr = [] {\n        const auto bio_ptr = BioPtr { BIO_new_mem_buf(kCert, sizeof(kCert)) };\n        return X509Ptr { PEM_X509_INFO_read_bio(bio_ptr.get(), nullptr, nullptr, nullptr) };\n    }();\n\n    static const auto certs = [] {\n        std::vector\u003cX509*\u003e x509s;\n\n        for (int first = 0, last = sk_X509_INFO_num(x509_ptr.get()); first \u003c last; ++first) {\n            auto* value = sk_X509_INFO_value(x509_ptr.get(), first);\n            if (value \u0026\u0026 value-\u003ex509)\n                x509s.push_back(value-\u003ex509);\n        }\n\n        return x509s;\n    }();\n\n    if (!ssl_context)\n        return;\n\n    auto* x509_store = SSL_CTX_get_cert_store(static_cast\u003cSSL_CTX*\u003e(ssl_context));\n\n    for (const auto x509 : certs)\n        X509_STORE_add_cert(x509_store, x509);\n}\n```\n\n### curl + OpenSSL\n\n```cpp\nauto ssl_callback = +[](CURL*, void* ssl_ctx, void*) {\n    LoadCert(ssl_ctx);\n    return CURLE_OK;\n};\n\nauto* curl = curl_easy_init();\ncurl_easy_setopt(curl, CURLOPT_SSL_CTX_FUNCTION, ssl_callback);\ncurl_easy_setopt(curl, CURLOPT_URL, \"https://nghttp2.org/httpbin/get\");\ncurl_easy_perform(curl);\ncurl_easy_cleanup(curl);\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjimmy-park%2Fcert-cmake","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjimmy-park%2Fcert-cmake","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjimmy-park%2Fcert-cmake/lists"}