diff --git a/nameshield-caplugin/Models/Certificate.cs b/nameshield-caplugin/Models/Certificate.cs index fe8b22b..7564225 100644 --- a/nameshield-caplugin/Models/Certificate.cs +++ b/nameshield-caplugin/Models/Certificate.cs @@ -44,6 +44,9 @@ public class Certificate [JsonPropertyName("attributes")] [JsonProperty("attributes")] public CertificateAttributes Attributes { get; set; } + [JsonPropertyName("relationships")] + [JsonProperty("relationships")] + public CertificateRelationships Relationships { get; set; } } public class CertificateAttributes @@ -60,4 +63,18 @@ public class CertificateAttributes [JsonProperty("pem")] public string Pem { get; set; } } + + public class CertificateRelationships + { + [JsonPropertyName("current-order")] + [JsonProperty("current-order")] + public CertOrderRelationship Order { get; set; } + } + + public class CertOrderRelationship + { + [JsonPropertyName("data")] + [JsonProperty("data")] + public RelationshipData Data { get; set; } + } } diff --git a/nameshield-caplugin/NameshieldCAPlugin.cs b/nameshield-caplugin/NameshieldCAPlugin.cs index cd7714b..642d8ec 100644 --- a/nameshield-caplugin/NameshieldCAPlugin.cs +++ b/nameshield-caplugin/NameshieldCAPlugin.cs @@ -135,11 +135,12 @@ public async Task Enroll(string csr, string subject, Dictionar } _logger.LogTrace($"Certificate enrolled successfully"); - var cert = GetSingleRecord(response.Order.Relationships.Certificate.Data.id).Result; - + var reqId = $"{response.Order.Id}-{response.Order.Relationships.Certificate.Data.id}"; + var cert = GetSingleRecord(reqId).Result; + return new EnrollmentResult { - CARequestID = cert.CARequestID, + CARequestID = reqId, Certificate = cert.Certificate, Status = cert.Status, StatusMessage = $"Successfully enrolled for certificate {subject}" @@ -191,11 +192,17 @@ public List GetProductIds() public async Task GetSingleRecord(string caRequestID) { NameshieldClient client = NameshieldClient.InitializeClient(_config); + var idParts = caRequestID.Split('-').ToList(); + if (idParts.Count == 1) + { + _logger.LogWarning($"Order {caRequestID} is still awaiting delivery."); + throw new Exception($"Unable to retrieve certificate for order {caRequestID} as it is still awaiting delivery. The certificate will be picked up by a future sync once it is issued."); + } + string certId = idParts[1]; + var cert = Task.Run(async () => await client.GetCertificate(certId)).Result; + var certProduct = Task.Run(async () => await client.GetCertificateProduct(certId)).Result; - var cert = Task.Run(async () => await client.GetCertificate(caRequestID)).Result; - var certProduct = Task.Run(async () => await client.GetCertificateProduct(caRequestID)).Result; - - int status = ConvertToKeyfactorStatus(cert.Certificate.Attributes.Status, caRequestID); + int status = ConvertToKeyfactorStatus(cert.Certificate.Attributes.Status, certId); return new AnyCAPluginCertificate() { @@ -271,11 +278,13 @@ public async Task Synchronize(BlockingCollection blockin foreach (var cert in certs.Certificates) { + var certObj = Task.Run(async () => await client.GetCertificate(cert.Id)).Result; var certProduct = Task.Run(async () => await client.GetCertificateProduct(cert.Id)).Result; int status = ConvertToKeyfactorStatus(cert.Attributes.Status, cert.Id); var newCert = new AnyCAPluginCertificate() { - CARequestID = cert.Id, + CARequestID = $"{certObj.Certificate.Relationships.Order.Data.id}-{cert.Id}", + OldCARequestID = certObj.Certificate.Relationships.Order.Data.id, ProductID = certProduct.CertificateProduct.Attributes.Name, Status = status, Certificate = cert.Attributes.Pem, @@ -336,7 +345,7 @@ private static string ValidateConfigurationKey(Dictionary connec return string.Empty; } - private static int ConvertToKeyfactorStatus(string status, string sslId) + private static int ConvertToKeyfactorStatus(string status, string certId) { switch (status.ToUpper()) { @@ -353,7 +362,7 @@ private static int ConvertToKeyfactorStatus(string status, string sslId) return (int)EndEntityStatus.REVOKED; default: - throw new Exception($"Request ID {sslId} has unknown status {status}"); + throw new Exception($"Request ID {certId} has unknown status {status}"); } } diff --git a/nameshield-caplugin/nameshield-caplugin.csproj b/nameshield-caplugin/nameshield-caplugin.csproj index 054f6a7..6ef77c8 100644 --- a/nameshield-caplugin/nameshield-caplugin.csproj +++ b/nameshield-caplugin/nameshield-caplugin.csproj @@ -17,7 +17,7 @@ - +