diff --git a/.github/workflows/keyfactor-bootstrap-workflow.yml b/.github/workflows/keyfactor-bootstrap-workflow.yml index 64919a4..5726e90 100644 --- a/.github/workflows/keyfactor-bootstrap-workflow.yml +++ b/.github/workflows/keyfactor-bootstrap-workflow.yml @@ -11,10 +11,13 @@ on: jobs: call-starter-workflow: - uses: keyfactor/actions/.github/workflows/starter.yml@v3 + uses: keyfactor/actions/.github/workflows/starter.yml@v4 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 }} + entra_username: ${{ secrets.DOCTOOL_ENTRA_USERNAME }} + entra_password: ${{ secrets.DOCTOOL_ENTRA_PASSWD }} + command_client_id: ${{ secrets.DOCTOOL_COMMAND_CLIENT_ID }} + command_client_secret: ${{ secrets.DOCTOOL_COMMAND_CLIENT_SECRET }} diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 9ec56f6..e66fdc8 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -9,21 +9,25 @@ jobs: # Checkout code # https://github.com/actions/checkout - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v5 # Setup dotnet 8.0 # https://github.com/actions/setup-dotnet - - uses: actions/setup-dotnet@v3 + - uses: actions/setup-dotnet@v5 with: dotnet-version: '8.x' # Setup nuget - - name: Setup build environment + - name: Add Keyfactor NuGet Source run: | dotnet nuget add source https://nuget.pkg.github.com/Keyfactor/index.json -n github -u ${{ github.actor }} -p ${{ secrets.V2BUILDTOKEN }} --store-password-in-clear-text - dotnet restore + + - name: Restore dependencies + run: dotnet restore + + - name: Build solution + run: dotnet build --no-restore --configuration Release # Build and test dotnet project - name: Build and Test - run: dotnet test - + run: dotnet test --no-build --configuration Release diff --git a/.gitignore b/.gitignore index 0d19ba0..b108f3c 100644 --- a/.gitignore +++ b/.gitignore @@ -350,3 +350,5 @@ healthchecksdb */C: logs + +.env \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 57cdc20..ddd030b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# v1.2.1 +## Chores +- Add note about OTE API keys not being supported with this integration due to shopper ID resolution requirements. + # v1.2.0 - Add special condition to handle status 409 when downloading certificates from GoDaddy. 409 indicates that the certificate state does not allow download. diff --git a/GoDaddy.Tests/FakeCaConfigProvider.cs b/GoDaddy.Tests/Fakes/FakeCaConfigProvider.cs similarity index 99% rename from GoDaddy.Tests/FakeCaConfigProvider.cs rename to GoDaddy.Tests/Fakes/FakeCaConfigProvider.cs index 9330922..21de529 100644 --- a/GoDaddy.Tests/FakeCaConfigProvider.cs +++ b/GoDaddy.Tests/Fakes/FakeCaConfigProvider.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. diff --git a/GoDaddy.Tests/FakeCertificateDataReader.cs b/GoDaddy.Tests/Fakes/FakeCertificateDataReader.cs similarity index 98% rename from GoDaddy.Tests/FakeCertificateDataReader.cs rename to GoDaddy.Tests/Fakes/FakeCertificateDataReader.cs index 47213f1..b3b5a99 100644 --- a/GoDaddy.Tests/FakeCertificateDataReader.cs +++ b/GoDaddy.Tests/Fakes/FakeCertificateDataReader.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. diff --git a/GoDaddy.Tests/FakeGoDaddyClient.cs b/GoDaddy.Tests/Fakes/FakeGoDaddyClient.cs similarity index 99% rename from GoDaddy.Tests/FakeGoDaddyClient.cs rename to GoDaddy.Tests/Fakes/FakeGoDaddyClient.cs index e8a3a4f..d074b79 100644 --- a/GoDaddy.Tests/FakeGoDaddyClient.cs +++ b/GoDaddy.Tests/Fakes/FakeGoDaddyClient.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. diff --git a/GoDaddy.Tests/GoDaddy.Tests.csproj b/GoDaddy.Tests/GoDaddy.Tests.csproj index 358f259..f852f75 100644 --- a/GoDaddy.Tests/GoDaddy.Tests.csproj +++ b/GoDaddy.Tests/GoDaddy.Tests.csproj @@ -21,12 +21,12 @@ - - + + + + + + - - - - diff --git a/GoDaddy.Tests/GoDaddyCAPlugin.cs b/GoDaddy.Tests/GoDaddyCAPluginTests.cs similarity index 88% rename from GoDaddy.Tests/GoDaddyCAPlugin.cs rename to GoDaddy.Tests/GoDaddyCAPluginTests.cs index 66c30b7..1b3879e 100644 --- a/GoDaddy.Tests/GoDaddyCAPlugin.cs +++ b/GoDaddy.Tests/GoDaddyCAPluginTests.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. @@ -28,6 +28,15 @@ namespace Keyfactor.Extensions.CAPlugin.GoDaddyTests; public class GoDaddyCAPluginTests { + private static readonly DateTimeOffset NotBefore = DateTimeOffset.Now.AddDays(-100); + private static readonly DateTimeOffset ReissueNotAfter = DateTimeOffset.Now.AddDays(365); + private static readonly DateTimeOffset RenewalNotAfter = DateTimeOffset.Now.AddDays(59); + + private const string TestSubject = "CN=Test Subject"; + private static readonly string TestCsr = GenerateCSR(TestSubject); + private static readonly X509Certificate2 FakeReissueCertificate = FakeGoDaddyClient.GenerateSelfSignedCertificate(RSA.Create(2048), "CN=Test Cert", NotBefore, ReissueNotAfter); + private static readonly X509Certificate2 FakeRenewalCertificate = FakeGoDaddyClient.GenerateSelfSignedCertificate(RSA.Create(2048), "CN=Test Cert", NotBefore, RenewalNotAfter); + ILogger _logger { get; set;} public GoDaddyCAPluginTests() @@ -253,7 +262,7 @@ public void GoDaddyCAPlugin_ValidateProductInfo_EV_InvalidParameters_ReturnFailu [InlineData("UCC_DV_SSL")] [InlineData("UCC_EV_SSL")] [InlineData("UCC_OV_SSL")] - public void GoDaddyCAPlugin_Enroll_ReturnSuccess(string productID) + public async Task GoDaddyCAPlugin_Enroll_ReturnSuccess(string productID) { // Arrange FakeGoDaddyClient fakeClient = new FakeGoDaddyClient(); @@ -267,10 +276,6 @@ public void GoDaddyCAPlugin_Enroll_ReturnSuccess(string productID) Client = fakeClient }; plugin.Initialize(configProvider, certificateDataReader); - - // CSR - string subject = "CN=Test Subject"; - string csrString = GenerateCSR(subject); Dictionary sans = new(); @@ -307,10 +312,10 @@ public void GoDaddyCAPlugin_Enroll_ReturnSuccess(string productID) EnrollmentType type = EnrollmentType.New; // Act - EnrollmentResult result = plugin.Enroll(csrString, subject, sans, productInfo, format, type).Result; + EnrollmentResult result = await plugin.Enroll(TestCsr, TestSubject, sans, productInfo, format, type); // Assert - Assert.Equal(result.Status, (int)EndEntityStatus.GENERATED); + Assert.Equal((int)EndEntityStatus.GENERATED, result.Status); } [Theory] @@ -324,12 +329,13 @@ public void GoDaddyCAPlugin_Enroll_ReturnSuccess(string productID) [InlineData("UCC_DV_SSL")] [InlineData("UCC_EV_SSL")] [InlineData("UCC_OV_SSL")] - public void GoDaddyCAPlugin_Renew_ReturnSuccess(string productID) + public async Task GoDaddyCAPlugin_Renew_ReturnSuccess(string productID) { // Arrange - DateTime enrollmentNotBefore = DateTime.UtcNow.AddDays(-5); - DateTime enrollmentNotAfter = DateTime.UtcNow.AddDays(20); - X509Certificate2 fakeCertificate = FakeGoDaddyClient.GenerateSelfSignedCertificate(RSA.Create(2048), "CN=Test Cert", enrollmentNotBefore, enrollmentNotAfter); + + // Renewal is only available 60 days prior to expiration of the previous certificate and 30 days after the + // expiration of the previous certificate. + string fakeCaRequestId = Guid.NewGuid().ToString(); FakeGoDaddyClient fakeClient = new FakeGoDaddyClient() @@ -339,7 +345,7 @@ public void GoDaddyCAPlugin_Renew_ReturnSuccess(string productID) { fakeCaRequestId, new AnyCAPluginCertificate { CARequestID = fakeCaRequestId, - Certificate = fakeCertificate.ExportCertificatePem(), + Certificate = FakeRenewalCertificate.ExportCertificatePem(), Status = 123, ProductID = productID, } @@ -347,12 +353,6 @@ public void GoDaddyCAPlugin_Renew_ReturnSuccess(string productID) } }; - // Renewal is only available 60 days prior to expiration of the previous certificate and 30 days after the - // expiration of the previous certificate. - - fakeClient.EnrollmentNotBefore = enrollmentNotBefore; - fakeClient.EnrollmentNotAfter = enrollmentNotAfter; - BlockingCollection certificates = new BlockingCollection(); IAnyCAPluginConfigProvider configProvider = new FakeCaConfigProvider(new Config()); @@ -364,10 +364,6 @@ public void GoDaddyCAPlugin_Renew_ReturnSuccess(string productID) }; plugin.Initialize(configProvider, certificateDataReader); - // CSR - string subject = "CN=Test Subject"; - string csrString = GenerateCSR(subject); - Dictionary sans = new(); EnrollmentProductInfo productInfo = new EnrollmentProductInfo @@ -394,7 +390,7 @@ public void GoDaddyCAPlugin_Renew_ReturnSuccess(string productID) { EnrollmentConfigConstants.JobTitle, "Software Engineer" }, { EnrollmentConfigConstants.RegistrationAgent, "Agent" }, { EnrollmentConfigConstants.RegistrationNumber, "REG-12345" }, - { "PriorCertSN", fakeCertificate.SerialNumber } + { "PriorCertSN", FakeRenewalCertificate.SerialNumber } } }; @@ -404,12 +400,12 @@ public void GoDaddyCAPlugin_Renew_ReturnSuccess(string productID) EnrollmentType type = EnrollmentType.Renew; // Act - EnrollmentResult result = plugin.Enroll(csrString, subject, sans, productInfo, format, type).Result; + EnrollmentResult result = await plugin.Enroll(TestCsr, TestSubject, sans, productInfo, format, type); // Assert - Assert.Equal(result.Status, (int)EndEntityStatus.GENERATED); - Assert.Equal(result.StatusMessage, $"Certificate with ID {fakeCaRequestId} has been renewed"); - Assert.Equal(result.CARequestID, fakeCaRequestId); + Assert.Equal((int)EndEntityStatus.GENERATED, result.Status); + Assert.Equal($"Certificate with ID {fakeCaRequestId} has been renewed", result.StatusMessage); + Assert.Equal(fakeCaRequestId, result.CARequestID); } [Theory] @@ -423,12 +419,12 @@ public void GoDaddyCAPlugin_Renew_ReturnSuccess(string productID) [InlineData("UCC_DV_SSL")] [InlineData("UCC_EV_SSL")] [InlineData("UCC_OV_SSL")] - public void GoDaddyCAPlugin_Reissue_ReturnSuccess(string productID) + public async Task GoDaddyCAPlugin_Reissue_ReturnSuccess(string productID) { // Arrange - DateTime enrollmentNotBefore = DateTime.UtcNow.AddDays(-100); - DateTime enrollmentNotAfter = DateTime.UtcNow.AddDays(365); - X509Certificate2 fakeCertificate = FakeGoDaddyClient.GenerateSelfSignedCertificate(RSA.Create(2048), "CN=Test Cert", enrollmentNotBefore, enrollmentNotAfter); + // DateTime enrollmentNotBefore = DateTime.UtcNow.AddDays(-100); + // DateTime enrollmentNotAfter = DateTime.UtcNow.AddDays(365); + // X509Certificate2 fakeCertificate = FakeGoDaddyClient.GenerateSelfSignedCertificate(RSA.Create(2048), "CN=Test Cert", enrollmentNotBefore, enrollmentNotAfter); string fakeCaRequestId = Guid.NewGuid().ToString(); FakeGoDaddyClient fakeClient = new FakeGoDaddyClient() @@ -438,7 +434,7 @@ public void GoDaddyCAPlugin_Reissue_ReturnSuccess(string productID) { fakeCaRequestId, new AnyCAPluginCertificate { CARequestID = fakeCaRequestId, - Certificate = fakeCertificate.ExportCertificatePem(), + Certificate = FakeReissueCertificate.ExportCertificatePem(), Status = 123, ProductID = productID, } @@ -446,12 +442,6 @@ public void GoDaddyCAPlugin_Reissue_ReturnSuccess(string productID) } }; - // Renewal is only available 60 days prior to expiration of the previous certificate and 30 days after the - // expiration of the previous certificate. - - fakeClient.EnrollmentNotBefore = enrollmentNotBefore; - fakeClient.EnrollmentNotAfter = enrollmentNotAfter; - BlockingCollection certificates = new BlockingCollection(); IAnyCAPluginConfigProvider configProvider = new FakeCaConfigProvider(new Config()); @@ -463,10 +453,6 @@ public void GoDaddyCAPlugin_Reissue_ReturnSuccess(string productID) }; plugin.Initialize(configProvider, certificateDataReader); - // CSR - string subject = "CN=Test Subject"; - string csrString = GenerateCSR(subject); - Dictionary sans = new(); EnrollmentProductInfo productInfo = new EnrollmentProductInfo @@ -493,7 +479,7 @@ public void GoDaddyCAPlugin_Reissue_ReturnSuccess(string productID) { EnrollmentConfigConstants.JobTitle, "Software Engineer" }, { EnrollmentConfigConstants.RegistrationAgent, "Agent" }, { EnrollmentConfigConstants.RegistrationNumber, "REG-12345" }, - { "PriorCertSN", fakeCertificate.SerialNumber } + { "PriorCertSN", FakeReissueCertificate.SerialNumber } } }; @@ -503,12 +489,12 @@ public void GoDaddyCAPlugin_Reissue_ReturnSuccess(string productID) EnrollmentType type = EnrollmentType.Renew; // Act - EnrollmentResult result = plugin.Enroll(csrString, subject, sans, productInfo, format, type).Result; + EnrollmentResult result = await plugin.Enroll(TestCsr, TestSubject, sans, productInfo, format, type); // Assert - Assert.Equal(result.Status, (int)EndEntityStatus.GENERATED); - Assert.Equal(result.StatusMessage, $"Certificate with ID {fakeCaRequestId} has been reissued"); - Assert.Equal(result.CARequestID, fakeCaRequestId); + Assert.Equal((int)EndEntityStatus.GENERATED, result.Status); + Assert.Equal($"Certificate with ID {fakeCaRequestId} has been reissued", result.StatusMessage); + Assert.Equal(fakeCaRequestId, result.CARequestID); } [IntegrationTestingFact] diff --git a/GoDaddy.Tests/GoDaddyClient.cs b/GoDaddy.Tests/GoDaddyClientTests.cs similarity index 93% rename from GoDaddy.Tests/GoDaddyClient.cs rename to GoDaddy.Tests/GoDaddyClientTests.cs index 9b3d8a0..2e9fdd7 100644 --- a/GoDaddy.Tests/GoDaddyClient.cs +++ b/GoDaddy.Tests/GoDaddyClientTests.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. @@ -21,15 +21,15 @@ namespace Keyfactor.Extensions.CAPlugin.GoDaddyTests; -public class ClientTests +public class GoDaddyClientTests { ILogger _logger { get; set;} - public ClientTests() + public GoDaddyClientTests() { ConfigureLogging(); - _logger = LogHandler.GetClassLogger(); + _logger = LogHandler.GetClassLogger(); } [IntegrationTestingFact] diff --git a/GoDaddy.Tests/GoDaddyEnrollment.cs b/GoDaddy.Tests/GoDaddyEnrollmentTests.cs similarity index 90% rename from GoDaddy.Tests/GoDaddyEnrollment.cs rename to GoDaddy.Tests/GoDaddyEnrollmentTests.cs index d845674..483cc1c 100644 --- a/GoDaddy.Tests/GoDaddyEnrollment.cs +++ b/GoDaddy.Tests/GoDaddyEnrollmentTests.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. @@ -25,28 +25,26 @@ namespace Keyfactor.Extensions.CAPlugin.GoDaddyTests; -public class EnrollmentAbstractionTests +public class GoDaddyEnrollmentTests { + private const string TestSubject = "CN=Test Subject"; + private static string TestCsr = GenerateCSR(TestSubject); ILogger _logger { get; set;} - public EnrollmentAbstractionTests() + public GoDaddyEnrollmentTests() { ConfigureLogging(); - _logger = LogHandler.GetClassLogger(); + _logger = LogHandler.GetClassLogger(); } [Fact] - public void EnrollmentStrategyFactory_Enrollment_ValidParameters_ReturnSuccess() + public async Task EnrollmentStrategyFactory_Enrollment_ValidParameters_ReturnSuccess() { - // Arrange - string subject = "CN=Test Subject"; - string csrString = GenerateCSR(subject); - EnrollmentRequest fakeRequest = new EnrollmentRequest { ProductType = CertificateEnrollmentType.DV_SSL, - CSR = csrString, + CSR = TestSubject, EnrollmentType = EnrollmentType.New, RootCAType = RootCAType.STARFIELD_SHA_2, SubjectAlternativeNames = new string[] { "example.com", "www.example.com" }, @@ -86,14 +84,14 @@ public void EnrollmentStrategyFactory_Enrollment_ValidParameters_ReturnSuccess() EnrollmentStrategyFactory factory = new EnrollmentStrategyFactory(fakeCertificateReader, fakeClient); // Act - IEnrollmentStrategy strategy = factory.GetStrategy(fakeRequest).Result; + IEnrollmentStrategy strategy = await factory.GetStrategy(fakeRequest); // Assert Assert.Equal("Enrollment", strategy.StrategyName); } [Fact] - public void EnrollmentStrategyFactory_Renewal_ValidParameters_ReturnSuccess() + public async Task EnrollmentStrategyFactory_Renewal_ValidParameters_ReturnSuccess() { // Arrange DateTime enrollmentNotBefore = DateTime.UtcNow.AddDays(-5); @@ -117,13 +115,10 @@ public void EnrollmentStrategyFactory_Renewal_ValidParameters_ReturnSuccess() }; ICertificateDataReader fakeCertificateReader = new FakeCertificateDataReader(fakeClient); - string subject = "CN=Test Subject"; - string csrString = GenerateCSR(subject); - EnrollmentRequest fakeRequest = new EnrollmentRequest { ProductType = CertificateEnrollmentType.DV_SSL, - CSR = csrString, + CSR = TestCsr, EnrollmentType = EnrollmentType.RenewOrReissue, RootCAType = RootCAType.STARFIELD_SHA_2, SubjectAlternativeNames = new string[] { "example.com", "www.example.com" }, @@ -160,14 +155,14 @@ public void EnrollmentStrategyFactory_Renewal_ValidParameters_ReturnSuccess() EnrollmentStrategyFactory factory = new EnrollmentStrategyFactory(fakeCertificateReader, fakeClient); // Act - IEnrollmentStrategy strategy = factory.GetStrategy(fakeRequest).Result; + IEnrollmentStrategy strategy = await factory.GetStrategy(fakeRequest); // Assert Assert.Equal("Renewal", strategy.StrategyName); } [Fact] - public void EnrollmentStrategyFactory_Reissue_ValidParameters_ReturnSuccess() + public async Task EnrollmentStrategyFactory_Reissue_ValidParameters_ReturnSuccess() { // Arrange DateTime enrollmentNotBefore = DateTime.UtcNow.AddDays(-100); @@ -191,13 +186,10 @@ public void EnrollmentStrategyFactory_Reissue_ValidParameters_ReturnSuccess() }; ICertificateDataReader fakeCertificateReader = new FakeCertificateDataReader(fakeClient); - string subject = "CN=Test Subject"; - string csrString = GenerateCSR(subject); - EnrollmentRequest fakeRequest = new EnrollmentRequest { ProductType = CertificateEnrollmentType.DV_SSL, - CSR = csrString, + CSR = TestCsr, EnrollmentType = EnrollmentType.RenewOrReissue, RootCAType = RootCAType.STARFIELD_SHA_2, SubjectAlternativeNames = new string[] { "example.com", "www.example.com" }, @@ -234,7 +226,7 @@ public void EnrollmentStrategyFactory_Reissue_ValidParameters_ReturnSuccess() EnrollmentStrategyFactory factory = new EnrollmentStrategyFactory(fakeCertificateReader, fakeClient); // Act - IEnrollmentStrategy strategy = factory.GetStrategy(fakeRequest).Result; + IEnrollmentStrategy strategy = await factory.GetStrategy(fakeRequest); // Assert Assert.Equal("Reissue", strategy.StrategyName); @@ -312,10 +304,10 @@ public void EnrollmentBuilder_ValidParameters_ReturnSuccess() Assert.Equal("Agent", request.RegistrationAgent); Assert.Equal("REG-12345", request.RegistrationNumber); - Assert.Equal(request.SubjectAlternativeNames.Length, 3); - Assert.True(request.SubjectAlternativeNames.Contains("example.com")); - Assert.True(request.SubjectAlternativeNames.Contains("www.example.com")); - Assert.True(request.SubjectAlternativeNames.Contains("192.168.1.1")); + Assert.Equal(3, request.SubjectAlternativeNames.Length); + Assert.Contains("example.com", request.SubjectAlternativeNames); + Assert.Contains("www.example.com", request.SubjectAlternativeNames); + Assert.Contains("192.168.1.1", request.SubjectAlternativeNames); } static void ConfigureLogging() diff --git a/GoDaddy/GoDaddyCAPluginConfig.cs b/GoDaddy/GoDaddyCAPluginConfig.cs index 3e67916..d9fad11 100644 --- a/GoDaddy/GoDaddyCAPluginConfig.cs +++ b/GoDaddy/GoDaddyCAPluginConfig.cs @@ -80,7 +80,7 @@ public static Dictionary GetPluginAnnotations() }, [ConfigConstants.BaseUrl] = new PropertyConfigInfo() { - Comments = "The Base URL for the GoDaddy API - Usually either https://api.godaddy.com or https://api.ote-godaddy.com", + Comments = "The Base URL for the GoDaddy API - Usually https://api.godaddy.com", Hidden = false, DefaultValue = "https://api.godaddy.com", Type = "String" diff --git a/README.md b/README.md index 0e49f4f..147ce5a 100644 --- a/README.md +++ b/README.md @@ -73,7 +73,7 @@ The GoDaddy AnyCA Gateway REST plugin is supported by Keyfactor for Keyfactor cu 1. **GoDaddy Account** - To use the GoDaddy AnyCA Gateway REST plugin, a production GoDaddy account must be created and configured fully. To create a new account, follow [GoDaddy's official documentation](https://www.godaddy.com/help/create-a-godaddy-account-16618). Make sure that your [account Profile is configured fully](https://www.godaddy.com/help/update-my-godaddy-account-profile-27250) with at least the following fields: + To use the GoDaddy AnyCA Gateway REST plugin, a GoDaddy account must be created and configured fully. To create a new account, follow [GoDaddy's official documentation](https://www.godaddy.com/help/create-a-godaddy-account-16618). Make sure that your [account Profile is configured fully](https://www.godaddy.com/help/update-my-godaddy-account-profile-27250) with at least the following fields: * Full Name * Address * Organization @@ -88,12 +88,14 @@ The GoDaddy AnyCA Gateway REST plugin is supported by Keyfactor for Keyfactor cu 3. **GoDaddy API Key** - The GoDaddy AnyCA Gateway REST plugin uses the [GoDaddy API](https://developer.godaddy.com/doc/endpoint/certificates) to perform all certificate operations. GoDaddy offers an environment for testing (OTE) and an environment for production use (Production). To configure the plugin, follow the [official GoDaddy documentation](https://developer.godaddy.com/getstarted) to create a [production API key](https://developer.godaddy.com/keys). To configure the CA, you'll need the following parameters handy: + The GoDaddy AnyCA Gateway REST plugin uses the [GoDaddy API](https://developer.godaddy.com/doc/endpoint/certificates) to perform all certificate operations. To configure the plugin, follow the [official GoDaddy documentation](https://developer.godaddy.com/getstarted) to create a [production API key](https://developer.godaddy.com/keys). To configure the CA, you'll need the following parameters handy: - * API URL (https://api.godaddy.com or https://api.ote-godaddy.com) + * API URL (https://api.godaddy.com) * API Key * API Secret +> **🚧 Note**: While GoDaddy offers a separate API environment for testing called the OTE (Operational Test and Evaluation) environment, **OTE API keys cannot be used with this integration**. The OTE environment does not support shopper ID resolution, which is required for API operations in this integration. Production API keys must be used. + 4. **GoDaddy Shopper ID** To synchronize certificates issued by the GoDaddy CA, the GoDaddy AnyCA Gateway REST plugin needs to know your Shopper ID (shown as Customer # on the GoDaddy website). The Shopper ID is a number with a max length of 10 (e.g., 1234567890). To find your Shopper ID, sign into [GoDaddy](https://www.godaddy.com/) and click on your name dropdown on the top right. The Shopper ID is shown as **Customer #** in this dropdown. @@ -148,7 +150,7 @@ The GoDaddy AnyCA Gateway REST plugin is supported by Keyfactor for Keyfactor cu * **ApiKey** - The API Key for the GoDaddy API * **ApiSecret** - The API Secret for the GoDaddy API - * **BaseUrl** - The Base URL for the GoDaddy API - Usually either https://api.godaddy.com or https://api.ote-godaddy.com + * **BaseUrl** - The Base URL for the GoDaddy API - Usually https://api.godaddy.com * **ShopperId** - The Shopper ID of the GoDaddy account to use for the API calls (ex: 1234567890) - has a max length of 10 digits * **Enabled** - Flag to Enable or Disable gateway functionality. Disabling is primarily used to allow creation of the CA prior to configuration information being available. diff --git a/docsource/configuration.md b/docsource/configuration.md index 482f3d3..99263d2 100644 --- a/docsource/configuration.md +++ b/docsource/configuration.md @@ -30,7 +30,7 @@ The GoDaddy AnyCA Gateway REST plugin extends the capabilities of the [GoDaddy C 1. **GoDaddy Account** - To use the GoDaddy AnyCA Gateway REST plugin, a production GoDaddy account must be created and configured fully. To create a new account, follow [GoDaddy's official documentation](https://www.godaddy.com/help/create-a-godaddy-account-16618). Make sure that your [account Profile is configured fully](https://www.godaddy.com/help/update-my-godaddy-account-profile-27250) with at least the following fields: + To use the GoDaddy AnyCA Gateway REST plugin, a GoDaddy account must be created and configured fully. To create a new account, follow [GoDaddy's official documentation](https://www.godaddy.com/help/create-a-godaddy-account-16618). Make sure that your [account Profile is configured fully](https://www.godaddy.com/help/update-my-godaddy-account-profile-27250) with at least the following fields: * Full Name * Address * Organization @@ -45,12 +45,14 @@ The GoDaddy AnyCA Gateway REST plugin extends the capabilities of the [GoDaddy C 3. **GoDaddy API Key** - The GoDaddy AnyCA Gateway REST plugin uses the [GoDaddy API](https://developer.godaddy.com/doc/endpoint/certificates) to perform all certificate operations. GoDaddy offers an environment for testing (OTE) and an environment for production use (Production). To configure the plugin, follow the [official GoDaddy documentation](https://developer.godaddy.com/getstarted) to create a [production API key](https://developer.godaddy.com/keys). To configure the CA, you'll need the following parameters handy: + The GoDaddy AnyCA Gateway REST plugin uses the [GoDaddy API](https://developer.godaddy.com/doc/endpoint/certificates) to perform all certificate operations. To configure the plugin, follow the [official GoDaddy documentation](https://developer.godaddy.com/getstarted) to create a [production API key](https://developer.godaddy.com/keys). To configure the CA, you'll need the following parameters handy: - * API URL (https://api.godaddy.com or https://api.ote-godaddy.com) + * API URL (https://api.godaddy.com) * API Key * API Secret +> **🚧 Note**: While GoDaddy offers a separate API environment for testing called the OTE (Operational Test and Evaluation) environment, **OTE API keys cannot be used with this integration**. The OTE environment does not support shopper ID resolution, which is required for API operations in this integration. Production API keys must be used. + 4. **GoDaddy Shopper ID** To synchronize certificates issued by the GoDaddy CA, the GoDaddy AnyCA Gateway REST plugin needs to know your Shopper ID (shown as Customer # on the GoDaddy website). The Shopper ID is a number with a max length of 10 (e.g., 1234567890). To find your Shopper ID, sign into [GoDaddy](https://www.godaddy.com/) and click on your name dropdown on the top right. The Shopper ID is shown as **Customer #** in this dropdown. diff --git a/integration-manifest.json b/integration-manifest.json index ab84479..f71375a 100644 --- a/integration-manifest.json +++ b/integration-manifest.json @@ -1,5 +1,5 @@ { - "$schema": "https://keyfactor.github.io/integration-manifest-schema.json", + "$schema": "https://keyfactor.github.io/v2/integration-manifest-schema.json", "name": "GoDaddy AnyCA REST plugin", "description": "GoDaddy plugin for the AnyCA Gateway framework", "status": "production", @@ -23,7 +23,7 @@ }, { "name": "BaseUrl", - "description": "The Base URL for the GoDaddy API - Usually either https://api.godaddy.com or https://api.ote-godaddy.com" + "description": "The Base URL for the GoDaddy API - Usually https://api.godaddy.com" }, { "name": "ShopperId",