A GitHub change that looks small on paper can become a real problem when it reaches a CI/CD environment.
GitHub disabled SHA-1 in HTTPS/TLS connections for GitHub.com and partner CDNs. GitHub Enterprise Server is not affected by this specific change.
For developers using a current workstation, this may not require any action. The bigger question is what happens inside your build servers, self-hosted runners, old containers, proxies, and automation systems.
A CI/CD pipeline is rarely just one application. It is a chain of operating systems, Git clients, TLS libraries, runner software, network components, and build tools.
If one part of that chain is outdated, a pipeline can fail even though the application code itself has not changed.
This article walks through what teams should check and how to test their CI/CD environments.
What the SHA-1 Change Means for CI/CD
The first thing to understand is that this is about SHA-1 used in HTTPS/TLS connections.
It is not the same thing as Git commit IDs.
Your CI server may perform operations such as:
GitHub
|
| HTTPS
v
CI Runner
|
+-- Clone repository
+-- Download actions
+-- Call GitHub APIs
+-- Download releases
+-- Upload artifacts
All of these operations can depend on working HTTPS communication.
If an old runner or network component depends on retired cryptographic behavior, the pipeline can start failing.
GitHub's CI system supports both GitHub-hosted and self-hosted runners, so the amount of infrastructure you need to check depends on which model your organization uses.
Why CI/CD Is Different From a Developer Laptop
A developer usually notices when Git stops working.
A CI server is different.
A pipeline may run automatically at:
2 AM
During a release
After a pull request
When a tag is created
When another repository triggers a workflow
There may not be a developer watching the machine when the failure happens.
There is another problem: CI environments are often long-lived.
A self-hosted runner may have been installed months or years ago and continue running without anyone checking its underlying software.
For example:
Self-hosted Runner
|
+-- Old OS
+-- Old Git
+-- Old TLS libraries
+-- Corporate proxy
+-- Custom certificates
+-- Build tools
Updating only one component may not solve the problem.
GitHub-Hosted Runners vs Self-Hosted Runners
Before checking your environment, identify which type of runner your pipeline uses.
GitHub-Hosted Runners
GitHub manages the underlying runner environment.
Your workflow might contain:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: dotnet build
- run: dotnet test
The infrastructure behind the hosted runner is maintained by GitHub.
That reduces the amount of operating-system maintenance your team needs to perform.
It does not mean you can ignore the workflow itself. Actions, dependencies, custom scripts, proxies, and external services can still introduce failures.
Self-Hosted Runners
With a self-hosted runner, your organization owns much more of the environment.
For example:
Your Organization
|
v
Self-Hosted Machine
|
+-- Operating System
+-- Git
+-- Runner
+-- TLS
+-- Certificates
+-- Proxy
+-- Build Tools
GitHub requires self-hosted runners to establish outbound HTTPS connections and communicate with the required GitHub endpoints.
This makes self-hosted runners the first place many organizations should investigate.
Start With Your Runner Inventory
Before changing anything, create a list of your CI/CD environments.
For example:
Environment | Runner Type | OS | Git | Runner Version | Proxy |
|---|---|---|---|---|---|
Development | GitHub-hosted | Linux | Managed | Managed | No |
Production CI | Self-hosted | Linux | 2.x | 2.x | Yes |
Windows Build | Self-hosted | Windows | 2.x | 2.x | Yes |
Release Server | Self-hosted | Linux | 2.x | 2.x | No |
You do not need complicated tooling to start.
The purpose is simply to find machines that nobody has checked recently.
Check the Git Version
On a self-hosted runner, start with:
git --version
For example:
git version 2.x.x
The exact version you should use depends on your operating system and organization policy.
The important thing is to avoid treating Git as the only dependency.
Git can rely on HTTPS/TLS components provided by the operating system or its packaging environment.
So this:
Current Git
+
Old operating system
does not necessarily mean the entire HTTPS stack is current.
Check the Operating System
On Linux, you can check the operating system with:
cat /etc/os-release
For example:
NAME="Ubuntu"
VERSION="..."
On Windows, check the installed Windows version and patch level.
The objective is to identify unsupported or heavily outdated systems.
This is particularly important for servers that were created from old VM images.
Check the TLS Stack
On Linux systems using OpenSSL, you can inspect the installed version with:
openssl version
For example:
OpenSSL ...
Do not use the version number alone to decide whether a system is compatible.
Git may use a different TLS implementation depending on how it was built.
The useful question is:
What TLS implementation is actually being used
by this Git installation on this machine?
That is more useful than simply asking whether OpenSSL is installed.
Check How Git Connects to GitHub
Look at the repository's remote:
git remote -v
You may see:
origin https://github.com/company/project.git (fetch)
origin https://github.com/company/project.git (push)
That means the repository uses HTTPS.
Or:
origin [email protected]:company/project.git (fetch)
origin [email protected]:company/project.git (push)
That means it uses SSH.
The SHA-1 HTTPS change specifically concerns HTTPS/TLS connections, so identifying the remote protocol is an important first step.
Test GitHub From the Runner
Do not wait for the production pipeline to fail.
Run a basic Git operation directly from the runner.
For example:
git ls-remote https://github.com/example/example.git
For a private repository, use a repository that the runner is authorized to access.
You can also test the actual workflow:
git fetch
If you have permission to push, test the complete path in a controlled branch.
The goal is to test from the actual CI machine, not from your laptop.
This distinction matters.
Your laptop and CI runner may have completely different:
Operating systems
Git versions
TLS libraries
Certificates
Proxies
Firewall rules
Test the GitHub Actions Runner
GitHub provides a runner diagnostic check for self-hosted runners.
From the runner installation directory, you can use:
./config.sh --check --url https://github.com/YOUR-ORG/YOUR-REPO --pat YOUR_TOKEN
On Windows:
config.cmd --check --url https://github.com/YOUR-ORG/YOUR-REPO --pat YOUR_TOKEN
The check tests runner services and reports PASS or FAIL. GitHub also provides diagnostic logs in the runner's _diag directory.
Use an appropriate token according to your organization's GitHub permissions and security practices.
Do not place long-lived credentials directly into scripts or source control.
Why Self-Hosted Runner Versions Matter
The HTTPS change is not the only maintenance issue facing self-hosted runners.
GitHub has also introduced minimum-version enforcement for self-hosted Actions runners.
GitHub's current guidance says that when automatic runner updates are disabled, organizations must keep the runner updated themselves. If a runner is not updated within the required window, GitHub can stop queuing jobs to it.
This gives organizations another reason to treat runners as maintained infrastructure rather than permanent virtual machines.
A runner should have a lifecycle.
Provision
|
v
Configure
|
v
Patch
|
v
Monitor
|
v
Update
|
v
Replace
Check Your CI Container Images
Many teams run CI jobs inside containers.
For example:
jobs:
build:
runs-on: self-hosted
container:
image: ubuntu:latest
steps:
- uses: actions/checkout@v4
- run: dotnet build
In this situation, there are potentially multiple environments to consider.
Host
|
+-- Runner software
|
+-- Container runtime
|
v
CI Container
|
+-- Git
+-- Certificates
+-- TLS libraries
+-- Build tools
Updating the host does not automatically update everything inside the container.
If your organization maintains its own CI images, review their base image and installed packages.
Check Custom Docker Images
A common pattern is:
FROM ubuntu:old-version
RUN apt-get update
RUN apt-get install -y git
The image may continue working for a long time after it was created.
That does not mean the image is still a good production dependency.
A better approach is to rebuild CI images regularly.
For example:
Base Image Update
|
v
Rebuild CI Image
|
v
Run Test Pipeline
|
v
Deploy New Runner Image
This also makes security patching easier.
Corporate Proxies Need Attention
A corporate network may place a proxy between your runner and GitHub.
The connection can look like this:
CI Runner
|
v
Corporate Proxy
|
v
Firewall
|
v
Internet
|
v
GitHub
Some organizations also perform TLS inspection.
That means the runner may not communicate directly with GitHub's TLS endpoint.
If the same workflow succeeds on a GitHub-hosted runner but fails on a self-hosted runner, compare the network path.
The difference may be the proxy rather than Git itself.
Check Custom Certificate Authorities
TLS inspection and corporate proxies often require custom CA certificates.
GitHub's documentation notes that self-hosted runners may need appropriate certificates installed in the operating system certificate store. For Actions Runner Controller environments, custom CA certificates may also need to be injected into the runner and controller trust stores.
A typical containerized setup might look like:
Corporate CA
|
v
Runner Trust Store
|
v
TLS Connection
|
v
GitHub
If the certificate chain is incomplete, HTTPS connections can fail even when the cryptographic algorithms are otherwise compatible.
Do Not Disable TLS Verification
When a pipeline starts showing TLS errors, somebody may suggest disabling certificate verification.
For example:
git config --global http.sslVerify false
Do not use this as a permanent fix.
It removes an important security check.
GitHub also warns against disabling TLS certificate verification for self-hosted runners. Its documentation recommends installing the required GitHub certificate in the operating system certificate store instead.
The correct approach is:
TLS Error
|
v
Find the cause
|
+-- Old TLS support
+-- Old certificate store
+-- Proxy problem
+-- Firewall problem
+-- DNS problem
+-- Git configuration
|
v
Fix the actual problem
Check GitHub Actions Network Access
A CI runner needs more than access to one GitHub URL.
Depending on the workflow, runners may need to communicate with GitHub and other services used to download actions, releases, dependencies, or tools.
GitHub's documentation lists github.com, api.github.com, and *.githubusercontent.com among the endpoints commonly required by Actions workflows. Additional endpoints can be required by particular ecosystems and actions.
If your organization uses a strict outbound firewall, review the allowlist rather than assuming that github.com alone is sufficient.
Watch for Download Failures
A pipeline can successfully check out your repository and still fail later.
For example:
Checkout
|
v
Success
|
v
Download Action
|
X
TLS / Network Failure
Or:
Checkout
|
v
Build
|
v
Download Dependency
|
X
Network Failure
This is why testing only:
git clone
is not always enough.
Run a complete representative workflow.
Use a Small CI Health Check
You can add a diagnostic step to a controlled workflow.
For example:
steps:
- name: Check Git
run: git --version
- name: Check OS
run: cat /etc/os-release
- name: Check OpenSSL
run: openssl version
- name: Check GitHub connectivity
run: git ls-remote https://github.com/example/example.git
For Windows runners, use PowerShell commands appropriate to the environment.
Do not expose credentials or sensitive infrastructure information in the workflow logs.
The goal is to make infrastructure problems visible before they become release failures.
Check Self-Hosted Runner Auto-Updates
GitHub Actions self-hosted runners normally update automatically when a new runner version is available.
Organizations can disable automatic updates with the --disableupdate option, but GitHub requires those installations to be maintained manually. GitHub states that runners with updates disabled still need to be updated regularly.
If your environment uses:
./config.sh --disableupdate
make sure there is an explicit process for:
Tracking runner releases
Testing new versions
Updating runner images
Replacing old runners
Monitoring failed updates
If nobody owns that process, the configuration becomes technical debt.
Build a Runner Upgrade Process
A simple process can look like this:
Step 1: Inventory
List every self-hosted runner.
Step 2: Identify Dependencies
Record:
OS
Git
Runner
TLS
Certificates
Proxy
Container Runtime
Build Tools
Step 3: Test
Run a representative workflow.
Step 4: Update
Upgrade outdated components.
Step 5: Test Again
Run build, test, package, and deployment workflows.
Step 6: Replace Old Infrastructure
Remove runners that cannot be maintained.
This is much safer than updating every production runner at the same time.
A Practical CI/CD Readiness Checklist
Before considering your environment ready, verify:
Area | Check |
|---|---|
Git | Current supported version |
Runner | Current supported version |
OS | Supported and patched |
TLS | Modern cryptographic support |
Certificates | Trust store is current |
Proxy | TLS inspection is compatible |
Firewall | Required GitHub endpoints are reachable |
Containers | Base images are maintained |
Actions | Dependencies are maintained |
Testing | Real CI workflow has passed |
Monitoring | Runner failures are visible |
Rollback | Previous runner image/version is available |
This checklist is especially useful for organizations with several self-hosted runners.
A Simple Test Workflow
For a controlled environment, you can create a small workflow to verify basic connectivity and runner information:
name: Runner Health Check
on:
workflow_dispatch:
jobs:
health-check:
runs-on: self-hosted
steps:
- name: Check Git
run: git --version
- name: Check OpenSSL
run: openssl version
- name: Check GitHub connectivity
run: git ls-remote https://github.com/example/example.git
- name: Check repository
uses: actions/checkout@v4
- name: Test build
run: dotnet build
Replace the example repository and build command with values appropriate for your project.
The purpose is not to create a universal compatibility test.
It is to give your infrastructure team a repeatable way to test the complete runner environment.
What If the Pipeline Is Already Failing?
Do not immediately change the workflow.
First determine where the failure occurs.
Use this sequence:
Pipeline Failure
|
v
Checkout failure?
|
+-- Yes --> Check Git / TLS / Proxy
|
+-- No
|
v
Action download failure?
|
+-- Yes --> Check GitHub endpoints / TLS
|
+-- No
|
v
Dependency download failure?
|
+-- Yes --> Check package source/network
|
+-- No
|
v
Build or test problem
This keeps the investigation focused.
A TLS-related failure during checkout should not lead to changing application code or dependency versions.
What Teams Should Avoid
Do Not Assume GitHub-Hosted and Self-Hosted Runners Are Identical
They are not.
A GitHub-hosted runner and a self-hosted runner can have completely different infrastructure.
Do Not Update Only Git
A modern Git executable does not guarantee that every component of the HTTPS stack is current.
Do Not Ignore Container Images
An old container can contain old Git, certificates, and TLS libraries even when the host machine is fully patched.
Do Not Disable TLS Verification
It may hide the problem while weakening connection security.
Do Not Wait for Production
Run the checks before a release depends on the affected environment.
Summary
GitHub's SHA-1 HTTPS change is a good reminder that CI/CD infrastructure needs regular maintenance.
The application source code may be perfectly fine while the pipeline fails because an old runner, operating system, TLS library, certificate store, container image, or proxy cannot establish the required HTTPS connection.
For most teams, the practical process is straightforward:
Inventory
|
v
Check runners
|
v
Check Git and OS
|
v
Check TLS and certificates
|
v
Check proxies and firewalls
|
v
Run a real pipeline
|
v
Update or replace old infrastructure
GitHub-hosted runners reduce the amount of infrastructure your team needs to maintain, while self-hosted runners require an explicit update and monitoring process. GitHub also continues to enforce supported runner versions, so keeping self-hosted runners current is important beyond this specific SHA-1 change.
The most useful lesson is not simply "update Git."
Treat the entire CI/CD runner as a software system. Keep the operating system, Git, runner software, TLS stack, certificates, container images, proxies, and network configuration maintained together.
That approach makes cryptographic changes like this much easier to handle without waiting for the next failed production deployment.
Join the conversation! Your thoughts help the community grow.