Skip to content

Commit 53d86a1

Browse files
author
Rujun Chen
authored
Delete forceRefreshTime related content. (Azure#22637)
1 parent 348867c commit 53d86a1

File tree

5 files changed

+27
-72
lines changed

5 files changed

+27
-72
lines changed

sdk/keyvault/azure-security-keyvault-jca/src/main/java/com/azure/security/keyvault/jca/KeyVaultCertificates.java

Lines changed: 13 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,6 @@ public class KeyVaultCertificates implements AzureCertificates {
3939
*/
4040
private Date lastRefreshTime;
4141

42-
/**
43-
* Stores the last force refresh time.
44-
*/
45-
private static volatile Date forceRefreshTime = new Date();
46-
4742
private KeyVaultClient keyVaultClient;
4843

4944
private final long refreshInterval;
@@ -88,13 +83,8 @@ boolean certificatesNeedRefresh() {
8883
if (keyVaultClient == null) {
8984
return false;
9085
}
91-
if (lastRefreshTime == null || forceRefreshTime.after(lastRefreshTime)) {
92-
return true;
93-
}
94-
if (refreshInterval > 0) {
95-
return lastRefreshTime.getTime() + refreshInterval < new Date().getTime();
96-
}
97-
return false;
86+
return refreshInterval > 0
87+
&& (lastRefreshTime == null || lastRefreshTime.getTime() + refreshInterval < new Date().getTime());
9888
}
9989

10090
/**
@@ -132,14 +122,19 @@ public Map<String, Key> getCertificateKeys() {
132122

133123
private void refreshCertificatesIfNeeded() {
134124
if (certificatesNeedRefresh()) { // Avoid acquiring the lock as much as possible.
135-
refreshCertificates();
125+
synchronized (this) {
126+
if (certificatesNeedRefresh()) { // After obtaining the lock, avoid doing too many operations.
127+
refreshCertificates();
128+
}
129+
}
136130
}
137131
}
138132

139-
private synchronized void refreshCertificates() {
140-
if (!certificatesNeedRefresh()) {
141-
return; // After obtaining the lock, avoid doing too many operations.
142-
}
133+
/**
134+
* Refresh certificates. Including certificates, aliases, certificate keys.
135+
*
136+
*/
137+
public synchronized void refreshCertificates() {
143138
// When refreshing certificates, the update of the 3 variables should be an atomic operation.
144139
aliases = keyVaultClient.getAliases();
145140
certificateKeys.clear();
@@ -166,7 +161,7 @@ private synchronized void refreshCertificates() {
166161
* @return certificate' alias if exist.
167162
*/
168163
String refreshAndGetAliasByCertificate(Certificate certificate) {
169-
updateForceRefreshTime();
164+
refreshCertificates();
170165
return getCertificates().entrySet()
171166
.stream()
172167
.filter(entry -> certificate.equals(entry.getValue()))
@@ -190,11 +185,4 @@ public void deleteEntry(String alias) {
190185
certificateKeys.remove(alias);
191186
}
192187

193-
/**
194-
* Overall refresh certificates' info
195-
*/
196-
public static void updateForceRefreshTime() {
197-
forceRefreshTime = new Date();
198-
}
199-
200188
}

sdk/keyvault/azure-security-keyvault-jca/src/main/java/com/azure/security/keyvault/jca/KeyVaultKeyStore.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ public Certificate engineGetCertificate(String alias) {
164164
.orElse(null);
165165

166166
if (refreshCertificatesWhenHaveUnTrustCertificate && certificate == null) {
167-
KeyVaultCertificates.updateForceRefreshTime();
167+
keyVaultCertificates.refreshCertificates();
168168
certificate = keyVaultCertificates.getCertificates().get(alias);
169169
}
170170
return certificate;

sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/KeyVaultCertificatesTest.java

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,12 @@ public class KeyVaultCertificatesTest {
2626

2727
@BeforeEach
2828
public void beforeEach() {
29-
3029
List<String> aliases = new ArrayList<>();
3130
aliases.add("myalias");
3231
when(keyVaultClient.getAliases()).thenReturn(aliases);
3332
when(keyVaultClient.getKey("myalias", null)).thenReturn(key);
3433
when(keyVaultClient.getCertificate("myalias")).thenReturn(certificate);
35-
keyVaultCertificates = new KeyVaultCertificates(0, keyVaultClient);
34+
keyVaultCertificates = new KeyVaultCertificates(60_000, keyVaultClient);
3635
}
3736

3837
@Test
@@ -55,9 +54,8 @@ public void testRefreshAndGetAliasByCertificate() {
5554
Assertions.assertEquals(keyVaultCertificates.refreshAndGetAliasByCertificate(certificate), "myalias");
5655
Assertions.assertEquals(keyVaultCertificates.getCertificates().get("myalias"), certificate);
5756
when(keyVaultClient.getAliases()).thenReturn(null);
58-
// TODO (rujche) Fix this
59-
// Assertions.assertNotEquals(keyVaultCertificates.refreshAndGetAliasByCertificate(certificate), "myalias");
60-
// Assertions.assertNull(keyVaultCertificates.getCertificates().get("myalias"));
57+
Assertions.assertNotEquals(keyVaultCertificates.refreshAndGetAliasByCertificate(certificate), "myalias");
58+
Assertions.assertNull(keyVaultCertificates.getCertificates().get("myalias"));
6159
}
6260

6361
@Test
@@ -67,17 +65,4 @@ public void testDeleteAlias() {
6765
Assertions.assertFalse(keyVaultCertificates.getAliases().contains("myalias"));
6866
}
6967

70-
@Test
71-
public void testCertificatesNeedRefresh() throws InterruptedException {
72-
keyVaultCertificates = new KeyVaultCertificates(1000, keyVaultClient);
73-
Assertions.assertTrue(keyVaultCertificates.certificatesNeedRefresh());
74-
keyVaultCertificates.getAliases();
75-
Assertions.assertFalse(keyVaultCertificates.certificatesNeedRefresh());
76-
KeyVaultCertificates.updateForceRefreshTime();
77-
keyVaultCertificates.getAliases();
78-
Assertions.assertFalse(keyVaultCertificates.certificatesNeedRefresh());
79-
Thread.sleep(2000);
80-
Assertions.assertTrue(keyVaultCertificates.certificatesNeedRefresh());
81-
}
82-
8368
}

sdk/keyvault/azure-security-test-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/test/KeyVaultCertificatesTest.java

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
package com.azure.security.keyvault.jca.test;
55

6-
import com.azure.security.keyvault.jca.KeyVaultCertificates;
76
import org.junit.jupiter.api.BeforeAll;
87
import org.junit.jupiter.api.Test;
98
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
@@ -94,14 +93,4 @@ public void testCertificatesRefreshInterval() throws Exception {
9493
assertNotNull(keyStore.getCertificate(certificateName));
9594
}
9695

97-
@Test
98-
public void testUpdateLastForceRefreshTime() throws Exception {
99-
KeyStore keyStore = PropertyConvertorUtils.getKeyVaultKeyStore();
100-
assertNotNull(keyStore.getCertificate(certificateName));
101-
keyStore.deleteEntry(certificateName);
102-
assertNull(keyStore.getCertificate(certificateName));
103-
Thread.sleep(10);
104-
KeyVaultCertificates.updateForceRefreshTime();
105-
assertNotNull(keyStore.getCertificate(certificateName));
106-
}
10796
}

sdk/spring/azure-spring-boot-starter-keyvault-certificates/README.md

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -281,40 +281,33 @@ spring:
281281
useInsecureTrustManager: true
282282
```
283283

284-
### Refresh certificates when have un trust certificate
284+
### Refresh certificate periodically
285285

286-
When the inbound certificate is not trusted, the KeyVaultKeyStore can fetch
287-
certificates from KeyVault if the following property is configured:
286+
KeyVaultKeyStore can fetch certificates from KeyVault periodically if following property is configured:
288287

289288
```yaml
290289
azure:
291290
keyvault:
292291
jca:
293-
refresh-certificates-when-have-un-trust-certificate: true
292+
certificates-refresh-interval: 1800000
294293
```
295294

296-
Note: If you set refresh-certificates-when-have-un-trust-certificate=true, your server will be vulnerable
297-
to attack, because every untrusted certificate will cause your application to send a re-acquire certificate request.
295+
Its value is 0(ms) by default, and certificate will not automatically refresh when its value <= 0.
298296

299-
### Refresh certificate periodically
297+
### Refresh certificates when have un trust certificate
300298

301-
KeyVaultKeyStore can fetch certificates from KeyVault periodically if following property is configured:
299+
When the inbound certificate is not trusted, the KeyVaultKeyStore can fetch
300+
certificates from KeyVault if the following property is configured:
302301

303302
```yaml
304303
azure:
305304
keyvault:
306305
jca:
307-
certificates-refresh-interval: 1800000
306+
refresh-certificates-when-have-un-trust-certificate: true
308307
```
309308

310-
Its value is 0(ms) by default, and certificate will not automatically refresh when its value <= 0.
311-
312-
### Refresh certificate by java code
313-
314-
You can also manually refresh the certificate by calling this method:
315-
```java
316-
KeyVaultCertificates.refreshCertsInfo();
317-
```
309+
Note: If you set refresh-certificates-when-have-un-trust-certificate=true, your server will be vulnerable
310+
to attack, because every untrusted certificate will cause your application to send a re-acquire certificate request.
318311

319312
### Specific path certificates
320313
AzureKeyVault keystore will load certificates in the specific path:

0 commit comments

Comments
 (0)