Deps.dev Certifier
Overview
The deps.dev certifier component of GUAC (Graph for Understanding Artifact Composition) integrates with Open Source Insights (deps.dev) by Google to enrich the GUAC supply chain knowledge graph. It automatically queries package metadata, identifies source code repositories, attaches OpenSSF Scorecard security evaluation metrics, and maps full dependency relationship trees for open-source packages.
How GUAC Pulls from deps.dev
GUAC connects directly to the deps.dev service via its high-performance gRPC API (api.deps.dev:443).
When packages are ingested into GUAC or provided via the command line:
- Package URL (pURL) Translation:
- Parses package identifiers into standardized Package URLs (pURLs).
- Translates the pURL (ecosystem type, namespace, name, version) into a deps.dev
VersionKey.
- Metadata and Source Code Discovery:
- Queries
GetVersionto fetch package version metadata and discover source repository URLs (SOURCE_REPOlink). - If a source repository is identified, queries
GetProjectto retrieve OpenSSF Scorecard evaluation scores and security check results.
- Queries
- Dependency Resolution:
- When configured with
--retrieve-dependencies, callsGetDependenciesto retrieve the package’s complete dependency graph directly from deps.dev.
- When configured with
- GUAC Graph Node Creation:
HasSourceAt: Associates the package (Pkg) with its source code repository (Src) with the justification"collected via deps.dev".CertifyScorecard: Ingests OpenSSF Scorecard ratings (aggregate score, checks, commit, version) for the source repository.IsDependency: When dependency resolution is enabled, creates dependency edges between packages with the justification"dependency data collected via deps.dev".HasSBOM: Creates a top-levelHasSBOMnode for the package.
Covered Ecosystems
The deps.dev certifier supports the primary package ecosystems indexed by deps.dev:
- npm (
pkg:npm/...) - PyPI (
pkg:pypi/...) - Go (
pkg:golang/...) - Maven (
pkg:maven/...) - Cargo (
pkg:cargo/...) - NuGet (
pkg:nuget/...)
{: .note } The pURL must contain an explicit package version (for example, pkg:npm/express@4.18.2). Packages without a version cannot be resolved against deps.dev and will be skipped.
What is and is not Supported
Supported Features
- Source Repository Mapping: Resolves package versions to upstream VCS repositories (
HasSourceAt). - Scorecard Ingestion: Automatically enriches source repositories with OpenSSF Scorecard security checks and scores (
CertifyScorecard). - Transitive Dependency Resolution: Automatically resolves and links full dependency trees (
IsDependency) when--retrieve-dependenciesis enabled. - Continuous Polling via CollectSub: Works seamlessly with the CollectSub (
csub) service to watch for newly ingested packages and query deps.dev automatically. - On-Demand Enrichment during Ingestion: Can run automatically during document/SBOM ingestion with the
--add-depsdev-on-ingestflag. - Manual CLI Ingestion: Supports direct querying for specific pURLs via the CLI.
- Rate Limiting and Throttling: Built-in client rate limiting (150 RPS) with optional artificial latency (
--deps-dev-latency). - Observability: Exposes Prometheus metrics and OpenTelemetry traces.
Limitations
- Version Requirement: Packages without an explicit version specified in the pURL are not queried.
- Private/Proprietary Packages: Only public open-source packages indexed by deps.dev are supported.
- Unsupported Ecosystems: Ecosystems not tracked by deps.dev cannot be resolved.
- Network Access: Requires outbound network access to
api.deps.dev:443. - Ingestion Overhead: Resolving deep transitive dependency trees (
--retrieve-dependencies) or enabling--add-depsdev-on-ingestcan increase ingestion time for large SBOMs.
Invocation
GUAC integrates with deps.dev in three primary ways:
- Continuous Polling via Collect-Subscriber (Daemon Mode)
- The certifier/collector continuously monitors the CollectSub service for newly discovered pURLs from ingested SBOMs and queries deps.dev in the background.
- On-Demand during Ingestion
- Automatically queries deps.dev when ingesting documents or SBOMs by setting
--add-depsdev-on-ingest(oradd-depsdev-on-ingest: trueinguac.yaml).
- Automatically queries deps.dev when ingesting documents or SBOMs by setting
- Manual CLI Execution
- Directly query deps.dev for one or more specific package URLs using
guaccollectorguacone.
- Directly query deps.dev for one or more specific package URLs using
Usage
Basic command syntax:
# Using guaccollect
guaccollect deps_dev [flags] <purl1> <purl2>...
# Using guacone
guacone collect deps_dev [flags] <purl1> <purl2>...
Core Flags
| Flag | Description | Default |
|---|---|---|
--retrieve-dependencies | Query and collect full dependency relationships for the specified package(s). | false |
--deps-dev-latency | Sets artificial latency on deps.dev requests to manage load (e.g., 100ms, 1s). | Not enabled (empty) |
-p, --poll | Sets the collector/certifier to polling mode. | false |
--service-poll | Sets the collector/certifier to polling mode when using guaccollect. | true |
--use-csub | Use the CollectSub server to dynamically receive package datasources. | true |
--interval string | Polling interval when running in polling mode (e.g., 5m, 10m). | 5m |
--enable-prometheus | Enable Prometheus metrics HTTP handler. | false |
--prometheus-port int | Port to listen on for Prometheus metrics server. | 9091 |
--enable-otel | Enable OpenTelemetry metrics and distributed tracing. | false |
-h, --help | Help for deps_dev command. |
Global Flags
| Flag | Description | Default |
|---|---|---|
--csub-addr string | Address to connect to collect-sub service. | "localhost:2782" |
--csub-tls | Enable TLS connection to the CollectSub server. | false |
--csub-tls-skip-verify | Skip verifying CollectSub server certificate (for self-signed certificates). | false |
--gql-addr string | Endpoint used to connect to GraphQL server. | "http://localhost:8080/query" |
--pubsub-addr string | Address to connect to NATS pubsub service. | "nats://127.0.0.1:4222" |
--blob-addr string | Address for blob storage. | "file:///tmp/blobstore?no_tmp_dir=true" |
--publish-to-queue | Enable publishing collected documents to the message queue. | true |
--header-file string | A text file containing HTTP headers to send to the GQL server, in RFC 822 format. | Not set |
Usage Examples
Query Specific Package URLs
Query deps.dev for metadata and source repository information for specific packages:
# Query npm and Go packages
guaccollect deps_dev pkg:npm/express@4.18.2 pkg:golang/github.com/gin-gonic/gin@v1.9.0
# Using guacone CLI
guacone collect deps_dev pkg:npm/express@4.18.2
Retrieve Full Dependency Graph
To also pull transitive dependencies and map dependency edges into the GUAC graph:
guaccollect deps_dev --retrieve-dependencies pkg:npm/express@4.18.2
Continuous Polling with CollectSub
Run the deps.dev certifier continuously to enrich packages as they are discovered:
guaccollect deps_dev --use-csub --service-poll --interval=10m
Ingestion-Time Enrichment
To automatically fetch deps.dev metadata during SBOM ingestion, enable the --add-depsdev-on-ingest flag:
guacone ingest sbom /path/to/sbom.json --add-depsdev-on-ingest
Or configure in guac.yaml:
add-depsdev-on-ingest: true