Skip to content

Commit 0e06724

Browse files
authored
Reconcole Release 1.0 to main (#12)
* Update CreateTemplate.ps1 * Fix Meta Data Sync Issue * Fixed Sync Issue that Impacts all clients * Sync Troubleshooting * Simplified Syncing process * New Templates Added * Update SampleConfig.json * Jsonupdates (#11) * Template Install Updates for New Templates
1 parent e97499c commit 0e06724

16 files changed

+796
-184
lines changed

.github/workflows/keyfactor-starter-workflow.yml

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,26 @@ jobs:
55
call-create-github-release-workflow:
66
uses: Keyfactor/actions/.github/workflows/github-release.yml@main
77

8+
get-manifest-properties:
9+
runs-on: windows-latest
10+
outputs:
11+
update_catalog: ${{ steps.read-json.outputs.prop }}
12+
steps:
13+
- uses: actions/checkout@v3
14+
- name: Read json
15+
id: read-json
16+
shell: pwsh
17+
run: |
18+
$json = Get-Content integration-manifest.json | ConvertFrom-Json
19+
echo "::set-output name=prop::$(echo $json.update_catalog)"
20+
821
call-dotnet-build-and-release-workflow:
922
needs: [call-create-github-release-workflow]
1023
uses: Keyfactor/actions/.github/workflows/dotnet-build-and-release.yml@main
1124
with:
1225
release_version: ${{ needs.call-create-github-release-workflow.outputs.release_version }}
1326
release_url: ${{ needs.call-create-github-release-workflow.outputs.release_url }}
14-
release_dir: CscGlobalCaProxy/bin/Release # TODO: set build output directory to upload as a release, relative to checkout workspace
27+
release_dir: CscGlobalCaProxy/bin/Release
1528
secrets:
1629
token: ${{ secrets.PRIVATE_PACKAGE_ACCESS }}
1730

@@ -22,7 +35,8 @@ jobs:
2235
token: ${{ secrets.APPROVE_README_PUSH }}
2336

2437
call-update-catalog-workflow:
25-
if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
38+
needs: get-manifest-properties
39+
if: needs.get-manifest-properties.outputs.update_catalog == 'True' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch')
2640
uses: Keyfactor/actions/.github/workflows/update-catalog.yml@main
2741
secrets:
2842
token: ${{ secrets.SDK_SYNC_PAT }}

CHANGELOG.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,14 @@
1+
v1.0.10
2+
- Sync Issue where Sync only works after service restart fixed
3+
- Sync Fix when errors occur in the CSC Api so next sync works
4+
- Support for CSC TrustedSecure Domain Validated SSL (new CSC Template)
5+
- Support for CSC TrustedSecure Domain Validated Wildcard SSL (new CSC Template)
6+
- Support for CSC TrustedSecure Domain Validated UC Certificate (new CSC Template)
7+
- Install support for new templates. Setup only no code changed in Gateway.
8+
9+
v1.0.9
110
- Updated Readme to go from Powershell based install to Manual Install With More Detailed Instructions
211
- Removed unneeded config items
12+
- Fixed Meta Data Sync Issue
13+
- For Patch Installation for V1.0.9, see bottom of Readme File
14+

CscGlobalCaProxy/Client/CscGlobalClient.cs

Lines changed: 15 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
11
using System;
2-
using System.Collections.Concurrent;
32
using System.Net;
43
using System.Net.Http;
54
using System.Net.Http.Headers;
65
using System.Text;
7-
using System.Threading;
86
using System.Threading.Tasks;
97
using CAProxy.AnyGateway.Interfaces;
108
using CSS.Common.Logging;
119
using Keyfactor.AnyGateway.CscGlobal.Client.Models;
12-
using Keyfactor.AnyGateway.CscGlobal.Exceptions;
1310
using Keyfactor.AnyGateway.CscGlobal.Interfaces;
1411
using Newtonsoft.Json;
1512

@@ -30,7 +27,6 @@ public CscGlobalClient(ICAConnectorConfigProvider config)
3027

3128
private Uri BaseUrl { get; }
3229
private HttpClient RestClient { get; }
33-
private int PageSize { get; } = 100;
3430
private string ApiKey { get; }
3531
private string Authorization { get; }
3632

@@ -41,7 +37,7 @@ public async Task<RegistrationResponse> SubmitRegistrationAsync(
4137
JsonConvert.SerializeObject(registerRequest), Encoding.ASCII, "application/json")))
4238
{
4339
Logger.Trace(JsonConvert.SerializeObject(registerRequest));
44-
var settings = new JsonSerializerSettings {NullValueHandling = NullValueHandling.Ignore};
40+
var settings = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore };
4541
if (resp.StatusCode == HttpStatusCode.BadRequest) //Csc Sends Errors back in 400 Json Response
4642
{
4743
var errorResponse =
@@ -68,7 +64,7 @@ public async Task<RenewalResponse> SubmitRenewalAsync(
6864
{
6965
Logger.Trace(JsonConvert.SerializeObject(renewalRequest));
7066

71-
var settings = new JsonSerializerSettings {NullValueHandling = NullValueHandling.Ignore};
67+
var settings = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore };
7268
if (resp.StatusCode == HttpStatusCode.BadRequest) //Csc Sends Errors back in 400 Json Response
7369
{
7470
var errorResponse =
@@ -94,7 +90,7 @@ public async Task<ReissueResponse> SubmitReissueAsync(
9490
{
9591
Logger.Trace(JsonConvert.SerializeObject(reissueRequest));
9692

97-
var settings = new JsonSerializerSettings {NullValueHandling = NullValueHandling.Ignore};
93+
var settings = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore };
9894
if (resp.StatusCode == HttpStatusCode.BadRequest) //Csc Sends Errors back in 400 Json Response
9995
{
10096
var errorResponse =
@@ -127,7 +123,7 @@ public async Task<RevokeResponse> SubmitRevokeCertificateAsync(string uuId)
127123
{
128124
using (var resp = await RestClient.PutAsync($"/dbs/api/v2/tls/revoke/{uuId}", new StringContent("")))
129125
{
130-
var settings = new JsonSerializerSettings {NullValueHandling = NullValueHandling.Ignore};
126+
var settings = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore };
131127
if (resp.StatusCode == HttpStatusCode.BadRequest) //Csc Sends Errors back in 400 Json Response
132128
{
133129
var errorResponse =
@@ -145,92 +141,27 @@ public async Task<RevokeResponse> SubmitRevokeCertificateAsync(string uuId)
145141
}
146142
}
147143

148-
public async Task SubmitCertificateListRequestAsync(BlockingCollection<ICertificateResponse> bc,
149-
CancellationToken ct)
144+
public async Task<CertificateListResponse> SubmitCertificateListRequestAsync()
150145
{
151146
Logger.MethodEntry(ILogExtensions.MethodLogLevel.Debug);
152-
try
153-
{
154-
var itemsProcessed = 0;
155-
var isComplete = false;
156-
var retryCount = 0;
157-
do
158-
{
159-
var batchItemsProcessed = 0;
160-
using (var resp = await RestClient.GetAsync("/dbs/api/v2/tls/certificate?filter=status=in=(ACTIVE,REVOKED)", ct))
161-
{
162-
if (!resp.IsSuccessStatusCode)
163-
{
164-
var responseMessage = resp.Content.ReadAsStringAsync().Result;
165-
Logger.Error(
166-
$"Failed Request to Keyfactor. Retrying request. Status Code {resp.StatusCode} | Message: {responseMessage}");
167-
retryCount++;
168-
if (retryCount > 5)
169-
throw new RetryCountExceededException(
170-
$"5 consecutive failures to {resp.RequestMessage.RequestUri}");
171-
172-
continue;
173-
}
174-
175-
var stringResponse = await resp.Content.ReadAsStringAsync();
176-
177-
var batchResponse =
178-
JsonConvert.DeserializeObject<CertificateListResponse>(stringResponse);
179-
180-
var batchCount = batchResponse.Results.Count;
181-
182-
Logger.Trace($"Processing {batchCount} items in batch");
183-
do
184-
{
185-
var r = batchResponse.Results[batchItemsProcessed];
186-
if (bc.TryAdd(r, 10, ct))
187-
{
188-
Logger.Trace($"Added Template ID {r.Uuid} to Queue for processing");
189-
batchItemsProcessed++;
190-
itemsProcessed++;
191-
Logger.Trace($"Processed {batchItemsProcessed} of {batchCount}");
192-
Logger.Trace($"Total Items Processed: {itemsProcessed}");
193-
}
194-
else
195-
{
196-
Logger.Trace($"Adding {r} blocked. Retry");
197-
}
198-
} while (batchItemsProcessed < batchCount); //batch loop
199-
}
200-
201-
//assume that if we process less records than requested that we have reached the end of the certificate list
202-
if (batchItemsProcessed < PageSize)
203-
isComplete = true;
204-
} while (!isComplete); //page loop
205-
206-
bc.CompleteAdding();
207-
}
208-
catch (OperationCanceledException cancelEx)
209-
{
210-
Logger.Warn($"Synchronize method was cancelled. Message: {cancelEx.Message}");
211-
bc.CompleteAdding();
212-
Logger.MethodExit(ILogExtensions.MethodLogLevel.Debug);
213-
// ReSharper disable once PossibleIntendedRethrow
214-
throw cancelEx;
215-
}
216-
catch (RetryCountExceededException retryEx)
217-
{
218-
Logger.Error($"Retries Failed: {retryEx.Message}");
219-
Logger.MethodExit(ILogExtensions.MethodLogLevel.Debug);
220-
}
221-
catch (HttpRequestException ex)
147+
var resp = RestClient.GetAsync("/dbs/api/v2/tls/certificate?filter=status=in=(ACTIVE,REVOKED)").Result;
148+
149+
if (!resp.IsSuccessStatusCode)
222150
{
223-
Logger.Error($"HttpRequest Failed: {ex.Message}");
224-
Logger.MethodExit(ILogExtensions.MethodLogLevel.Debug);
151+
var responseMessage = resp.Content.ReadAsStringAsync().Result;
152+
Logger.Error(
153+
$"Failed Request to Keyfactor. Retrying request. Status Code {resp.StatusCode} | Message: {responseMessage}");
225154
}
226155

227-
Logger.MethodExit(ILogExtensions.MethodLogLevel.Debug);
156+
var certificateListResponse =
157+
JsonConvert.DeserializeObject<CertificateListResponse>(await resp.Content.ReadAsStringAsync());
158+
return certificateListResponse;
228159
}
229160

230161
private HttpClient ConfigureRestClient()
231162
{
232163
var clientHandler = new WebRequestHandler();
233-
var returnClient = new HttpClient(clientHandler, true) {BaseAddress = BaseUrl};
164+
var returnClient = new HttpClient(clientHandler, true) { BaseAddress = BaseUrl };
234165
returnClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
235166
returnClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + Authorization);
236167
returnClient.DefaultRequestHeaders.Add("apikey", ApiKey);

CscGlobalCaProxy/CscGlobalCaProxy.cs

Lines changed: 38 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -34,25 +34,23 @@ public CscGlobalCaProxy()
3434
public override int Revoke(string caRequestId, string hexSerialNumber, uint revocationReason)
3535
{
3636

37-
Logger.Trace($"Staring Revoke Method");
38-
var revokeResponse =
39-
Task.Run(async () =>
40-
await CscGlobalClient.SubmitRevokeCertificateAsync(caRequestId.Substring(0,36)))
41-
.Result; //todo fix to use pipe delimiter
37+
Logger.Trace($"Staring Revoke Method");
38+
var revokeResponse =
39+
Task.Run(async () =>
40+
await CscGlobalClient.SubmitRevokeCertificateAsync(caRequestId.Substring(0, 36)))
41+
.Result; //todo fix to use pipe delimiter
4242

43-
Logger.Trace($"Revoke Response JSON: {JsonConvert.SerializeObject(revokeResponse)}");
44-
Logger.MethodExit(ILogExtensions.MethodLogLevel.Debug);
45-
46-
var revokeResult=_requestManager.GetRevokeResult(revokeResponse);
43+
Logger.Trace($"Revoke Response JSON: {JsonConvert.SerializeObject(revokeResponse)}");
44+
Logger.MethodExit(ILogExtensions.MethodLogLevel.Debug);
4745

48-
if(revokeResult== Convert.ToInt32(PKIConstants.Microsoft.RequestDisposition.FAILED))
49-
{
50-
return -1;
51-
}
52-
else
53-
{
54-
return revokeResult;
55-
}
46+
var revokeResult = _requestManager.GetRevokeResult(revokeResponse);
47+
48+
if (revokeResult == Convert.ToInt32(PKIConstants.Microsoft.RequestDisposition.FAILED))
49+
{
50+
return -1;
51+
}
52+
53+
return revokeResult;
5654

5755
}
5856

@@ -73,19 +71,14 @@ public override void Synchronize(ICertificateDataReader certificateDataReader,
7371
Logger.MethodEntry(ILogExtensions.MethodLogLevel.Debug);
7472
try
7573
{
76-
var certs = new BlockingCollection<ICertificateResponse>(100);
77-
CscGlobalClient.SubmitCertificateListRequestAsync(certs, cancelToken);
78-
79-
foreach (var currentResponseItem in certs.GetConsumingEnumerable(cancelToken))
74+
if (certificateAuthoritySyncInfo.DoFullSync)
8075
{
81-
if (cancelToken.IsCancellationRequested)
82-
{
83-
Logger.Error("Synchronize was canceled.");
84-
break;
85-
}
76+
var certs = Task.Run(async () => await CscGlobalClient.SubmitCertificateListRequestAsync()).Result;
8677

87-
try
78+
foreach (var currentResponseItem in certs.Results)
8879
{
80+
81+
cancelToken.ThrowIfCancellationRequested();
8982
Logger.Trace($"Took Certificate ID {currentResponseItem?.Uuid} from Queue");
9083
var certStatus = _requestManager.MapReturnStatus(currentResponseItem?.Status);
9184

@@ -105,46 +98,37 @@ public override void Synchronize(ICertificateDataReader certificateDataReader,
10598
{
10699
var certData = fileContent.Replace("\r\n", string.Empty);
107100
var splitCerts =
108-
certData.Split(new[] {"-----END CERTIFICATE-----", "-----BEGIN CERTIFICATE-----"},
101+
certData.Split(new[] { "-----END CERTIFICATE-----", "-----BEGIN CERTIFICATE-----" },
109102
StringSplitOptions.RemoveEmptyEntries);
110103
foreach (var cert in splitCerts)
111104
if (!cert.Contains(".crt"))
112105
{
113106
Logger.Trace($"Split Cert Value: {cert}");
114107

115108
var currentCert = new X509Certificate2(Encoding.ASCII.GetBytes(cert));
116-
if (!currentCert.Subject.Contains("AAA Certificate Services") &&
117-
!currentCert.Subject.Contains("USERTrust RSA Certification Authority") &&
118-
!currentCert.Subject.Contains("Trusted Secure Certificate Authority 5") &&
119-
!currentCert.Subject.Contains("AddTrust External CA Root") &&
120-
!currentCert.Subject.Contains("Trusted Secure Certificate Authority DV"))
121-
blockingBuffer.Add(new CAConnectorCertificate
122-
{
123-
CARequestID =$"{currentResponseItem?.Uuid}-{currentCert.SerialNumber}",
124-
Certificate = cert,
125-
SubmissionDate = currentResponseItem?.OrderDate == null
126-
? Convert.ToDateTime(currentCert.NotBefore)
127-
: Convert.ToDateTime(currentResponseItem.OrderDate),
128-
Status = certStatus,
129-
ProductID = productId
130-
}, cancelToken);
109+
blockingBuffer.Add(new CAConnectorCertificate
110+
{
111+
CARequestID = $"{currentResponseItem?.Uuid}",
112+
Certificate = cert,
113+
SubmissionDate = currentResponseItem?.OrderDate == null
114+
? Convert.ToDateTime(currentCert.NotBefore)
115+
: Convert.ToDateTime(currentResponseItem.OrderDate),
116+
Status = certStatus,
117+
ProductID = productId
118+
}, cancelToken);
131119
}
132120
}
133121
}
134122
}
135-
catch (OperationCanceledException)
136-
{
137-
Logger.Error("Synchronize was canceled.");
138-
break;
139-
}
123+
blockingBuffer.CompleteAdding();
140124
}
141125
}
142-
catch (AggregateException aggEx)
126+
catch (Exception e)
143127
{
144-
Logger.Error("Csc Global Synchronize Task failed!");
128+
Logger.Error($"Csc Global Synchronize Task failed! {LogHandler.FlattenException(e)}");
145129
Logger.MethodExit(ILogExtensions.MethodLogLevel.Debug);
146-
// ReSharper disable once PossibleIntendedRethrow
147-
throw aggEx;
130+
blockingBuffer.CompleteAdding();
131+
throw;
148132
}
149133

150134
Logger.MethodExit(ILogExtensions.MethodLogLevel.Debug);
@@ -198,7 +182,7 @@ public override EnrollmentResult Enroll(ICertificateDataReader certificateDataRe
198182
case RequestUtilities.EnrollmentType.Renew:
199183
Logger.Trace($"Entering Renew Enrollment");
200184
//One click won't work for this implementation b/c we are missing enrollment params
201-
if (productInfo.ProductParameters.ContainsKey("Applicant Last Name"))
185+
if (productInfo.ProductParameters.ContainsKey("Applicant Last Name"))
202186
{
203187
priorCert = certificateDataReader.GetCertificateRecord(
204188
DataConversion.HexToBytes(productInfo.ProductParameters["PriorCertSN"]));
@@ -251,7 +235,7 @@ public override EnrollmentResult Enroll(ICertificateDataReader certificateDataRe
251235
Logger.MethodExit(ILogExtensions.MethodLogLevel.Debug);
252236
return null;
253237
}
254-
238+
255239

256240
public override CAConnectorCertificate GetSingleRecord(string caRequestId)
257241
{

CscGlobalCaProxy/CscGlobalCaProxy.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,9 @@
8383
<ItemGroup>
8484
<Compile Include="Client\CscGlobalClient.cs" />
8585
<Compile Include="Client\Models\RevokeSuccessResponse.cs" />
86+
<Compile Include="Interfaces\ICscGlobalClient.cs" />
8687
<Compile Include="Interfaces\IRegistrationError.cs" />
8788
<Compile Include="Client\Models\RegistrationError.cs" />
88-
<Compile Include="Interfaces\ICscGlobalClient.cs" />
8989
<Compile Include="Constants.cs" />
9090
<Compile Include="CscGlobalCaProxy.cs" />
9191
<Compile Include="Client\Models\CertificateListResponse.cs" />

CscGlobalCaProxy/Interfaces/ICscGlobalClient.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ Task<ReissueResponse> SubmitReissueAsync(
1818

1919
Task<CertificateResponse> SubmitGetCertificateAsync(string certificateId);
2020

21-
Task SubmitCertificateListRequestAsync(BlockingCollection<ICertificateResponse> bc, CancellationToken ct);
21+
Task<CertificateListResponse> SubmitCertificateListRequestAsync();
2222

2323
Task<RevokeResponse> SubmitRevokeCertificateAsync(string uuId);
2424
}

0 commit comments

Comments
 (0)