Skip to content

feat: Replace X509Certificate2 with BouncyCastle for certificate operations#64

Open
spbsoluble wants to merge 80 commits intorelease-1.3from
feat/x509certificate2_removal
Open

feat: Replace X509Certificate2 with BouncyCastle for certificate operations#64
spbsoluble wants to merge 80 commits intorelease-1.3from
feat/x509certificate2_removal

Conversation

@spbsoluble
Copy link
Contributor

No description provided.

spbsoluble and others added 21 commits February 18, 2026 13:09
Add BouncyCastle-based certificate utility layer to replace deprecated
X509Certificate2 APIs (SYSLIB0028).

**Added:**
- CertificateUtilities: Comprehensive utility class with 30+ methods
  - Certificate parsing (PEM, DER, PKCS12) with auto-detection
  - Properties extraction (thumbprint, subject/issuer, dates, algorithms)
  - Private key operations (extract, export as PEM/PKCS8)
  - Certificate chain loading and manipulation
  - Format detection and conversion utilities

- K8SCertificateContext: Wrapper model replacing X509Certificate2
  - Factory methods for all certificate formats
  - Computed properties for certificate attributes
  - Export methods for certificates and private keys

- Test project with 40+ comprehensive unit tests
  - Certificate parsing, format detection, conversion tests
  - Thumbprint calculation validated against X509Certificate2
  - RSA and ECDSA test certificate generation
  - Null argument validation

**Technical Details:**
- Uses existing BouncyCastle.Cryptography v2.6.2 dependency
- Thumbprint uses SHA-1 hash (uppercase hex) matching X509Certificate2
- PKCS#8 format for private keys (cross-platform compatible)
- Reuses patterns from KubeClient.cs and K8SPKCS12/Store.cs

**Impact:**
- No existing code modified (additive only)
- Zero breaking changes
- Builds successfully on net8.0 and net10.0

Refs: SYSLIB0028 deprecation warnings in JobBase.cs:1138,1154
Complete refactoring of KubeClient.cs PKCS12 operations to use
BouncyCastle Pkcs12Store instead of deprecated X509Certificate2Collection
and X509Certificate2 APIs.

**Added Helper Methods:**
- FindAliasByCN(): Find PKCS12 alias by Common Name
- FindAliasByThumbprint(): Find PKCS12 alias by thumbprint
- FindAliasByName(): Find PKCS12 alias by partial DN match
  All methods work directly with Pkcs12Store without X509Certificate2

**Refactored Methods:**
1. RemoveFromPKCS12SecretStore:
   - Replaced X509Certificate2Collection with Pkcs12Store
   - Import() → store.Load()
   - Remove() → store.DeleteEntry()
   - Export() → store.Save()

2. UpdatePKCS12SecretStore:
   - Replaced X509Certificate2Collection with Pkcs12Store
   - Multiple Import() calls → store.Load()
   - Certificate finding → FindAliasByCN/FindAliasByName
   - SetKeyEntry() for adding certs with private keys
   - Export() → store.Save()

3. CreatePKCS12Collection:
   - Removed X509Certificate2 instantiation
   - Direct Pkcs12Store loading and manipulation
   - Use CertificateUtilities.GetThumbprint() for alias

4. GetCertificateSigningRequestStatus:
   - X509Certificate2 → CertificateUtilities.ParseCertificateFromPem()

5. DiscoverCertificates:
   - X509Certificate2 → CertificateUtilities.ParseCertificateFromPem()
   - GetNameInfo() → CertificateUtilities.GetSubjectCN()

**Deprecated (backward compat):**
- FindCertificateByCN: Marked [Obsolete]
- FindCertificateByThumbprint: Marked [Obsolete]
- FindCertificateByAlias: Marked [Obsolete]

**Technical Details:**
- Uses CertificateUtilities for all certificate property extraction
- Maintains functional equivalence with existing code
- Zero X509Certificate2Collection usage in refactored methods
- Pkcs12Store used for all PKCS12 operations

