diff --git a/.github/workflows/keyfactor-starter-workflow.yml b/.github/workflows/keyfactor-starter-workflow.yml index 07fe0be..c9b180c 100644 --- a/.github/workflows/keyfactor-starter-workflow.yml +++ b/.github/workflows/keyfactor-starter-workflow.yml @@ -11,10 +11,17 @@ on: jobs: call-starter-workflow: - uses: keyfactor/actions/.github/workflows/starter.yml@v3 + uses: keyfactor/actions/.github/workflows/starter.yml@v4 + with: + command_token_url: ${{ vars.COMMAND_TOKEN_URL }} # Only required for doctool generated screenshots + command_hostname: ${{ vars.COMMAND_HOSTNAME }} # Only required for doctool generated screenshots + command_base_api_path: ${{ vars.COMMAND_API_PATH }} # Only required for doctool generated screenshots secrets: - token: ${{ secrets.V2BUILDTOKEN}} - APPROVE_README_PUSH: ${{ secrets.APPROVE_README_PUSH}} - gpg_key: ${{ secrets.KF_GPG_PRIVATE_KEY }} - gpg_pass: ${{ secrets.KF_GPG_PASSPHRASE }} - scan_token: ${{ secrets.SAST_TOKEN }} + token: ${{ secrets.V2BUILDTOKEN}} # REQUIRED + gpg_key: ${{ secrets.KF_GPG_PRIVATE_KEY }} # Only required for golang builds + gpg_pass: ${{ secrets.KF_GPG_PASSPHRASE }} # Only required for golang builds + scan_token: ${{ secrets.SAST_TOKEN }} # REQUIRED + entra_username: ${{ secrets.DOCTOOL_ENTRA_USERNAME }} # Only required for doctool generated screenshots + entra_password: ${{ secrets.DOCTOOL_ENTRA_PASSWD }} # Only required for doctool generated screenshots + command_client_id: ${{ secrets.COMMAND_CLIENT_ID }} # Only required for doctool generated screenshots + command_client_secret: ${{ secrets.COMMAND_CLIENT_SECRET }} # Only required for doctool generated screenshots \ No newline at end of file diff --git a/AzureEnterpriseApplicationOrchestrator.Tests/AzureEnterpriseApplicationOrchestrator.Tests.csproj b/AzureEnterpriseApplicationOrchestrator.Tests/AzureEnterpriseApplicationOrchestrator.Tests.csproj index ff06551..8a9f5e9 100644 --- a/AzureEnterpriseApplicationOrchestrator.Tests/AzureEnterpriseApplicationOrchestrator.Tests.csproj +++ b/AzureEnterpriseApplicationOrchestrator.Tests/AzureEnterpriseApplicationOrchestrator.Tests.csproj @@ -1,4 +1,4 @@ - + net8.0 @@ -10,6 +10,7 @@ + diff --git a/AzureEnterpriseApplicationOrchestrator.Tests/MockPAMSecretResolver.cs b/AzureEnterpriseApplicationOrchestrator.Tests/MockPAMSecretResolver.cs index b95fb19..93bf450 100644 --- a/AzureEnterpriseApplicationOrchestrator.Tests/MockPAMSecretResolver.cs +++ b/AzureEnterpriseApplicationOrchestrator.Tests/MockPAMSecretResolver.cs @@ -24,7 +24,7 @@ public MockPAMSecretResolver(Dictionary predefinedSecrets) public string Resolve(string instanceInfo) { // For testing, if we have a predefined secret, return it - if (_secrets.ContainsKey(instanceInfo)) + if (instanceInfo != null && _secrets.ContainsKey(instanceInfo)) { return _secrets[instanceInfo]; } diff --git a/AzureEnterpriseApplicationOrchestrator/AzureEnterpriseApplicationOrchestrator.csproj b/AzureEnterpriseApplicationOrchestrator/AzureEnterpriseApplicationOrchestrator.csproj index 6646f4d..ecbdc28 100644 --- a/AzureEnterpriseApplicationOrchestrator/AzureEnterpriseApplicationOrchestrator.csproj +++ b/AzureEnterpriseApplicationOrchestrator/AzureEnterpriseApplicationOrchestrator.csproj @@ -5,21 +5,35 @@ net6.0;net8.0;net10.0 true disable + $(NoWarn);SYSLIB0057 + + runtime; build; native; contentfiles; analyzers; buildtransitive all - - - + + + + + + + + + + + + - + + + diff --git a/AzureEnterpriseApplicationOrchestrator/Client/GraphClient.cs b/AzureEnterpriseApplicationOrchestrator/Client/GraphClient.cs index 07a1a99..e90ddc9 100644 --- a/AzureEnterpriseApplicationOrchestrator/Client/GraphClient.cs +++ b/AzureEnterpriseApplicationOrchestrator/Client/GraphClient.cs @@ -1,4 +1,4 @@ -// Copyright 2024 Keyfactor +// Copyright 2026 Keyfactor // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -242,15 +242,13 @@ public void AddApplicationCertificate(string certificateName, string certificate throw new Exception("Could not calculate thumbprint for certificate"); // Calculate the SHA256 hash of the certificate's thumbprint - byte[] customKeyId = Encoding.UTF8.GetBytes(certificate.Thumbprint)[..32]; + byte[] customKeyId = certificate.GetCertHash(); - _logger.LogDebug($"Adding certificate called \"{certificateName}\" to Object ID \"{_targetObjectId}\" (custom key ID {Encoding.UTF8.GetString(customKeyId)})"); + _logger.LogDebug($"Adding certificate called \"{certificateName}\" to Object ID \"{_targetObjectId}\" (custom key ID {Convert.ToHexString(customKeyId)})"); // Get the application object Application application = GetApplication(); - char[] certPem = PemEncoding.Write("CERTIFICATE", certificate.RawData); - // Update the application object _logger.LogDebug($"Updating application object for Object ID \"{_targetObjectId}\""); try @@ -267,7 +265,7 @@ public void AddApplicationCertificate(string certificateName, string certificate StartDateTime = DateTimeOffset.Parse(certificate.GetEffectiveDateString()), EndDateTime = DateTimeOffset.Parse(certificate.GetExpirationDateString()), KeyId = Guid.NewGuid(), - Key = System.Text.Encoding.UTF8.GetBytes(certPem) + Key = certificate.Export(X509ContentType.Cert), } } }).Wait(); @@ -332,6 +330,7 @@ public bool ApplicationCertificateExists(string certificateName) public void AddServicePrincipalCertificate(string certificateName, string certificateData, string certificatePassword) { + // certificateData is a base64 encoded PFX certificate X509Certificate2 certificate = SerializeCertificate(certificateData, certificatePassword); if (certificate.Thumbprint == null) @@ -801,7 +800,7 @@ private OperationResult> InventoryFromKeyCrede foreach (KeyCredential keyCredential in keyCredentials) { - string customKeyIdentifier = Encoding.UTF8.GetString(keyCredential.CustomKeyIdentifier); + string customKeyIdentifier = Convert.ToHexString(keyCredential.CustomKeyIdentifier); if (!string.IsNullOrWhiteSpace(keyCredential.Usage) && keyCredential.Usage.Equals("Sign", StringComparison.OrdinalIgnoreCase)) { @@ -989,8 +988,9 @@ protected X509Certificate2 GetCertificateFromKeyCredential(KeyCredential keyCred return certificate; } - protected static X509Certificate2 SerializeCertificate(string certificateData, string password) + private X509Certificate2 SerializeCertificate(string certificateData, string password) { + _logger.LogDebug($"Certificate Base64: {certificateData}"); byte[] rawData = Convert.FromBase64String(certificateData); return new X509Certificate2(rawData, password, X509KeyStorageFlags.Exportable); } diff --git a/AzureEnterpriseApplicationOrchestrator/GraphJobClientBuilder.cs b/AzureEnterpriseApplicationOrchestrator/GraphJobClientBuilder.cs index 33f0beb..e4f9095 100644 --- a/AzureEnterpriseApplicationOrchestrator/GraphJobClientBuilder.cs +++ b/AzureEnterpriseApplicationOrchestrator/GraphJobClientBuilder.cs @@ -139,7 +139,7 @@ public GraphJobClientBuilder WithV2CertificateStoreDetails(Certificate if (!string.IsNullOrEmpty(serverPassword)) { _logger.LogDebug("Client certificate not present - Using Client Secret authentication"); - _logger.LogTrace($"Builder - ServerPassword => ClientSecret: {properties.ServerPassword}"); + _logger.LogTrace($"Builder - ServerPassword => ClientSecret: ******"); _builder.WithClientSecret(serverPassword); } else if (!string.IsNullOrEmpty(properties.ClientCertificate)) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0c42b6f..7ef453a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ - Added PAM Support for Azure App Registrations and Service Principals. - Updated logging to remove sensitive information. +- 4.1.3 + - Added .Net 10 support +- 4.1.2 + - Updated Keyfactor.Orchestrators.Common to eliminate an issue with a revoked certificate. + - Updated Keyfactor.Orchestrators.IOrchestratorJobExtensions to 1.0.0. + - Updated Keyfactor.Logging to 1.3.0 for .Net8 version. - 4.1.1 - Updated the following packages to eliminate vulnerabilities: - Azure.Core diff --git a/docsource/images/AzureApp-advanced-store-type-dialog.png b/docsource/images/AzureApp-advanced-store-type-dialog.png index 3da9063..0bad172 100644 Binary files a/docsource/images/AzureApp-advanced-store-type-dialog.png and b/docsource/images/AzureApp-advanced-store-type-dialog.png differ diff --git a/docsource/images/AzureApp-basic-store-type-dialog.png b/docsource/images/AzureApp-basic-store-type-dialog.png index c7eb0f9..8af1242 100644 Binary files a/docsource/images/AzureApp-basic-store-type-dialog.png and b/docsource/images/AzureApp-basic-store-type-dialog.png differ diff --git a/docsource/images/AzureApp-custom-field-AzureCloud-dialog.png b/docsource/images/AzureApp-custom-field-AzureCloud-dialog.png new file mode 100644 index 0000000..41d8b6f Binary files /dev/null and b/docsource/images/AzureApp-custom-field-AzureCloud-dialog.png differ diff --git a/docsource/images/AzureApp-custom-field-AzureCloud-validation-options-dialog.png b/docsource/images/AzureApp-custom-field-AzureCloud-validation-options-dialog.png new file mode 100644 index 0000000..19c86e9 Binary files /dev/null and b/docsource/images/AzureApp-custom-field-AzureCloud-validation-options-dialog.png differ diff --git a/docsource/images/AzureApp-custom-field-ClientCertificate-dialog.png b/docsource/images/AzureApp-custom-field-ClientCertificate-dialog.png new file mode 100644 index 0000000..47c6c83 Binary files /dev/null and b/docsource/images/AzureApp-custom-field-ClientCertificate-dialog.png differ diff --git a/docsource/images/AzureApp-custom-field-ClientCertificate-validation-options-dialog.png b/docsource/images/AzureApp-custom-field-ClientCertificate-validation-options-dialog.png new file mode 100644 index 0000000..3eb0d19 Binary files /dev/null and b/docsource/images/AzureApp-custom-field-ClientCertificate-validation-options-dialog.png differ diff --git a/docsource/images/AzureApp-custom-field-ServerUseSsl-dialog.png b/docsource/images/AzureApp-custom-field-ServerUseSsl-dialog.png new file mode 100644 index 0000000..999800c Binary files /dev/null and b/docsource/images/AzureApp-custom-field-ServerUseSsl-dialog.png differ diff --git a/docsource/images/AzureApp-custom-field-ServerUseSsl-validation-options-dialog.png b/docsource/images/AzureApp-custom-field-ServerUseSsl-validation-options-dialog.png new file mode 100644 index 0000000..0e4d12e Binary files /dev/null and b/docsource/images/AzureApp-custom-field-ServerUseSsl-validation-options-dialog.png differ diff --git a/docsource/images/AzureApp-custom-fields-store-type-dialog.png b/docsource/images/AzureApp-custom-fields-store-type-dialog.png index fd3f507..7b753db 100644 Binary files a/docsource/images/AzureApp-custom-fields-store-type-dialog.png and b/docsource/images/AzureApp-custom-fields-store-type-dialog.png differ diff --git a/docsource/images/AzureApp2-advanced-store-type-dialog.png b/docsource/images/AzureApp2-advanced-store-type-dialog.png index 3da9063..0bad172 100644 Binary files a/docsource/images/AzureApp2-advanced-store-type-dialog.png and b/docsource/images/AzureApp2-advanced-store-type-dialog.png differ diff --git a/docsource/images/AzureApp2-basic-store-type-dialog.png b/docsource/images/AzureApp2-basic-store-type-dialog.png index da1e287..2225e20 100644 Binary files a/docsource/images/AzureApp2-basic-store-type-dialog.png and b/docsource/images/AzureApp2-basic-store-type-dialog.png differ diff --git a/docsource/images/AzureApp2-custom-field-AzureCloud-dialog.png b/docsource/images/AzureApp2-custom-field-AzureCloud-dialog.png new file mode 100644 index 0000000..91c328c Binary files /dev/null and b/docsource/images/AzureApp2-custom-field-AzureCloud-dialog.png differ diff --git a/docsource/images/AzureApp2-custom-field-AzureCloud-validation-options-dialog.png b/docsource/images/AzureApp2-custom-field-AzureCloud-validation-options-dialog.png new file mode 100644 index 0000000..b61c749 Binary files /dev/null and b/docsource/images/AzureApp2-custom-field-AzureCloud-validation-options-dialog.png differ diff --git a/docsource/images/AzureApp2-custom-field-ClientCertificate-dialog.png b/docsource/images/AzureApp2-custom-field-ClientCertificate-dialog.png new file mode 100644 index 0000000..47c6c83 Binary files /dev/null and b/docsource/images/AzureApp2-custom-field-ClientCertificate-dialog.png differ diff --git a/docsource/images/AzureApp2-custom-field-ClientCertificate-validation-options-dialog.png b/docsource/images/AzureApp2-custom-field-ClientCertificate-validation-options-dialog.png new file mode 100644 index 0000000..3eb0d19 Binary files /dev/null and b/docsource/images/AzureApp2-custom-field-ClientCertificate-validation-options-dialog.png differ diff --git a/docsource/images/AzureApp2-custom-field-ClientCertificatePassword-dialog.png b/docsource/images/AzureApp2-custom-field-ClientCertificatePassword-dialog.png new file mode 100644 index 0000000..ead78c2 Binary files /dev/null and b/docsource/images/AzureApp2-custom-field-ClientCertificatePassword-dialog.png differ diff --git a/docsource/images/AzureApp2-custom-field-ClientCertificatePassword-validation-options-dialog.png b/docsource/images/AzureApp2-custom-field-ClientCertificatePassword-validation-options-dialog.png new file mode 100644 index 0000000..19c86e9 Binary files /dev/null and b/docsource/images/AzureApp2-custom-field-ClientCertificatePassword-validation-options-dialog.png differ diff --git a/docsource/images/AzureApp2-custom-fields-store-type-dialog.png b/docsource/images/AzureApp2-custom-fields-store-type-dialog.png index c38faab..99d2cc4 100644 Binary files a/docsource/images/AzureApp2-custom-fields-store-type-dialog.png and b/docsource/images/AzureApp2-custom-fields-store-type-dialog.png differ diff --git a/docsource/images/AzureSP-advanced-store-type-dialog.png b/docsource/images/AzureSP-advanced-store-type-dialog.png index de0bde8..cff8f23 100644 Binary files a/docsource/images/AzureSP-advanced-store-type-dialog.png and b/docsource/images/AzureSP-advanced-store-type-dialog.png differ diff --git a/docsource/images/AzureSP-basic-store-type-dialog.png b/docsource/images/AzureSP-basic-store-type-dialog.png index 266ed32..0878f2d 100644 Binary files a/docsource/images/AzureSP-basic-store-type-dialog.png and b/docsource/images/AzureSP-basic-store-type-dialog.png differ diff --git a/docsource/images/AzureSP-custom-field-AzureCloud-dialog.png b/docsource/images/AzureSP-custom-field-AzureCloud-dialog.png new file mode 100644 index 0000000..41d8b6f Binary files /dev/null and b/docsource/images/AzureSP-custom-field-AzureCloud-dialog.png differ diff --git a/docsource/images/AzureSP-custom-field-AzureCloud-validation-options-dialog.png b/docsource/images/AzureSP-custom-field-AzureCloud-validation-options-dialog.png new file mode 100644 index 0000000..19c86e9 Binary files /dev/null and b/docsource/images/AzureSP-custom-field-AzureCloud-validation-options-dialog.png differ diff --git a/docsource/images/AzureSP-custom-field-ClientCertificate-dialog.png b/docsource/images/AzureSP-custom-field-ClientCertificate-dialog.png new file mode 100644 index 0000000..47c6c83 Binary files /dev/null and b/docsource/images/AzureSP-custom-field-ClientCertificate-dialog.png differ diff --git a/docsource/images/AzureSP-custom-field-ClientCertificate-validation-options-dialog.png b/docsource/images/AzureSP-custom-field-ClientCertificate-validation-options-dialog.png new file mode 100644 index 0000000..3eb0d19 Binary files /dev/null and b/docsource/images/AzureSP-custom-field-ClientCertificate-validation-options-dialog.png differ diff --git a/docsource/images/AzureSP-custom-field-ServerUseSsl-dialog.png b/docsource/images/AzureSP-custom-field-ServerUseSsl-dialog.png new file mode 100644 index 0000000..999800c Binary files /dev/null and b/docsource/images/AzureSP-custom-field-ServerUseSsl-dialog.png differ diff --git a/docsource/images/AzureSP-custom-field-ServerUseSsl-validation-options-dialog.png b/docsource/images/AzureSP-custom-field-ServerUseSsl-validation-options-dialog.png new file mode 100644 index 0000000..0e4d12e Binary files /dev/null and b/docsource/images/AzureSP-custom-field-ServerUseSsl-validation-options-dialog.png differ diff --git a/docsource/images/AzureSP-custom-fields-store-type-dialog.png b/docsource/images/AzureSP-custom-fields-store-type-dialog.png index fd3f507..7b753db 100644 Binary files a/docsource/images/AzureSP-custom-fields-store-type-dialog.png and b/docsource/images/AzureSP-custom-fields-store-type-dialog.png differ diff --git a/docsource/images/AzureSP2-advanced-store-type-dialog.png b/docsource/images/AzureSP2-advanced-store-type-dialog.png index de0bde8..cff8f23 100644 Binary files a/docsource/images/AzureSP2-advanced-store-type-dialog.png and b/docsource/images/AzureSP2-advanced-store-type-dialog.png differ diff --git a/docsource/images/AzureSP2-basic-store-type-dialog.png b/docsource/images/AzureSP2-basic-store-type-dialog.png index 85fe780..ce71413 100644 Binary files a/docsource/images/AzureSP2-basic-store-type-dialog.png and b/docsource/images/AzureSP2-basic-store-type-dialog.png differ diff --git a/docsource/images/AzureSP2-custom-field-AzureCloud-dialog.png b/docsource/images/AzureSP2-custom-field-AzureCloud-dialog.png new file mode 100644 index 0000000..91c328c Binary files /dev/null and b/docsource/images/AzureSP2-custom-field-AzureCloud-dialog.png differ diff --git a/docsource/images/AzureSP2-custom-field-AzureCloud-validation-options-dialog.png b/docsource/images/AzureSP2-custom-field-AzureCloud-validation-options-dialog.png new file mode 100644 index 0000000..b61c749 Binary files /dev/null and b/docsource/images/AzureSP2-custom-field-AzureCloud-validation-options-dialog.png differ diff --git a/docsource/images/AzureSP2-custom-field-ClientCertificate-dialog.png b/docsource/images/AzureSP2-custom-field-ClientCertificate-dialog.png new file mode 100644 index 0000000..47c6c83 Binary files /dev/null and b/docsource/images/AzureSP2-custom-field-ClientCertificate-dialog.png differ diff --git a/docsource/images/AzureSP2-custom-field-ClientCertificate-validation-options-dialog.png b/docsource/images/AzureSP2-custom-field-ClientCertificate-validation-options-dialog.png new file mode 100644 index 0000000..3eb0d19 Binary files /dev/null and b/docsource/images/AzureSP2-custom-field-ClientCertificate-validation-options-dialog.png differ diff --git a/docsource/images/AzureSP2-custom-field-ClientCertificatePassword-dialog.png b/docsource/images/AzureSP2-custom-field-ClientCertificatePassword-dialog.png new file mode 100644 index 0000000..ead78c2 Binary files /dev/null and b/docsource/images/AzureSP2-custom-field-ClientCertificatePassword-dialog.png differ diff --git a/docsource/images/AzureSP2-custom-field-ClientCertificatePassword-validation-options-dialog.png b/docsource/images/AzureSP2-custom-field-ClientCertificatePassword-validation-options-dialog.png new file mode 100644 index 0000000..19c86e9 Binary files /dev/null and b/docsource/images/AzureSP2-custom-field-ClientCertificatePassword-validation-options-dialog.png differ diff --git a/docsource/images/AzureSP2-custom-fields-store-type-dialog.png b/docsource/images/AzureSP2-custom-fields-store-type-dialog.png index c38faab..99d2cc4 100644 Binary files a/docsource/images/AzureSP2-custom-fields-store-type-dialog.png and b/docsource/images/AzureSP2-custom-fields-store-type-dialog.png differ