@htekdev/actions-debugger 1.0.56 → 1.0.57

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,110 @@
1
+ id: permissions-auth-041
2
+ title: "actions/checkout submodules fail with auth error when private submodule repos are outside the workflow repository"
3
+ category: permissions-auth
4
+ severity: error
5
+ tags:
6
+ - checkout
7
+ - submodules
8
+ - github-token
9
+ - private-repo
10
+ - authentication
11
+ - pat
12
+ - deploy-key
13
+ patterns:
14
+ - regex: 'fatal: could not read Username for.*terminal prompts disabled'
15
+ flags: 'i'
16
+ - regex: 'fatal: repository ''.*github\.com.*'' not found'
17
+ flags: 'i'
18
+ - regex: 'remote: Repository not found\.'
19
+ flags: 'i'
20
+ - regex: 'Error: The process.*git.*failed with exit code 128'
21
+ flags: 'i'
22
+ error_messages:
23
+ - "fatal: could not read Username for 'https://github.com': terminal prompts disabled"
24
+ - "fatal: repository 'https://github.com/org/private-submodule/' not found"
25
+ - "remote: Repository not found."
26
+ - "Error: The process '/usr/bin/git' failed with exit code 128"
27
+ root_cause: |
28
+ `actions/checkout` uses the `GITHUB_TOKEN` (or the `token` input) to authenticate
29
+ git operations during checkout, including recursive submodule initialization.
30
+ `GITHUB_TOKEN` is automatically scoped to the repository that owns the running
31
+ workflow — it cannot access private repositories in other organizations, or other
32
+ private repositories within the same organization.
33
+
34
+ When a submodule `.gitmodules` entry points to a private repository that is different
35
+ from the workflow repository, git authentication fails during `submodule update`.
36
+ The resulting error (`fatal: could not read Username` or `repository not found`)
37
+ is confusing because the submodule URL is correct — the problem is authentication
38
+ scope, not the URL itself.
39
+
40
+ Developers upgrading from self-hosted runners (where global git credentials were
41
+ configured) or from `actions/checkout@v1-v2` (which had different authentication
42
+ behavior) frequently encounter this when moving to `actions/checkout@v4` on
43
+ GitHub-hosted runners.
44
+
45
+ This is a deliberate security boundary: `GITHUB_TOKEN` is intentionally limited to
46
+ the current repository to prevent workflows from silently reading other private repos.
47
+ fix: |
48
+ Use one of two approaches:
49
+
50
+ 1. **PAT approach**: Create a Personal Access Token (classic PAT with `repo` scope,
51
+ or a fine-grained PAT with read access to all submodule repos). Store it as a
52
+ repository secret and pass it via the `token` input to `actions/checkout`.
53
+
54
+ 2. **Deploy key approach**: Add a read-only deploy key to each private submodule
55
+ repository, then use `webfactory/ssh-agent` to load the key before checkout.
56
+ This avoids PATs entirely and follows least-privilege principles.
57
+
58
+ For organizations, a machine account (a GitHub account created for automation) with
59
+ `repo` read access to all submodule repos is often easier to manage than fine-grained
60
+ PATs.
61
+ fix_code:
62
+ - language: yaml
63
+ label: "PAT with repo scope passed via token input"
64
+ code: |
65
+ jobs:
66
+ build:
67
+ runs-on: ubuntu-latest
68
+ steps:
69
+ - uses: actions/checkout@v4
70
+ with:
71
+ submodules: recursive
72
+ token: ${{ secrets.SUBMODULE_PAT }}
73
+ # SUBMODULE_PAT: classic PAT with repo scope, or fine-grained PAT
74
+ # with Contents: read on all private submodule repos
75
+
76
+ - language: yaml
77
+ label: "SSH deploy key approach using webfactory/ssh-agent"
78
+ code: |
79
+ jobs:
80
+ build:
81
+ runs-on: ubuntu-latest
82
+ steps:
83
+ - name: Configure SSH agent with submodule deploy key
84
+ uses: webfactory/ssh-agent@v0.9.0
85
+ with:
86
+ ssh-private-key: ${{ secrets.SUBMODULE_DEPLOY_KEY }}
87
+ # Add multiple keys for multiple private submodule repos:
88
+ # ssh-private-key: |
89
+ # ${{ secrets.SUBMODULE_REPO_A_KEY }}
90
+ # ${{ secrets.SUBMODULE_REPO_B_KEY }}
91
+
92
+ - uses: actions/checkout@v4
93
+ with:
94
+ submodules: recursive
95
+ # No token needed — SSH agent handles git authentication
96
+ prevention:
97
+ - "Prefer deploy keys over PATs for submodule access — deploy keys are repo-scoped and easier to rotate"
98
+ - "Use fine-grained PATs scoped to specific repositories rather than classic PATs with broad repo scope"
99
+ - "Document which submodule repos require special secrets so new contributors can configure their forks"
100
+ - "Consider converting private submodule dependencies to private packages in a registry to avoid cross-repo auth complexity"
101
+ - "Test submodule checkout in a fresh fork or on a runner without existing git credentials to catch auth issues early"
102
+ docs:
103
+ - url: "https://docs.github.com/en/actions/security-for-github-actions/security-guides/automatic-token-authentication#permissions-for-the-github_token"
104
+ label: "GitHub Docs — GITHUB_TOKEN permissions and scope"
105
+ - url: "https://github.com/actions/checkout#usage"
106
+ label: "actions/checkout — token and submodules inputs"
107
+ - url: "https://docs.github.com/en/authentication/connecting-to-github-with-ssh/managing-deploy-keys"
108
+ label: "GitHub Docs — Managing deploy keys"
109
+ - url: "https://github.com/webfactory/ssh-agent"
110
+ label: "webfactory/ssh-agent — Load SSH keys for Actions"
@@ -0,0 +1,98 @@
1
+ id: runner-environment-112
2
+ title: "ubuntu-24.04 nftables replaces iptables — Docker bridge networking and kind/minikube cluster setup fails"
3
+ category: runner-environment
4
+ severity: error
5
+ tags:
6
+ - ubuntu-24.04
7
+ - docker
8
+ - networking
9
+ - iptables
10
+ - nftables
11
+ - kind
12
+ - minikube
13
+ - runner-image-update
14
+ patterns:
15
+ - regex: 'No chain/target/match by that name'
16
+ flags: 'i'
17
+ - regex: 'iptables.*failed.*nat.*DOCKER'
18
+ flags: 'i'
19
+ - regex: 'Failed to set up iptables.*\(iptables-nft\)'
20
+ flags: 'i'
21
+ - regex: 'network.*setup.*failed.*iptables'
22
+ flags: 'i'
23
+ - regex: 'Error response from daemon.*iptables failed'
24
+ flags: 'i'
25
+ error_messages:
26
+ - "iptables: No chain/target/match by that name."
27
+ - "Error response from daemon: driver failed programming external connectivity on endpoint: iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 5432 -j DNAT --to-destination 172.17.0.2:5432 ! -i docker0: iptables: No chain/target/match by that name."
28
+ - "Failed to set up iptables rules: iptables-nft is not supported"
29
+ - "Error: failed to create cluster: failed to ensure docker network: failed to set up kind CNI"
30
+ root_cause: |
31
+ Ubuntu 24.04 ships with nftables as the primary packet-filtering framework. The `iptables`
32
+ command is now a thin wrapper around nftables (`iptables-nft`), replacing the legacy
33
+ `iptables-legacy` backend that was default on Ubuntu 20.04/22.04.
34
+
35
+ Docker's bridge networking writes iptables rules using legacy format assumptions. CNI plugins
36
+ used by Kubernetes tools (kind, minikube, k3s) also expect the legacy iptables backend to be
37
+ active. When these tools run on ubuntu-24.04, they encounter incompatible chain formats and
38
+ rule semantics that iptables-nft does not honour, causing network setup to fail with "No
39
+ chain/target/match by that name" errors.
40
+
41
+ The runner-images migration from ubuntu-22.04 to ubuntu-24.04 (and from ubuntu-latest pointing
42
+ to ubuntu-22.04 to ubuntu-24.04) silently exposes this issue for any workflow running
43
+ Docker-in-Docker, Kubernetes clusters, or service containers with custom networking.
44
+ fix: |
45
+ Switch the `iptables` alternative back to the legacy backend before starting Docker or
46
+ any CNI-based tooling. Add this step at the top of your job, before any Docker or cluster
47
+ setup steps:
48
+
49
+ - name: Switch to legacy iptables
50
+ run: |
51
+ sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
52
+ sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
53
+
54
+ For kind clusters, the above fix is the most reliable approach.
55
+
56
+ If you cannot switch the iptables backend (e.g., you require nftables for other reasons),
57
+ use Docker with `--iptables=false` and manage forwarding rules manually, or use network
58
+ mode `host` where possible.
59
+
60
+ Long-term: upgrade to versions of kind (≥ v0.24), minikube (≥ v1.33), and Docker Engine
61
+ (≥ 27) that include nftables-native support.
62
+ fix_code:
63
+ - language: yaml
64
+ label: "Switch to iptables-legacy before Docker or cluster setup (ubuntu-24.04)"
65
+ code: |
66
+ jobs:
67
+ test:
68
+ runs-on: ubuntu-24.04
69
+ steps:
70
+ - name: Switch to legacy iptables
71
+ run: |
72
+ sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
73
+ sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
74
+
75
+ - name: Start kind cluster
76
+ uses: helm/kind-action@v1
77
+ with:
78
+ cluster_name: ci
79
+ - language: yaml
80
+ label: "Pin runs-on to ubuntu-22.04 as a temporary workaround"
81
+ code: |
82
+ jobs:
83
+ test:
84
+ # Temporary: ubuntu-22.04 uses iptables-legacy by default
85
+ # TODO: migrate to ubuntu-24.04 after updating kind/Docker versions
86
+ runs-on: ubuntu-22.04
87
+ prevention:
88
+ - "Test workflows on ubuntu-24.04 explicitly before relying on ubuntu-latest switching to it"
89
+ - "Keep kind, minikube, and Docker Engine versions current — nftables-native support arrived in each"
90
+ - "Add an iptables-legacy switch step as a defensive measure in any job using Docker networking or CNI plugins"
91
+ - "Watch runner-images release notes (github.com/actions/runner-images) for ubuntu-latest label changes"
92
+ docs:
93
+ - url: "https://docs.docker.com/network/iptables/"
94
+ label: "Docker — iptables and nftables networking"
95
+ - url: "https://github.com/actions/runner-images/issues/10636"
96
+ label: "runner-images #10636 — ubuntu-24.04 iptables-nft Docker incompatibility"
97
+ - url: "https://kind.sigs.k8s.io/docs/user/known-issues/"
98
+ label: "kind — Known Issues including iptables compatibility"
@@ -0,0 +1,118 @@
1
+ id: runner-environment-113
2
+ title: "ubuntu-24.04 removed python3-distutils — ModuleNotFoundError: No module named 'distutils' on pip install"
3
+ category: runner-environment
4
+ severity: error
5
+ tags:
6
+ - ubuntu-24.04
7
+ - python
8
+ - distutils
9
+ - pip
10
+ - setup-py
11
+ - runner-image-update
12
+ - python-3-12
13
+ patterns:
14
+ - regex: "ModuleNotFoundError: No module named 'distutils'"
15
+ flags: 'i'
16
+ - regex: 'No module named ''distutils\.core'''
17
+ flags: 'i'
18
+ - regex: 'error in setup command.*distutils'
19
+ flags: 'i'
20
+ - regex: 'distutils.*not found.*pip install'
21
+ flags: 'i'
22
+ error_messages:
23
+ - "ModuleNotFoundError: No module named 'distutils'"
24
+ - "ModuleNotFoundError: No module named 'distutils.core'"
25
+ - "error in setup command: Error parsing /path/to/setup.cfg: No module named 'distutils.core'"
26
+ - "note: This error originates from a subprocess, and is likely not a problem with pip."
27
+ - "error: legacy-install-failure"
28
+ root_cause: |
29
+ Ubuntu 24.04 ships Python 3.12 as the system Python. Python 3.12 fully removed the
30
+ `distutils` module from its standard library (it was deprecated in 3.10 and removed in 3.12
31
+ per PEP 632). Ubuntu Noble (24.04) also removed the `python3-distutils` apt backport package
32
+ that had been available on 20.04 and 22.04.
33
+
34
+ Many older Python packages still use `distutils` directly in their `setup.py` or `setup.cfg`
35
+ files. When `pip install` processes these packages, the build backend invokes `distutils` which
36
+ is no longer available. The error appears to be a build backend failure rather than a pip
37
+ failure, so the root cause is easy to miss.
38
+
39
+ This affects any workflow that:
40
+ - Uses the system Python (no `actions/setup-python` step)
41
+ - Installs packages with legacy `setup.py` that import `distutils`
42
+ - Creates virtualenvs from the system Python without pre-installing setuptools
43
+
44
+ Distinct from `setup-python-version-range-resolves-to-313-distutils-removed` which covers
45
+ setup-python action resolving to Python 3.12/3.13 and distutils in user packages. This entry
46
+ covers the apt-level removal affecting system Python on the ubuntu-24.04 runner image itself.
47
+ fix: |
48
+ Option 1 (recommended): Use actions/setup-python to manage the Python version explicitly.
49
+ setup-python bundles setuptools which provides a distutils compatibility shim.
50
+
51
+ Option 2: Install setuptools as the first pip action before installing other packages.
52
+ setuptools >= 58.0.0 ships a `distutils` compatibility shim that satisfies `import distutils`.
53
+
54
+ - name: Install setuptools (distutils shim)
55
+ run: pip install setuptools
56
+
57
+ Option 3: Install the apt package `python3-setuptools` which restores distutils compatibility
58
+ at the system level for Python 3.12.
59
+
60
+ Option 4 (long-term): Migrate the affected package to PEP 517/518 — replace setup.py with
61
+ pyproject.toml and a modern build backend (setuptools>=61, flit, hatch, etc.).
62
+ fix_code:
63
+ - language: yaml
64
+ label: "Use actions/setup-python so setuptools is available (recommended)"
65
+ code: |
66
+ jobs:
67
+ build:
68
+ runs-on: ubuntu-24.04
69
+ steps:
70
+ - uses: actions/checkout@v4
71
+
72
+ - uses: actions/setup-python@v5
73
+ with:
74
+ python-version: '3.12'
75
+
76
+ - name: Install dependencies
77
+ run: pip install -r requirements.txt
78
+ - language: yaml
79
+ label: "Pre-install setuptools to restore distutils shim (quick fix for system Python)"
80
+ code: |
81
+ jobs:
82
+ build:
83
+ runs-on: ubuntu-24.04
84
+ steps:
85
+ - uses: actions/checkout@v4
86
+
87
+ - name: Install setuptools (distutils compatibility shim for Python 3.12)
88
+ run: pip install --upgrade setuptools
89
+
90
+ - name: Install dependencies
91
+ run: pip install -r requirements.txt
92
+ - language: yaml
93
+ label: "Install python3-setuptools via apt (system-level fix)"
94
+ code: |
95
+ jobs:
96
+ build:
97
+ runs-on: ubuntu-24.04
98
+ steps:
99
+ - name: Install python3-setuptools
100
+ run: sudo apt-get install -y python3-setuptools
101
+
102
+ - name: Install dependencies
103
+ run: pip install -r requirements.txt
104
+ prevention:
105
+ - "Always use actions/setup-python rather than relying on system Python — it ships with setuptools"
106
+ - "Pin a Python version explicitly; avoid implicit system Python which changes per runner image"
107
+ - "Run pip install --dry-run in CI to detect distutils/setuptools issues before they block builds"
108
+ - "Audit third-party dependencies for setup.py usage with: pip install pipdeptree; pipdeptree | grep setup.py"
109
+ - "Migrate legacy setup.py packages to pyproject.toml for long-term Python 3.12+ compatibility"
110
+ docs:
111
+ - url: "https://docs.python.org/3/whatsnew/3.12.html#removed"
112
+ label: "Python 3.12 — Removed modules (distutils)"
113
+ - url: "https://peps.python.org/pep-0632/"
114
+ label: "PEP 632 — Deprecate distutils"
115
+ - url: "https://github.com/actions/runner-images/issues/9674"
116
+ label: "runner-images #9674 — python3-distutils unavailable on ubuntu-24.04"
117
+ - url: "https://github.com/actions/setup-python"
118
+ label: "actions/setup-python — bundles setuptools"
@@ -0,0 +1,130 @@
1
+ id: runner-environment-114
2
+ title: "macOS-26 / Xcode 26 defaults to Swift 6 strict concurrency — existing Swift builds fail with actor isolation errors"
3
+ category: runner-environment
4
+ severity: error
5
+ tags:
6
+ - macos-26
7
+ - xcode-26
8
+ - swift-6
9
+ - concurrency
10
+ - actor-isolation
11
+ - runner-image-update
12
+ - breaking-change
13
+ patterns:
14
+ - regex: "error: sending '.*' to actor-isolated"
15
+ flags: 'i'
16
+ - regex: 'actor-isolated.*cannot.*referenced from.*non-isolated'
17
+ flags: 'i'
18
+ - regex: "error: '.*' cannot be used to satisfy the '@Sendable' requirement"
19
+ flags: 'i'
20
+ - regex: 'error:.*Sendable.*cannot conform.*in Swift 6'
21
+ flags: 'i'
22
+ - regex: 'main actor-isolated.*cannot be referenced from.*nonisolated'
23
+ flags: 'i'
24
+ error_messages:
25
+ - "error: sending 'self' to actor-isolated initializer 'init()' risks causing data races"
26
+ - "error: actor-isolated property 'delegate' can not be referenced from a non-isolated context"
27
+ - "error: main actor-isolated class method 'viewDidLoad()' cannot be referenced from a nonisolated context"
28
+ - "error: 'Sendable'-conforming class 'MyViewController' cannot inherit from another class other than 'NSObject'"
29
+ - "error: expression is 'async' but is not marked with 'await'"
30
+ root_cause: |
31
+ Xcode 26 (shipped with the macos-26 runner) defaults to Swift 6 language mode. Previous
32
+ Xcode versions (14, 15, 16) compiled in Swift 5 compatibility mode by default, which did not
33
+ enforce strict data-race safety checking.
34
+
35
+ Swift 6 enforces complete concurrency checking at compile time:
36
+ - All values shared across actor boundaries must conform to `Sendable`
37
+ - Calls to `@MainActor`-isolated methods from non-isolated contexts must be `await`-ed
38
+ - Closures passed to async contexts must be `@Sendable`
39
+ - Class hierarchies that cross actor boundaries require explicit `Sendable` conformance
40
+
41
+ Code that compiled and ran correctly under Swift 5 may produce dozens of compiler errors in
42
+ Swift 6, even if it had no actual concurrency bugs. The errors are not warnings — they are
43
+ hard build failures.
44
+
45
+ The macos-26 runner ships Xcode 26 as the default Xcode. Any workflow running `xcodebuild`
46
+ or `swift build` without an explicit Swift language version flag will pick up Swift 6.
47
+ fix: |
48
+ Short-term: Pin to Swift 5 compatibility mode in your build command or project settings.
49
+
50
+ Option A — xcodebuild flag:
51
+ xcodebuild build -scheme MyScheme SWIFT_VERSION=5
52
+
53
+ Option B — Xcode build settings (xcconfig or project settings):
54
+ SWIFT_VERSION = 5
55
+
56
+ Option C — Package.swift swift-tools-version (for Swift Package Manager projects):
57
+ Change the first line to: // swift-tools-version: 5.10
58
+ This sets the package manifest version and implicitly enables Swift 5 mode for dependencies.
59
+
60
+ Option D — Per-target in Package.swift:
61
+ .target(name: "MyTarget", swiftSettings: [.unsafeFlags(["-swift-version", "5"])])
62
+
63
+ Long-term: Migrate your codebase to Swift 6 concurrency model by resolving actor isolation
64
+ errors. Apple provides a migration guide at developer.apple.com/documentation/swift/migrating-to-swift-6.
65
+ fix_code:
66
+ - language: yaml
67
+ label: "Pin SWIFT_VERSION=5 in xcodebuild to restore Swift 5 compatibility on macos-26"
68
+ code: |
69
+ jobs:
70
+ build:
71
+ runs-on: macos-26
72
+ steps:
73
+ - uses: actions/checkout@v4
74
+
75
+ - name: Build (Swift 5 compatibility mode)
76
+ run: |
77
+ xcodebuild build \
78
+ -scheme MyApp \
79
+ -destination 'platform=macOS' \
80
+ SWIFT_VERSION=5
81
+
82
+ - name: Test (Swift 5 compatibility mode)
83
+ run: |
84
+ xcodebuild test \
85
+ -scheme MyApp \
86
+ -destination 'platform=macOS' \
87
+ SWIFT_VERSION=5
88
+ - language: yaml
89
+ label: "Pin swift-tools-version in Package.swift for SPM projects"
90
+ code: |
91
+ # In Package.swift — change the first line to request Swift 5 tools:
92
+ # // swift-tools-version: 5.10
93
+ #
94
+ # Then in the workflow:
95
+ jobs:
96
+ build:
97
+ runs-on: macos-26
98
+ steps:
99
+ - uses: actions/checkout@v4
100
+
101
+ - name: Build Swift package
102
+ run: swift build -c release
103
+ - language: yaml
104
+ label: "Temporarily pin to macos-15 while migrating to Swift 6"
105
+ code: |
106
+ jobs:
107
+ build:
108
+ # TODO: Migrate to Swift 6 and update to macos-26
109
+ # Track progress at: <link to your Swift 6 migration issue>
110
+ runs-on: macos-15
111
+ steps:
112
+ - uses: actions/checkout@v4
113
+
114
+ - name: Build
115
+ run: xcodebuild build -scheme MyApp -destination 'platform=macOS'
116
+ prevention:
117
+ - "Test workflows on macos-26 before relying on macos-latest switching to it"
118
+ - "Specify SWIFT_VERSION explicitly in Xcode project settings rather than relying on Xcode defaults"
119
+ - "Enable strict concurrency warnings (SWIFT_STRICT_CONCURRENCY=complete) in Swift 5 mode to preview Swift 6 errors before migrating"
120
+ - "Watch github.com/actions/runner-images release notes for macos-latest label changes"
121
+ - "Pin swift-tools-version in Package.swift to document the intended Swift compatibility level"
122
+ docs:
123
+ - url: "https://developer.apple.com/documentation/swift/migrating-to-swift-6"
124
+ label: "Apple Developer — Migrating to Swift 6"
125
+ - url: "https://www.swift.org/migration/documentation/swift-6-concurrency-migration-guide/"
126
+ label: "Swift.org — Swift 6 Concurrency Migration Guide"
127
+ - url: "https://github.com/actions/runner-images/blob/main/images/macos/macos-26-Readme.md"
128
+ label: "runner-images — macOS 26 image README (Xcode default version)"
129
+ - url: "https://developer.apple.com/documentation/xcode-release-notes"
130
+ label: "Xcode Release Notes — Xcode 26 language defaults"
@@ -0,0 +1,120 @@
1
+ id: runner-environment-115
2
+ title: "ubuntu-22.04/24.04 OpenSSL 3 disables legacy TLS renegotiation — SSL handshake failures connecting to legacy servers"
3
+ category: runner-environment
4
+ severity: error
5
+ tags:
6
+ - ubuntu-22.04
7
+ - ubuntu-24.04
8
+ - openssl-3
9
+ - tls
10
+ - ssl
11
+ - renegotiation
12
+ - runner-image-update
13
+ - networking
14
+ patterns:
15
+ - regex: 'unsafe legacy renegotiation disabled'
16
+ flags: 'i'
17
+ - regex: 'SSL_ERROR_RX_UNEXPECTED_HELLO_REQUEST'
18
+ flags: 'i'
19
+ - regex: 'error:0A000179:SSL routines.*unsafe legacy renegotiation'
20
+ flags: 'i'
21
+ - regex: 'UNSAFE_LEGACY_RENEGOTIATION_DISABLED'
22
+ flags: 'i'
23
+ - regex: 'ssl.*renegotiation.*not allowed'
24
+ flags: 'i'
25
+ error_messages:
26
+ - "error:0A000179:SSL routines::unsafe legacy renegotiation disabled"
27
+ - "SSL_ERROR_RX_UNEXPECTED_HELLO_REQUEST"
28
+ - "ssl.SSLError: [SSL: UNSAFE_LEGACY_RENEGOTIATION_DISABLED] unsafe legacy renegotiation disabled (_ssl.c:997)"
29
+ - "OpenSSL Error: error:0A000179:SSL routines:ssl3_read_bytes:unsafe legacy renegotiation disabled"
30
+ - "curl: (35) OpenSSL SSL_connect: error:0A000179:SSL routines::unsafe legacy renegotiation disabled"
31
+ - "java.io.IOException: Error writing to server: javax.net.ssl.SSLHandshakeException: Remote host terminated the handshake"
32
+ root_cause: |
33
+ Ubuntu 22.04 and 24.04 ship OpenSSL 3.0+. OpenSSL 3.0 enforces RFC 5746 (TLS Renegotiation
34
+ Indication Extension) by default and rejects connections to TLS servers that do not advertise
35
+ support for secure renegotiation in the initial ClientHello/ServerHello handshake.
36
+
37
+ Servers compiled against older OpenSSL (< 0.9.8m) or certain embedded TLS stacks do not send
38
+ the `renegotiation_info` extension and are therefore rejected by OpenSSL 3.0 clients with
39
+ `UNSAFE_LEGACY_RENEGOTIATION_DISABLED`.
40
+
41
+ This commonly surfaces when:
42
+ - Workflows connect to internal/staging HTTPS servers running old TLS stacks
43
+ - docker-compose services use self-signed certs from outdated libraries
44
+ - gRPC clients compiled against old OpenSSL connect to legacy gRPC servers
45
+ - curl/wget calls target third-party APIs that have not updated their TLS handshake
46
+ - Java HTTPS tests connect to embedded Jetty/Netty servers with old SSL config
47
+
48
+ The error did not occur on ubuntu-20.04 (OpenSSL 1.1.1, which allowed legacy renegotiation
49
+ by default). Workflows migrating from ubuntu-20.04 to 22.04/24.04 encounter it for the first
50
+ time.
51
+ fix: |
52
+ Option 1 (recommended for CI): Append `UnsafeLegacyRenegotiation = true` to the OpenSSL
53
+ config file at the start of the job. This is acceptable in CI/testing contexts where you
54
+ control the environment; never use this in production.
55
+
56
+ Option 2: Set OPENSSL_CONF to /dev/null to bypass the OpenSSL configuration file entirely.
57
+ Use only for quick diagnostics or tests against known internal servers.
58
+
59
+ Option 3 (recommended long-term): Upgrade the legacy server's TLS library so it advertises
60
+ RFC 5746 support. For embedded test servers, upgrade the underlying HTTP/TLS library version.
61
+
62
+ Option 4: Use `curl --no-sessionid` or `curl --legacy-renegotiation` (curl 7.83+) for
63
+ specific curl-based steps without affecting the whole environment.
64
+ fix_code:
65
+ - language: yaml
66
+ label: "Enable UnsafeLegacyRenegotiation in OpenSSL config for CI (workaround)"
67
+ code: |
68
+ jobs:
69
+ integration-test:
70
+ runs-on: ubuntu-24.04
71
+ steps:
72
+ - uses: actions/checkout@v4
73
+
74
+ - name: Allow legacy TLS renegotiation (CI workaround for legacy test servers)
75
+ run: |
76
+ echo "Options = UnsafeLegacyRenegotiation" | \
77
+ sudo tee -a /etc/ssl/openssl.cnf
78
+
79
+ - name: Run integration tests
80
+ run: npm test
81
+ - language: yaml
82
+ label: "Override OPENSSL_CONF per-step (minimal blast radius)"
83
+ code: |
84
+ jobs:
85
+ integration-test:
86
+ runs-on: ubuntu-24.04
87
+ steps:
88
+ - uses: actions/checkout@v4
89
+
90
+ - name: Test against legacy HTTPS endpoint
91
+ env:
92
+ OPENSSL_CONF: /dev/null
93
+ run: |
94
+ curl -v https://legacy-test-server.internal/health
95
+ - language: yaml
96
+ label: "Set OPENSSL_CONF at job level (affects all steps)"
97
+ code: |
98
+ jobs:
99
+ integration-test:
100
+ runs-on: ubuntu-24.04
101
+ env:
102
+ OPENSSL_CONF: /dev/null
103
+ steps:
104
+ - uses: actions/checkout@v4
105
+ - run: npm test
106
+ prevention:
107
+ - "Upgrade internal/staging test servers to modern TLS libraries that support RFC 5746"
108
+ - "Use `openssl s_client -connect host:443` in CI to detect legacy renegotiation issues before they block builds"
109
+ - "Avoid pinning to ubuntu-20.04 as a permanent workaround — it reached EOL and will be removed from runner images"
110
+ - "When upgrading from ubuntu-20.04 to 22.04/24.04, run a connectivity smoke-test against all HTTPS endpoints the workflow touches"
111
+ - "Use testcontainers or modern embedded test server libraries that ship up-to-date TLS stacks"
112
+ docs:
113
+ - url: "https://www.openssl.org/docs/man3.0/man3/SSL_CTX_set_options.html"
114
+ label: "OpenSSL 3.0 — SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION option"
115
+ - url: "https://github.com/actions/runner-images/issues/6399"
116
+ label: "runner-images #6399 — OpenSSL 3 renegotiation issues on ubuntu-22.04"
117
+ - url: "https://github.com/openssl/openssl/issues/17593"
118
+ label: "OpenSSL #17593 — Legacy renegotiation rejection in 3.0"
119
+ - url: "https://www.rfc-editor.org/rfc/rfc5746"
120
+ label: "RFC 5746 — TLS Renegotiation Indication Extension"