**Impact:**
- Build succeeds with 0 errors
- SYSLIB0028/SYSLIB0057 warnings eliminated in KubeClient.cs
- No breaking changes to public APIs
- All KubeClient PKCS12 operations now use BouncyCastle
Complete refactoring of JobBase.cs to eliminate deprecated
X509Certificate2 APIs and use BouncyCastle for all certificate
operations. SYSLIB0028 warnings eliminated.

**Added:**
- GetKeyBytes(Pkcs12Store, string, string): New method using BouncyCastle
  - Extracts private keys directly from Pkcs12Store
  - Uses CertificateUtilities.ExportPrivateKeyPkcs8()
  - No deprecated X509Certificate2.PrivateKey usage

**Refactored:**
1. InitJobCertificate() method:
   - Replaced X509Certificate2 instantiation with Pkcs12Store loading
   - Uses LoadPkcs12Store() for all certificate data
   - Certificate parsing: CertificateUtilities for thumbprint/properties
   - Key type detection: CertificateUtilities.GetPrivateKeyType()
   - Private key extraction: KubeClient.ExtractPrivateKeyAsPem()
   - Chain handling: Uses BouncyCastle X509CertificateEntry arrays

2. K8SJobCertificate class:
   - Added K8SCertificateContext property (optional, modern approach)
   - Added GetCertificateContext() factory method
   - Maintains backward compatibility with existing properties
   - Enhanced documentation for BouncyCastle properties

**Deprecated (backward compat):**
- GetKeyBytes(X509Certificate2, string): Marked [Obsolete]
  - Pragma directives suppress SYSLIB0028 warnings in old method
  - Kept for backward compatibility only
  - Warning logged when called

**Technical Details:**
- Zero SYSLIB0028 warnings in JobBase.cs
- Zero X509Certificate2 usage in refactored code paths
- Uses CertificateUtilities for all certificate operations
- Pkcs12Store used for certificate/key loading

**Impact:**
- SYSLIB0028 warnings eliminated in JobBase.cs ✅
- No breaking changes to public APIs
- All InitJobCertificate operations now use BouncyCastle
Refactor Inventory.cs certificate parsing to use CertificateUtilities
instead of deprecated X509Certificate2 constructors. SYSLIB0057
warnings eliminated.

**Refactored:**
- Lines 512-520: Certificate parsing with thumbprint extraction
  - X509Certificate2 → CertificateUtilities.ParseCertificateFromPem/Der()
  - cert.Thumbprint → CertificateUtilities.GetThumbprint()

- Lines 594-598: Certificate validation parsing
  - X509Certificate2 → CertificateUtilities.ParseCertificateFromPem/Der()
  - Maintains same validation logic

**Technical Details:**
- Simple string replacement pattern for both locations
- Automatically detects PEM vs DER format
- Uses CertificateUtilities.ParseCertificateFromPem() for PEM
- Uses CertificateUtilities.ParseCertificateFromDer() for DER
- Thumbprint extraction via CertificateUtilities.GetThumbprint()

**Impact:**
- SYSLIB0057 warnings eliminated in Inventory.cs ✅
- Zero SYSLIB deprecation warnings remaining ✅
- No breaking changes to inventory functionality
- Maintains identical behavior with BouncyCastle
…tive data redaction

Implements security-first comprehensive logging across the entire Kubernetes orchestrator extension, adding trace-level observability while ensuring zero sensitive data exposure. This addresses the need for verbose troubleshooting capabilities without compromising security.

## New Components

### LoggingUtilities.cs (~450 lines)
Centralized sensitive data redaction utility providing secure logging helpers:
- RedactPassword() - Shows length only, never password value
- GetPasswordCorrelationId() - SHA-256 hash prefix for password correlation across logs
- RedactPrivateKey*() - Redacts PEM, DER, bytes, and BouncyCastle AsymmetricKeyParameter objects
- GetCertificateSummary() - Shows thumbprint, CN, validity dates only (no certificate data)
- GetSecretSummary() - Shows V1Secret metadata only (name, namespace, type, key count)
- RedactKubeconfig() - Safely logs kubeconfig structure without tokens/certificates
- RedactToken() - Shows token length with prefix/suffix only
- GetFieldPresence() - Indicates field presence without revealing values

