10
10
import com .aws .greengrass .clientdevices .auth .api .GetCertificateRequest ;
11
11
import com .aws .greengrass .clientdevices .auth .api .GetCertificateRequestOptions ;
12
12
import com .aws .greengrass .clientdevices .auth .certificate .CertificateExpiryMonitor ;
13
+ import com .aws .greengrass .clientdevices .auth .certificate .CertificateGenerator ;
13
14
import com .aws .greengrass .clientdevices .auth .certificate .CertificateHelper ;
14
15
import com .aws .greengrass .clientdevices .auth .certificate .CertificateStore ;
15
16
import com .aws .greengrass .clientdevices .auth .certificate .CertificatesConfig ;
16
17
import com .aws .greengrass .clientdevices .auth .configuration .CDAConfiguration ;
17
18
import com .aws .greengrass .clientdevices .auth .connectivity .CISShadowMonitor ;
18
19
import com .aws .greengrass .clientdevices .auth .connectivity .ConnectivityInformation ;
19
20
import com .aws .greengrass .clientdevices .auth .exception .CertificateGenerationException ;
21
+ import com .aws .greengrass .clientdevices .auth .helpers .CertificateTestHelpers ;
20
22
import com .aws .greengrass .config .Topics ;
21
23
import com .aws .greengrass .dependency .Context ;
22
24
import com .aws .greengrass .security .SecurityService ;
23
25
import com .aws .greengrass .testcommons .testutilities .GGExtension ;
24
26
import com .aws .greengrass .testcommons .testutilities .TestUtils ;
25
27
import com .aws .greengrass .util .GreengrassServiceClientFactory ;
26
28
import com .aws .greengrass .util .Pair ;
29
+ import org .bouncycastle .operator .OperatorCreationException ;
27
30
import org .junit .jupiter .api .AfterEach ;
28
31
import org .junit .jupiter .api .Assertions ;
29
32
import org .junit .jupiter .api .BeforeEach ;
30
33
import org .junit .jupiter .api .Test ;
31
34
import org .junit .jupiter .api .extension .ExtendWith ;
32
35
import org .junit .jupiter .api .io .TempDir ;
36
+ import org .mockito .ArgumentCaptor ;
33
37
import org .mockito .Mock ;
34
38
import org .mockito .junit .jupiter .MockitoExtension ;
35
39
45
49
import java .security .cert .X509Certificate ;
46
50
import java .time .Clock ;
47
51
import java .time .Instant ;
52
+ import java .util .ArrayList ;
48
53
import java .util .Arrays ;
49
54
import java .util .Date ;
50
55
import java .util .List ;
51
56
import java .util .concurrent .CompletableFuture ;
52
57
import java .util .concurrent .ExecutionException ;
53
58
import java .util .concurrent .TimeUnit ;
54
59
import java .util .concurrent .TimeoutException ;
60
+ import java .util .concurrent .atomic .AtomicReference ;
55
61
import java .util .function .Consumer ;
56
62
import java .util .stream .Stream ;
57
63
63
69
import static org .junit .jupiter .api .Assertions .assertEquals ;
64
70
import static org .junit .jupiter .api .Assertions .assertNotEquals ;
65
71
import static org .mockito .Mockito .reset ;
72
+ import static org .mockito .Mockito .verify ;
66
73
import static org .mockito .Mockito .when ;
67
74
68
75
@ ExtendWith ({MockitoExtension .class , GGExtension .class })
@@ -86,10 +93,13 @@ public class CertificateManagerTest {
86
93
Path tmpPath ;
87
94
88
95
private CertificateManager certificateManager ;
96
+ private CertificateStore certificateStore ;
89
97
90
98
@ BeforeEach
91
99
void beforeEach () throws KeyStoreException {
92
- certificateManager = new CertificateManager (new CertificateStore (tmpPath , new DomainEvents ()),
100
+ certificateStore = new CertificateStore (tmpPath , new DomainEvents ());
101
+
102
+ certificateManager = new CertificateManager (certificateStore ,
93
103
mockConnectivityInformation , mockCertExpiryMonitor , mockShadowMonitor ,
94
104
Clock .systemUTC (), clientFactoryMock , securityServiceMock );
95
105
@@ -237,6 +247,45 @@ void GIVEN_clientCertRequest_WHEN_clientCertificateIsGenerated_THEN_canSuccessfu
237
247
certificateManager .subscribeToCertificateUpdates (certificateRequest );
238
248
}
239
249
250
+ @ Test
251
+ void GIVEN_caChain_WHEN_caChainChanges_THEN_subscribersGetLatestValues () throws NoSuchAlgorithmException ,
252
+ CertificateException , OperatorCreationException , IOException , CertificateGenerationException ,
253
+ KeyStoreException {
254
+ AtomicReference <CertificateUpdateEvent > eventRef = new AtomicReference <>();
255
+
256
+ Pair <CompletableFuture <Void >, Consumer <CertificateUpdateEvent >> asyncCall =
257
+ TestUtils .asyncAssertOnConsumer (eventRef ::set , 1 );
258
+ GetCertificateRequestOptions requestOptions = new GetCertificateRequestOptions ();
259
+ requestOptions .setCertificateType (GetCertificateRequestOptions .CertificateType .CLIENT );
260
+ GetCertificateRequest request =
261
+ new GetCertificateRequest ("com.aws.clients.Plugin" , requestOptions , asyncCall .getRight ());
262
+
263
+ KeyPair caAKeys = CertificateStore .newRSAKeyPair (2048 );
264
+ X509Certificate caA = CertificateTestHelpers .createRootCertificateAuthority ("Root A" , caAKeys );
265
+
266
+ KeyPair caBKeys = CertificateStore .newRSAKeyPair (2048 );
267
+ X509Certificate caB = CertificateTestHelpers .createRootCertificateAuthority ("Root B" , caBKeys );
268
+
269
+
270
+ certificateStore .setCaPrivateKey (caAKeys .getPrivate ());
271
+ certificateStore .setCaCertificateChain (caA );
272
+ certificateManager .subscribeToCertificateUpdates (request );
273
+
274
+ assertEquals (1 , eventRef .get ().getCaCertificates ().length );
275
+ assertEquals (CertificateHelper .toPem (caA ), CertificateHelper .toPem ( eventRef .get ().getCaCertificates ()[0 ]));
276
+
277
+ ArgumentCaptor <CertificateGenerator > generator = ArgumentCaptor .forClass (CertificateGenerator .class );
278
+ verify (mockCertExpiryMonitor ).addToMonitor (generator .capture ());
279
+
280
+ certificateStore .setCaPrivateKey (caBKeys .getPrivate ());
281
+ certificateStore .setCaCertificateChain (caB );
282
+
283
+ // This part below just simulates the expiry monitor triggering expired certificates after the ca had changed
284
+ generator .getValue ().generateCertificate (ArrayList ::new , "testing" );
285
+ assertEquals (1 , eventRef .get ().getCaCertificates ().length );
286
+ assertEquals (CertificateHelper .toPem (caB ), CertificateHelper .toPem (eventRef .get ().getCaCertificates ()[0 ]));
287
+ }
288
+
240
289
@ Test
241
290
void GIVEN_nullRequest_WHEN_subscribeToCertificateUpdates_THEN_throwsNPE () {
242
291
Assertions .assertThrows (NullPointerException .class , () ->
0 commit comments