Skip to content

Commit 00b9683

Browse files
committed
add support for specifying validity hours when requesting a certificate
1 parent c52f069 commit 00b9683

File tree

10 files changed

+428
-102
lines changed

10 files changed

+428
-102
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
2323
hs_err_pid*
2424

25-
25+
*.DS_Store
2626
.idea/
2727
*.iml
2828
target/

src/main/java/com/venafi/vcert/sdk/certificate/CertificateRequest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ public class CertificateRequest {
6969
private boolean fetchPrivateKey;
7070
private String thumbprint;
7171
private Duration timeout;
72+
private int validityHours;
73+
private String issuerHint;
7274

7375
public CertificateRequest() {
7476
this.dnsNames = emptyList();

src/main/java/com/venafi/vcert/sdk/connectors/cloud/CloudConnector.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,9 +216,21 @@ public String requestCertificate(CertificateRequest request, ZoneConfiguration z
216216
if (user == null || user.company() == null) {
217217
throw new VCertException("Must be authenticated to request a certificate");
218218
}
219+
220+
CertificateRequestsPayload payload = new CertificateRequestsPayload()
221+
.zoneId(zoneConfiguration.zoneId()).csr(new String(request.csr()));
222+
223+
//support for validity hours begins
224+
if( request.validityHours() > 0 ) {
225+
226+
String validityHours = "PT" + request.validityHours() + "H";
227+
payload.validityPeriod(validityHours);
228+
229+
}
230+
//support for validity hours ends
231+
219232
CertificateRequestsResponse response =
220-
cloud.certificateRequest(auth.apiKey(), new CertificateRequestsPayload()
221-
.zoneId(zoneConfiguration.zoneId()).csr(new String(request.csr())));
233+
cloud.certificateRequest( auth.apiKey(), payload );
222234

223235
String requestId = response.certificateRequests().get(0).id();
224236
request.pickupId(requestId);
@@ -480,6 +492,7 @@ static class CertificateRequestsPayload {
480492
private String zoneId;
481493
private String existingManagedCertificateId;
482494
private boolean reuseCSR;
495+
private String validityPeriod;
483496
}
484497

485498
@Data

src/main/java/com/venafi/vcert/sdk/connectors/tpp/AbstractTppConnector.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ protected static class SANItem {
149149

150150
@Data
151151
@AllArgsConstructor
152-
protected static class NameValuePair<K, V> {
152+
public static class NameValuePair<K, V> {
153153
private K name;
154154
private V value;
155155
}

src/main/java/com/venafi/vcert/sdk/connectors/tpp/TppConnector.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import static java.util.stream.Collectors.toList;
77
import static org.apache.commons.lang3.StringUtils.isBlank;
88
import static org.apache.commons.lang3.StringUtils.isNotBlank;
9+
910
import java.net.InetAddress;
1011
import java.text.MessageFormat;
1112
import java.time.Instant;
@@ -20,9 +21,8 @@
2021
import java.util.Objects;
2122
import java.util.Optional;
2223
import java.util.concurrent.TimeUnit;
24+
2325
import com.google.common.annotations.VisibleForTesting;
24-
import feign.Response;
25-
import lombok.Getter;
2626
import com.venafi.vcert.sdk.VCertException;
2727
import com.venafi.vcert.sdk.certificate.CertificateRequest;
2828
import com.venafi.vcert.sdk.certificate.ChainOption;
@@ -41,6 +41,10 @@
4141
import com.venafi.vcert.sdk.endpoint.Authentication;
4242
import com.venafi.vcert.sdk.endpoint.ConnectorType;
4343
import com.venafi.vcert.sdk.utils.Is;
44+
import com.venafi.vcert.sdk.utils.VCertUtils;
45+
46+
import feign.Response;
47+
import lombok.Getter;
4448

4549

4650
public class TppConnector extends AbstractTppConnector implements Connector {
@@ -232,6 +236,12 @@ private CertificateRequestsPayload prepareRequest(CertificateRequest request, St
232236
break;
233237
}
234238
}
239+
240+
241+
//support for validity hours begins
242+
VCertUtils.addExpirationDateAttribute(request, payload);
243+
//support for validity hours ends
244+
235245
return payload;
236246
}
237247

src/main/java/com/venafi/vcert/sdk/connectors/tpp/TppTokenConnector.java

Lines changed: 42 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,53 @@
11
package com.venafi.vcert.sdk.connectors.tpp;
22

3+
import static java.lang.String.format;
4+
import static java.time.Duration.ZERO;
5+
import static java.util.Objects.isNull;
6+
import static java.util.stream.Collectors.toList;
7+
import static org.apache.commons.lang3.StringUtils.isBlank;
8+
import static org.apache.commons.lang3.StringUtils.isNotBlank;
9+
10+
import java.net.InetAddress;
11+
import java.text.MessageFormat;
12+
import java.time.Instant;
13+
import java.util.ArrayList;
14+
import java.util.Base64;
15+
import java.util.Collection;
16+
import java.util.Collections;
17+
import java.util.HashMap;
18+
import java.util.List;
19+
import java.util.Map;
20+
import java.util.Objects;
21+
import java.util.Optional;
22+
import java.util.concurrent.TimeUnit;
23+
324
import com.google.common.annotations.VisibleForTesting;
425
import com.venafi.vcert.sdk.VCertException;
5-
import com.venafi.vcert.sdk.certificate.*;
6-
import com.venafi.vcert.sdk.connectors.*;
26+
import com.venafi.vcert.sdk.certificate.CertificateRequest;
27+
import com.venafi.vcert.sdk.certificate.ChainOption;
28+
import com.venafi.vcert.sdk.certificate.CsrOriginOption;
29+
import com.venafi.vcert.sdk.certificate.ImportRequest;
30+
import com.venafi.vcert.sdk.certificate.ImportResponse;
31+
import com.venafi.vcert.sdk.certificate.KeyType;
32+
import com.venafi.vcert.sdk.certificate.PEMCollection;
33+
import com.venafi.vcert.sdk.certificate.PublicKeyAlgorithm;
34+
import com.venafi.vcert.sdk.certificate.RenewalRequest;
35+
import com.venafi.vcert.sdk.certificate.RevocationRequest;
36+
import com.venafi.vcert.sdk.connectors.Policy;
37+
import com.venafi.vcert.sdk.connectors.ServerPolicy;
38+
import com.venafi.vcert.sdk.connectors.TokenConnector;
39+
import com.venafi.vcert.sdk.connectors.ZoneConfiguration;
740
import com.venafi.vcert.sdk.endpoint.Authentication;
841
import com.venafi.vcert.sdk.endpoint.ConnectorType;
942
import com.venafi.vcert.sdk.utils.Is;
43+
import com.venafi.vcert.sdk.utils.VCertUtils;
44+
1045
import feign.FeignException;
1146
import feign.FeignException.BadRequest;
1247
import feign.FeignException.Unauthorized;
1348
import feign.Response;
1449
import lombok.Setter;
1550

16-
import java.net.InetAddress;
17-
import java.text.MessageFormat;
18-
import java.time.Instant;
19-
import java.util.*;
20-
import java.util.concurrent.TimeUnit;
21-
22-
import static java.lang.String.format;
23-
import static java.time.Duration.ZERO;
24-
import static java.util.Objects.isNull;
25-
import static java.util.stream.Collectors.toList;
26-
import static org.apache.commons.lang3.StringUtils.isBlank;
27-
import static org.apache.commons.lang3.StringUtils.isNotBlank;
28-
2951
public class TppTokenConnector extends AbstractTppConnector implements TokenConnector {
3052

3153
public TppTokenConnector(Tpp tpp){ super(tpp); }
@@ -285,6 +307,11 @@ private CertificateRequestsPayload prepareRequest(CertificateRequest request, St
285307
break;
286308
}
287309
}
310+
311+
//support for validity hours begins
312+
VCertUtils.addExpirationDateAttribute(request, payload);
313+
//support for validity hours ends
314+
288315
return payload;
289316
}
290317

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package com.venafi.vcert.sdk.utils;
2+
3+
import java.time.Instant;
4+
import java.time.LocalDateTime;
5+
import java.time.ZoneOffset;
6+
import java.time.format.DateTimeFormatter;
7+
8+
import com.venafi.vcert.sdk.certificate.CertificateRequest;
9+
import com.venafi.vcert.sdk.connectors.tpp.AbstractTppConnector.CertificateRequestsPayload;
10+
import com.venafi.vcert.sdk.connectors.tpp.AbstractTppConnector.NameValuePair;
11+
12+
public class VCertUtils {
13+
14+
public static void addExpirationDateAttribute( CertificateRequest request, CertificateRequestsPayload payload ) {
15+
16+
if ( request.validityHours() > 0 ) {
17+
18+
Instant now = Instant.now();
19+
LocalDateTime utcTime = LocalDateTime.ofInstant(now, ZoneOffset.UTC);
20+
21+
int validityDays = request.validityHours() / 24;
22+
23+
if ( request.validityHours() % 24 > 0 ) {
24+
25+
validityDays = validityDays + 1;
26+
27+
}
28+
29+
utcTime = utcTime.plusDays( validityDays );
30+
String expirationDate = DateTimeFormatter.ofPattern( "yyyy-MM-dd HH:mm:ss" ).format( utcTime );
31+
32+
// determine issuer hint.
33+
34+
String issuerHint = "";
35+
String expirationDateAttribute = "";
36+
37+
if ( request.issuerHint() != null) {
38+
39+
issuerHint = String.valueOf( request.issuerHint().charAt(0) );
40+
issuerHint = issuerHint.toUpperCase();
41+
42+
}
43+
44+
switch ( issuerHint ) {
45+
46+
case "M":
47+
expirationDateAttribute = "Microsoft CA:Specific End Date";
48+
break;
49+
50+
case "D":
51+
expirationDateAttribute = "DigiCert CA:Specific End Date";
52+
break;
53+
54+
case "E":
55+
expirationDateAttribute = "EntrustNET CA:Specific End Date";
56+
break;
57+
58+
default:
59+
expirationDateAttribute = "Specific End Date";
60+
break;
61+
}
62+
63+
payload.caSpecificAttributes()
64+
.add( new NameValuePair<String, String>(expirationDateAttribute, expirationDate) );
65+
}
66+
67+
}
68+
69+
public static int getValidDays( int validHours ) {
70+
71+
int validDays = validHours / 24;
72+
73+
if ( validHours % 24 > 0 ) {
74+
75+
validDays = validDays + 1;
76+
77+
}
78+
79+
return validDays;
80+
}
81+
82+
}

0 commit comments

Comments
 (0)