### LoggingSafetyTests.cs (12 tests)
Automated security verification suite ensuring no sensitive data leaks:
- Regex-based source code scanning for insecure logging patterns
- Verification of all LoggingUtilities redaction methods
- Detection of TODO:INSECURE comments
- Password, private key, and token logging detection

## Security Improvements

### K8SJKS/Store.cs
- REMOVED 15+ insecure commented logging statements marked with "TODO: INSECURE"
- Replaced all direct password logging with LoggingUtilities.RedactPassword()
- Added password correlation IDs for troubleshooting without exposing passwords
- Lines cleaned: 48, 58-59, 81, 98, 150-151, 157-158, 181-182, 194-195, 222-223, 244-245, 311-312, 402-403, 410-411

### JobBase.cs
- Standardized password redaction in getK8SStorePassword() method (line 1040)
- Added password correlation IDs for troubleshooting
- Enhanced InitJobCertificate() with certificate summary logging
- Added PKCS12 data size logging (not content)
- Added private key presence indicators (not key material)

### Inventory.cs
- Replaced direct password hash logging with correlation IDs (line 327)

## Enhanced Logging Coverage

### CertificateUtilities.cs (~60+ logging statements)
Added comprehensive trace-level logging to previously unlogged utility:
- ParseCertificate() - Format detection and parsing flow
- ParseCertificateFromPem() - PEM parsing with certificate summaries
- ParseCertificateFromDer() - DER parsing diagnostics
- ParseCertificateFromPkcs12() - PKCS12 parsing with redacted passwords
- GetThumbprint() - Computed thumbprint logging
- ExtractPrivateKey() - Key extraction with redacted key info
- ExportPrivateKeyPkcs8() - Export with redacted bytes
- LoadPkcs12Store() - Store loading with password correlation IDs
- LoadCertificateChain() - Chain parsing diagnostics
- DetectFormat() - Format detection logging

### K8SCertificateContext.cs (~40 logging statements)
Added logging to factory methods and exports:
- FromPkcs12() - Alias selection, certificate loading, chain extraction
- FromPem() - PEM parsing and chain detection
- FromDer() - DER parsing diagnostics
- FromCertificate() - Context creation logging
- ExportCertificatePem() - Export with redacted output
- ExportPrivateKeyPkcs8() - Key export with redacted bytes

### KubeClient.cs
Enhanced ParseKubeConfig() and RemoveFromPKCS12SecretStore():
- Safe kubeconfig logging without tokens/certificates
- Token presence indicators (not token values)
- Cluster/user/context metadata logging
- Buddy secret password handling with redaction
- Password correlation IDs for troubleshooting

### Management.cs
Enhanced HandleOpaqueSecret():
- Certificate summary logging (thumbprint, CN, validity)
- Private key presence indicators
- Chain certificate count logging
- Operation parameter logging (overwrite, append modes)

## Log Level Best Practices

TRACE: Method parameters (redacted), execution flow, correlation IDs, data sizes
DEBUG: Certificate metadata, operation outcomes, configuration values, K8S resource metadata
INFORMATION: Job milestones, successful operations
WARNING: Non-critical errors with recovery, deprecated usage
ERROR: Failures with full context and stack traces

## Testing

- All 12 LoggingSafetyTests passed (100% pass rate)
- Build successful: 0 errors, 35 pre-existing warnings
- Verified no sensitive data patterns in logs
- Automated regex scanning detects password/key/token logging

## Security Guarantees

✅ Zero passwords logged (only length and correlation IDs)
✅ Zero private keys logged (only type and presence indicators)
✅ Zero tokens logged (only length and truncated prefix/suffix)
✅ Zero certificate PEM/DER logged (only thumbprint, CN, validity)
✅ Zero kubeconfig secrets logged (only structure metadata)
✅ All V1Secret data values redacted (only keys and counts)

## Breaking Changes

None - Only additive logging enhancements

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
@github-actions github-actions bot added documentation Improvements or additions to documentation dependencies Pull requests that update a dependency file ci/cd needs-review tests feature labels Feb 20, 2026
@github-actions
Copy link

github-actions bot commented Feb 20, 2026

