actions / actions/actions-runner-controller

UntrustedRoot with self-signed certificate and custom CA signed cert

Open
#4,607 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

bug gha-runner-scale-set needs triage
Dominant language
Go
Stars
6.5k
Forks
1.5k
Avg merge
2d 2h
Merged PRs (30d)
27

Description

Checks
Controller Version

0.14.2

Deployment Method

ArgoCD

Checks
  • This isn't a question or user support case (For Q&A and community support, go to Discussions).
  • I've read the Changelog before submitting this issue and I'm sure it's not due to any recently-introduced backward-incompatible changes
To Reproduce
1. Set the following values to the helm chart (deployed through ArgoCD)
githubServerTLS:
  certificateFrom:
    configMapKeyRef:
      name: mycert-ca
      key: ca.crt
  runnerMountPath: /usr/local/share/ca-certificates

The cert under key ca.crt is the selfsigned cert and I validated it using openssl that with this supplied it is "verified" from within the pod.

It's a self-signed cert at this time and it will be replaced by a cert signed by an internal CA. So either way using a custom CA should work.

In the spawned pod I see these env vars:
NODE_EXTRA_CA_CERTS=/usr/local/share/ca-certificates/ca.crt
RUNNER_UPDATE_CA_CERTS=1

The configmap is mounted into the pod on that location.

Just as a test I added SSL_CERT_DIR=/usr/local/share/ca-certificates and the error goes away.

If I try to verify using openssl with /etc/ssl/certs/ca-certificates.crt it's not ok. So it seems the update-ca-certificates is not running or something similar.

[RUNNER 2026-08-19 08:41:04Z ERR  GitHubActionsService] GET request to https://example.com/_services/pipelines/.../_apis/connectionData?connectOptions=1&lastChangeId=-1&lastChangeId64=-1 failed. System.Net.Http.HttpRequestException: The SSL connection could not be established, see inner exception.
[RUNNER 2026-08-19 08:41:04Z ERR  GitHubActionsService]  ---> System.Security.Authentication.AuthenticationException: The remote certificate is invalid because of errors in the certificate chain: UntrustedRoot


There's no errors in the logs about update-ca-certificates.
Describe the bug

The added ca certificate is not being added to the system trust store.

Describe the expected behavior

The ca certificate is being added to the system trust store.

Additional Context
githubServerTLS:
  certificateFrom:
    configMapKeyRef:
      name: mycert-ca
      key: ca.crt
  runnerMountPath: /usr/local/share/ca-certificates
Controller Logs
[RUNNER 2026-08-19 08:41:04Z ERR  GitHubActionsService] GET request to https://example.com/_services/pipelines/.../_apis/connectionData?connectOptions=1&lastChangeId=-1&lastChangeId64=-1 failed. System.Net.Http.HttpRequestException: The SSL connection could not be established, see inner exception.
[RUNNER 2026-08-19 08:41:04Z ERR  GitHubActionsService]  ---> System.Security.Authentication.AuthenticationException: The remote certificate is invalid because of errors in the certificate chain: UntrustedRoot
Runner Pod Logs
[RUNNER 2026-08-19 08:41:04Z ERR  GitHubActionsService] GET request to https://example.com/_services/pipelines/.../_apis/connectionData?connectOptions=1&lastChangeId=-1&lastChangeId64=-1 failed. System.Net.Http.HttpRequestException: The SSL connection could not be established, see inner exception.
[RUNNER 2026-08-19 08:41:04Z ERR  GitHubActionsService]  ---> System.Security.Authentication.AuthenticationException: The remote certificate is invalid because of errors in the certificate chain: UntrustedRoot

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the Helm chart's githubServerTLS handling and the generated runner pod's certificate mount and environment variables. Reproduce the self-signed and internal-CA cases, then inspect how RUNNER_UPDATE_CA_CERTS updates the trust store compared with SSL_CERT_DIR. Done means the supplied CA is trusted without manually setting SSL_CERT_DIR and the UntrustedRoot error is gone.

Written by the indexing model from the issue text.

Assessment

Tech stack
github-actions, helm, kubernetes
Domain
infrastructure, security
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.