Dependency Review

The following issues were found:
  • ✅ 0 vulnerable package(s)
  • ✅ 0 package(s) with incompatible licenses
  • ✅ 0 package(s) with invalid SPDX license definitions
  • ⚠️ 9 package(s) with unknown licenses.
See the Details below.

License Issues

.github/workflows/dotnet-security-scan.yml

PackageVersionLicenseIssue Type
actions/checkout4.*.*NullUnknown License
actions/setup-dotnet4.*.*NullUnknown License
actions/upload-artifact4.*.*NullUnknown License

.github/workflows/secret-scanning.yml

PackageVersionLicenseIssue Type
actions/checkout4.*.*NullUnknown License

.github/workflows/unit-tests.yml

PackageVersionLicenseIssue Type
EnricoMi/publish-unit-test-result-action2.*.*NullUnknown License
actions/checkout4.*.*NullUnknown License
actions/setup-dotnet4.*.*NullUnknown License
actions/upload-artifact4.*.*NullUnknown License
codecov/codecov-action4.*.*NullUnknown License

OpenSSF Scorecard

Scorecard details
PackageVersionScoreDetails
actions/actions/checkout 4.*.* 🟢 6.2
Details
CheckScoreReason
Maintained🟢 45 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 4
Code-Review🟢 10all changesets reviewed
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Binary-Artifacts🟢 10no binaries found in the repo
License🟢 10license file detected
Fuzzing⚠️ 0project is not fuzzed
Packaging⚠️ -1packaging workflow not detected
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
Signed-Releases⚠️ -1no releases found
Pinned-Dependencies🟢 3dependency not pinned by hash detected -- score normalized to 3
Security-Policy🟢 9security policy file detected
Branch-Protection🟢 6branch protection is not maximal on development and all release branches
SAST🟢 8SAST tool detected but not run on all commits
actions/actions/setup-dotnet 4.*.* 🟢 5.6
Details
CheckScoreReason
Code-Review🟢 10all changesets reviewed
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Maintained🟢 57 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 5
Packaging⚠️ -1packaging workflow not detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Binary-Artifacts🟢 10no binaries found in the repo
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
Fuzzing⚠️ 0project is not fuzzed
License🟢 10license file detected
Pinned-Dependencies⚠️ 0dependency not pinned by hash detected -- score normalized to 0
Signed-Releases⚠️ -1no releases found
Branch-Protection⚠️ 0branch protection not enabled on development/release branches
Security-Policy🟢 9security policy file detected
SAST🟢 9SAST tool is not run on all commits -- score normalized to 9
actions/actions/upload-artifact 4.*.* 🟢 6.2
Details
CheckScoreReason
Code-Review🟢 10all changesets reviewed
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Maintained🟢 1027 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10
Packaging⚠️ -1packaging workflow not detected
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
Binary-Artifacts🟢 10no binaries found in the repo
Fuzzing⚠️ 0project is not fuzzed
License🟢 10license file detected
Pinned-Dependencies⚠️ 1dependency not pinned by hash detected -- score normalized to 1
Signed-Releases⚠️ -1no releases found
Security-Policy🟢 9security policy file detected
Branch-Protection⚠️ 0branch protection not enabled on development/release branches
SAST🟢 10SAST tool is run on all commits
actions/actions/checkout 4.*.* 🟢 6.2
Details
CheckScoreReason
Maintained🟢 45 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 4
Code-Review🟢 10all changesets reviewed
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Binary-Artifacts🟢 10no binaries found in the repo
License🟢 10license file detected
Fuzzing⚠️ 0project is not fuzzed
Packaging⚠️ -1packaging workflow not detected
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
Signed-Releases⚠️ -1no releases found
Pinned-Dependencies🟢 3dependency not pinned by hash detected -- score normalized to 3
Security-Policy🟢 9security policy file detected
Branch-Protection🟢 6branch protection is not maximal on development and all release branches
SAST🟢 8SAST tool detected but not run on all commits
actions/trufflesecurity/trufflehog main 🟢 6.9
Details
CheckScoreReason
Code-Review🟢 10all changesets reviewed
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Security-Policy🟢 10security policy file detected
Maintained🟢 1030 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
License🟢 10license file detected
Binary-Artifacts🟢 9binaries present in source code
Fuzzing⚠️ 0project is not fuzzed
Branch-Protection🟢 5branch protection is not maximal on development and all release branches
Signed-Releases🟢 85 out of the last 5 releases have a total of 5 signed artifacts.
Pinned-Dependencies⚠️ 0dependency not pinned by hash detected -- score normalized to 0
Packaging🟢 10packaging workflow detected
SAST🟢 10SAST tool is run on all commits
actions/EnricoMi/publish-unit-test-result-action 2.*.* 🟢 5.8
Details
CheckScoreReason
Maintained🟢 1010 commit(s) and 6 issue activity found in the last 90 days -- score normalized to 10
Code-Review⚠️ 1Found 5/27 approved changesets -- score normalized to 1
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
Binary-Artifacts🟢 10no binaries found in the repo
Security-Policy⚠️ 0security policy file not detected
Fuzzing⚠️ 0project is not fuzzed
License🟢 10license file detected
Pinned-Dependencies🟢 6dependency not pinned by hash detected -- score normalized to 6
Signed-Releases⚠️ -1no releases found
Branch-Protection⚠️ -1internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
Packaging🟢 10packaging workflow detected
SAST🟢 9SAST tool detected but not run on all commits
actions/actions/checkout 4.*.* 🟢 6.2
Details
CheckScoreReason
Maintained🟢 45 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 4
Code-Review🟢 10all changesets reviewed
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Binary-Artifacts🟢 10no binaries found in the repo
License🟢 10license file detected
Fuzzing⚠️ 0project is not fuzzed
Packaging⚠️ -1packaging workflow not detected
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
Signed-Releases⚠️ -1no releases found
Pinned-Dependencies🟢 3dependency not pinned by hash detected -- score normalized to 3
Security-Policy🟢 9security policy file detected
Branch-Protection🟢 6branch protection is not maximal on development and all release branches
SAST🟢 8SAST tool detected but not run on all commits
actions/actions/setup-dotnet 4.*.* 🟢 5.6
Details
CheckScoreReason
Code-Review🟢 10all changesets reviewed
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Maintained🟢 57 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 5
Packaging⚠️ -1packaging workflow not detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Binary-Artifacts🟢 10no binaries found in the repo
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
Fuzzing⚠️ 0project is not fuzzed
License🟢 10license file detected
Pinned-Dependencies⚠️ 0dependency not pinned by hash detected -- score normalized to 0
Signed-Releases⚠️ -1no releases found
Branch-Protection⚠️ 0branch protection not enabled on development/release branches
Security-Policy🟢 9security policy file detected
SAST🟢 9SAST tool is not run on all commits -- score normalized to 9
actions/actions/upload-artifact 4.*.* 🟢 6.2
Details
CheckScoreReason
Code-Review🟢 10all changesets reviewed
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Maintained🟢 1027 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10
Packaging⚠️ -1packaging workflow not detected
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
Binary-Artifacts🟢 10no binaries found in the repo
Fuzzing⚠️ 0project is not fuzzed
License🟢 10license file detected
Pinned-Dependencies⚠️ 1dependency not pinned by hash detected -- score normalized to 1
Signed-Releases⚠️ -1no releases found
Security-Policy🟢 9security policy file detected
Branch-Protection⚠️ 0branch protection not enabled on development/release branches
SAST🟢 10SAST tool is run on all commits
actions/codecov/codecov-action 4.*.* 🟢 7
Details
CheckScoreReason
Dependency-Update-Tool🟢 10update tool detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Packaging⚠️ -1packaging workflow not detected
Code-Review🟢 10all changesets reviewed
Maintained⚠️ 23 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 2
Pinned-Dependencies⚠️ 2dependency not pinned by hash detected -- score normalized to 2
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
Binary-Artifacts🟢 10no binaries found in the repo
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Vulnerabilities🟢 100 existing vulnerabilities detected
Signed-Releases⚠️ -1no releases found
Fuzzing⚠️ 0project is not fuzzed
License🟢 10license file detected
Branch-Protection⚠️ -1internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration
Security-Policy🟢 10security policy file detected
SAST🟢 9SAST tool detected but not run on all commits
CI-Tests🟢 929 out of 30 merged PRs checked by a CI test -- score normalized to 9
Contributors🟢 10project has 13 contributing companies or organizations
nuget/Microsoft.NET.Test.Sdk 17.12.0 🟢 4.1
Details
CheckScoreReason
Code-Review⚠️ 2Found 4/15 approved changesets -- score normalized to 2
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Packaging⚠️ -1packaging workflow not detected
Maintained🟢 1030 commit(s) and 17 issue activity found in the last 90 days -- score normalized to 10
Security-Policy🟢 10security policy file detected
License🟢 10license file detected
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Signed-Releases⚠️ -1no releases found
Branch-Protection⚠️ -1internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
Binary-Artifacts⚠️ 0binaries present in source code
Fuzzing⚠️ 0project is not fuzzed
Pinned-Dependencies⚠️ 0dependency not pinned by hash detected -- score normalized to 0
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
nuget/Moq 4.20.72 UnknownUnknown
nuget/coverlet.collector 6.0.4 🟢 5.1
Details
CheckScoreReason
Maintained🟢 1028 commit(s) and 13 issue activity found in the last 90 days -- score normalized to 10
Code-Review⚠️ 0Found 0/30 approved changesets -- score normalized to 0
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Packaging⚠️ -1packaging workflow not detected
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Token-Permissions🟢 9detected GitHub workflow tokens with excessive permissions
Binary-Artifacts🟢 7binaries present in source code
License🟢 10license file detected
Fuzzing⚠️ 0project is not fuzzed
Pinned-Dependencies⚠️ 0dependency not pinned by hash detected -- score normalized to 0
Signed-Releases⚠️ 0Project has not signed or included provenance with any releases.
Branch-Protection⚠️ -1internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
Security-Policy⚠️ 0security policy file not detected
SAST🟢 10SAST tool is run on all commits
nuget/xunit 2.9.3 🟢 4.3
Details
CheckScoreReason
Code-Review⚠️ 1Found 3/30 approved changesets -- score normalized to 1
Maintained🟢 1030 commit(s) and 26 issue activity found in the last 90 days -- score normalized to 10
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Packaging⚠️ -1packaging workflow not detected
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Binary-Artifacts🟢 10no binaries found in the repo
Pinned-Dependencies⚠️ 0dependency not pinned by hash detected -- score normalized to 0
License🟢 9license file detected
Fuzzing⚠️ 0project is not fuzzed
Signed-Releases⚠️ -1no releases found
Branch-Protection⚠️ -1internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
Security-Policy⚠️ 0security policy file not detected
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
nuget/xunit.runner.visualstudio 3.0.2 UnknownUnknown
nuget/System.Drawing.Common 8.0.0 🟢 6.8
Details
CheckScoreReason
Maintained🟢 1030 commit(s) and 11 issue activity found in the last 90 days -- score normalized to 10
Packaging⚠️ -1packaging workflow not detected
Code-Review🟢 10all changesets reviewed
Security-Policy🟢 10security policy file detected
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
License🟢 10license file detected
Signed-Releases⚠️ -1no releases found
Branch-Protection⚠️ -1internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
Binary-Artifacts🟢 10no binaries found in the repo
Fuzzing⚠️ 0project is not fuzzed
Pinned-Dependencies🟢 8dependency not pinned by hash detected -- score normalized to 8
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0

Scanned Files

  • .github/workflows/dotnet-security-scan.yml
  • .github/workflows/secret-scanning.yml
  • .github/workflows/unit-tests.yml
  • kubernetes-orchestrator-extension.Tests/Keyfactor.Orchestrators.K8S.Tests.csproj
  • kubernetes-orchestrator-extension/Keyfactor.Orchestrators.K8S.csproj

@spbsoluble spbsoluble changed the base branch from release-1.2 to release-1.3 February 26, 2026 20:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci/cd dependencies Pull requests that update a dependency file documentation Improvements or additions to documentation feature needs-review tests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant