org.junit.jupiter
diff --git a/sdk/keyvault/azure-security-keyvault-jca/src/main/java/com/azure/security/keyvault/jca/implementation/signature/KeyVaultKeylessEcSha256Signature.java b/sdk/keyvault/azure-security-keyvault-jca/src/main/java/com/azure/security/keyvault/jca/implementation/signature/KeyVaultKeylessEcSha256Signature.java
index be8bf32deea7..564a66586518 100644
--- a/sdk/keyvault/azure-security-keyvault-jca/src/main/java/com/azure/security/keyvault/jca/implementation/signature/KeyVaultKeylessEcSha256Signature.java
+++ b/sdk/keyvault/azure-security-keyvault-jca/src/main/java/com/azure/security/keyvault/jca/implementation/signature/KeyVaultKeylessEcSha256Signature.java
@@ -9,7 +9,7 @@ public final class KeyVaultKeylessEcSha256Signature extends KeyVaultKeylessEcSig
/**
* Algorithm name used by this implementation.
*/
- public static String ALGORITHM_NAME = "SHA256withECDSA";
+ public static final String ALGORITHM_NAME = "SHA256withECDSA";
@Override
public String getAlgorithmName() {
diff --git a/sdk/keyvault/azure-security-keyvault-jca/src/main/java/com/azure/security/keyvault/jca/implementation/signature/KeyVaultKeylessEcSha384Signature.java b/sdk/keyvault/azure-security-keyvault-jca/src/main/java/com/azure/security/keyvault/jca/implementation/signature/KeyVaultKeylessEcSha384Signature.java
index 9e54533b6dac..81eea1c06d32 100644
--- a/sdk/keyvault/azure-security-keyvault-jca/src/main/java/com/azure/security/keyvault/jca/implementation/signature/KeyVaultKeylessEcSha384Signature.java
+++ b/sdk/keyvault/azure-security-keyvault-jca/src/main/java/com/azure/security/keyvault/jca/implementation/signature/KeyVaultKeylessEcSha384Signature.java
@@ -9,7 +9,7 @@ public final class KeyVaultKeylessEcSha384Signature extends KeyVaultKeylessEcSig
/**
* Algorithm name used by this implementation.
*/
- public static String ALGORITHM_NAME = "SHA384withECDSA";
+ public static final String ALGORITHM_NAME = "SHA384withECDSA";
@Override
public String getAlgorithmName() {
diff --git a/sdk/keyvault/azure-security-keyvault-jca/src/main/java/com/azure/security/keyvault/jca/implementation/signature/KeyVaultKeylessEcSha512Signature.java b/sdk/keyvault/azure-security-keyvault-jca/src/main/java/com/azure/security/keyvault/jca/implementation/signature/KeyVaultKeylessEcSha512Signature.java
index a468501c1e18..4accc59c0b15 100644
--- a/sdk/keyvault/azure-security-keyvault-jca/src/main/java/com/azure/security/keyvault/jca/implementation/signature/KeyVaultKeylessEcSha512Signature.java
+++ b/sdk/keyvault/azure-security-keyvault-jca/src/main/java/com/azure/security/keyvault/jca/implementation/signature/KeyVaultKeylessEcSha512Signature.java
@@ -9,7 +9,7 @@ public final class KeyVaultKeylessEcSha512Signature extends KeyVaultKeylessEcSig
/**
* Algorithm name used by this implementation.
*/
- public static String ALGORITHM_NAME = "SHA512withECDSA";
+ public static final String ALGORITHM_NAME = "SHA512withECDSA";
@Override
public String getAlgorithmName() {
diff --git a/sdk/keyvault/azure-security-keyvault-jca/src/main/java/com/azure/security/keyvault/jca/implementation/signature/KeyVaultKeylessRsa256Signature.java b/sdk/keyvault/azure-security-keyvault-jca/src/main/java/com/azure/security/keyvault/jca/implementation/signature/KeyVaultKeylessRsa256Signature.java
index d73051353419..525be4c4f64a 100644
--- a/sdk/keyvault/azure-security-keyvault-jca/src/main/java/com/azure/security/keyvault/jca/implementation/signature/KeyVaultKeylessRsa256Signature.java
+++ b/sdk/keyvault/azure-security-keyvault-jca/src/main/java/com/azure/security/keyvault/jca/implementation/signature/KeyVaultKeylessRsa256Signature.java
@@ -10,7 +10,7 @@ public class KeyVaultKeylessRsa256Signature extends KeyVaultKeylessRsaSignature
/**
* Algorithm name used by this implementation.
*/
- public static String ALGORITHM_NAME = "SHA256withRSA";
+ public static final String ALGORITHM_NAME = "SHA256withRSA";
@Override
public String getAlgorithmName() {
diff --git a/sdk/keyvault/azure-security-keyvault-jca/src/main/java/com/azure/security/keyvault/jca/implementation/signature/KeyVaultKeylessRsa512Signature.java b/sdk/keyvault/azure-security-keyvault-jca/src/main/java/com/azure/security/keyvault/jca/implementation/signature/KeyVaultKeylessRsa512Signature.java
index 4d153405190a..d145aa323cb0 100644
--- a/sdk/keyvault/azure-security-keyvault-jca/src/main/java/com/azure/security/keyvault/jca/implementation/signature/KeyVaultKeylessRsa512Signature.java
+++ b/sdk/keyvault/azure-security-keyvault-jca/src/main/java/com/azure/security/keyvault/jca/implementation/signature/KeyVaultKeylessRsa512Signature.java
@@ -10,7 +10,7 @@ public class KeyVaultKeylessRsa512Signature extends KeyVaultKeylessRsaSignature
/**
* Algorithm name used by this implementation.
*/
- public static String ALGORITHM_NAME = "SHA512withRSA";
+ public static final String ALGORITHM_NAME = "SHA512withRSA";
@Override
public String getAlgorithmName() {
diff --git a/sdk/keyvault/azure-security-keyvault-jca/src/main/java/com/azure/security/keyvault/jca/implementation/signature/KeyVaultKeylessRsaSsaPssSignature.java b/sdk/keyvault/azure-security-keyvault-jca/src/main/java/com/azure/security/keyvault/jca/implementation/signature/KeyVaultKeylessRsaSsaPssSignature.java
index 0cd86b6bce05..0cff98ef0d35 100644
--- a/sdk/keyvault/azure-security-keyvault-jca/src/main/java/com/azure/security/keyvault/jca/implementation/signature/KeyVaultKeylessRsaSsaPssSignature.java
+++ b/sdk/keyvault/azure-security-keyvault-jca/src/main/java/com/azure/security/keyvault/jca/implementation/signature/KeyVaultKeylessRsaSsaPssSignature.java
@@ -16,7 +16,7 @@ public class KeyVaultKeylessRsaSsaPssSignature extends KeyVaultKeylessRsaSignatu
/**
* Algorithm name used by this implementation.
*/
- public static String ALGORITHM_NAME = "RSASSA-PSS";
+ public static final String ALGORITHM_NAME = "RSASSA-PSS";
@Override
public String getAlgorithmName() {
diff --git a/sdk/keyvault/azure-security-keyvault-jca/src/main/java/com/azure/security/keyvault/jca/implementation/utils/HttpUtil.java b/sdk/keyvault/azure-security-keyvault-jca/src/main/java/com/azure/security/keyvault/jca/implementation/utils/HttpUtil.java
index 8bd2682d2ece..64ff35f07e24 100644
--- a/sdk/keyvault/azure-security-keyvault-jca/src/main/java/com/azure/security/keyvault/jca/implementation/utils/HttpUtil.java
+++ b/sdk/keyvault/azure-security-keyvault-jca/src/main/java/com/azure/security/keyvault/jca/implementation/utils/HttpUtil.java
@@ -128,7 +128,7 @@ private static String createErrorMessage(int status) {
@SuppressWarnings("StringOperationCanBeSimplified")
private static String readResponseBody(HttpURLConnection connection) throws IOException {
InputStream responseBody
- = (connection.getInputStream() != null) ? connection.getInputStream() : connection.getErrorStream();
+ = (connection.getErrorStream() != null) ? connection.getErrorStream() : connection.getInputStream();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[4096];
diff --git a/sdk/keyvault/azure-security-keyvault-jca/src/samples/java/com/azure/security/keyvault/jca/SampleUtils.java b/sdk/keyvault/azure-security-keyvault-jca/src/samples/java/com/azure/security/keyvault/jca/SampleUtils.java
new file mode 100644
index 000000000000..f280959df1ec
--- /dev/null
+++ b/sdk/keyvault/azure-security-keyvault-jca/src/samples/java/com/azure/security/keyvault/jca/SampleUtils.java
@@ -0,0 +1,98 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+package com.azure.security.keyvault.jca;
+
+import javax.net.ssl.KeyManager;
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.TrustManagerFactory;
+import javax.net.ssl.X509TrustManager;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.nio.charset.StandardCharsets;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.UnrecoverableKeyException;
+
+/**
+ * Utility methods for samples.
+ */
+public final class SampleUtils {
+ /**
+ * Loads the {@link TrustManager TrustManagers} for the {@link KeyStore}.
+ *
+ * This wraps {@link X509TrustManager X509TrustManagers} with {@link TrustSelfSignedServerDelegate} to support
+ * self-signed certificates.
+ *
+ * @param keyStore The {@link KeyStore} where {@link TrustManager TrustManagers} will be loaded.
+ * @return The {@link TrustManager TrustManagers} that were loaded.
+ * @throws NoSuchAlgorithmException If the algorithm used when calling
+ * {@link TrustManagerFactory#getInstance(String)} isn't available.
+ * @throws KeyStoreException If calling {@link TrustManagerFactory#init(KeyStore)} fails.
+ */
+ public static TrustManager[] loadTrustMaterial(KeyStore keyStore) throws NoSuchAlgorithmException,
+ KeyStoreException {
+ TrustManagerFactory tmFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
+ tmFactory.init(keyStore);
+ TrustManager[] trustManagers = tmFactory.getTrustManagers();
+ if (trustManagers != null) {
+ for (int i = 0; i < trustManagers.length; i++) {
+ TrustManager trustManager = trustManagers[i];
+ if (trustManager instanceof X509TrustManager) {
+ // Wrap X509TrustManagers with an implementation that trusts self-signed certificates.
+ // This doesn't need to be done and is just an example.
+ trustManagers[i] = new TrustSelfSignedServerDelegate((X509TrustManager) trustManager);
+ }
+ }
+ }
+
+ return trustManagers;
+ }
+
+ /**
+ * Loads the {@link KeyManager KeyManagers} for the {@link KeyStore}.
+ *
+ * @param keyStore The {@link KeyStore} where {@link KeyManager KeyManagers} will be loaded.
+ * @param password The password for recovering {@link KeyManager KeyManagers} in the {@link KeyStore}.
+ * @return The {@link KeyManager KeyManagers} that were loaded.
+ * @throws NoSuchAlgorithmException If the algorithm used when calling {@link KeyManagerFactory#getInstance(String)}
+ * isn't available.
+ * @throws KeyStoreException If calling {@link KeyManagerFactory#init(KeyStore, char[])} fails.
+ * @throws UnrecoverableKeyException If the {@link KeyManager} can't be recovered when calling
+ * {@link KeyManagerFactory#init(KeyStore, char[])}, such as the {@code password is wrong}.
+ */
+ public static KeyManager[] loadKeyMaterial(KeyStore keyStore, char[] password)
+ throws NoSuchAlgorithmException, UnrecoverableKeyException, KeyStoreException {
+ KeyManagerFactory kmFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
+ kmFactory.init(keyStore, password);
+ return kmFactory.getKeyManagers();
+ }
+
+ /**
+ * Reads the {@link HttpURLConnection} response body to a string.
+ *
+ * @param connection The {@link HttpURLConnection} to read the response body for.
+ * @return The response body as a string.
+ * @throws IOException If an I/O error occurs while reading the response body.
+ */
+ @SuppressWarnings("StringOperationCanBeSimplified")
+ public static String readResponse(HttpURLConnection connection) throws IOException {
+ InputStream response = (connection.getInputStream() != null)
+ ? connection.getInputStream()
+ : connection.getErrorStream();
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ byte[] buffer = new byte[4096];
+ int read;
+ while ((read = response.read(buffer)) != -1) {
+ outputStream.write(buffer, 0, read);
+ }
+
+ return new String(outputStream.toByteArray(), StandardCharsets.UTF_8);
+ }
+
+ private SampleUtils() {
+ }
+}
diff --git a/sdk/keyvault/azure-security-keyvault-jca/src/samples/java/com/azure/security/keyvault/jca/TrustSelfSignedServerDelegate.java b/sdk/keyvault/azure-security-keyvault-jca/src/samples/java/com/azure/security/keyvault/jca/TrustSelfSignedServerDelegate.java
new file mode 100644
index 000000000000..0103ce37b5e3
--- /dev/null
+++ b/sdk/keyvault/azure-security-keyvault-jca/src/samples/java/com/azure/security/keyvault/jca/TrustSelfSignedServerDelegate.java
@@ -0,0 +1,50 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+package com.azure.security.keyvault.jca;
+
+import javax.net.ssl.X509TrustManager;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.util.Objects;
+
+/**
+ * Implementation of {@link X509TrustManager} that wraps another {@link X509TrustManager} with a check where self-signed
+ * server chains are trusted.
+ *
+ * This implementation uses basic validation for checking if the chain is self-signed, where it only checks that the
+ * chain has a length of one. This validation only applies when running
+ * {@link X509TrustManager#checkServerTrusted(X509Certificate[], String)}, and if it passes that method call does not
+ * delegate to the wrapped {@link X509TrustManager}.
+ *
+ * {@link X509TrustManager#checkClientTrusted(X509Certificate[], String)} and
+ * {@link X509TrustManager#getAcceptedIssuers()} always delegate to the wrapped {@link X509TrustManager}.
+ */
+public final class TrustSelfSignedServerDelegate implements X509TrustManager {
+ private final X509TrustManager delegate;
+
+ /**
+ * Creates a new instance of {@link TrustSelfSignedServerDelegate}.
+ *
+ * @param delegate The {@link X509TrustManager} that this {@link TrustSelfSignedServerDelegate} will delegate.
+ */
+ public TrustSelfSignedServerDelegate(X509TrustManager delegate) {
+ this.delegate = Objects.requireNonNull(delegate, "'delegate' cannot be null.");
+ }
+
+ @Override
+ public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+ delegate.checkClientTrusted(chain, authType);
+ }
+
+ @Override
+ public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+ if (chain.length != 1) {
+ checkServerTrusted(chain, authType);
+ }
+ }
+
+ @Override
+ public X509Certificate[] getAcceptedIssuers() {
+ return delegate.getAcceptedIssuers();
+ }
+}
diff --git a/sdk/keyvault/azure-security-keyvault-jca/src/samples/java/com/azure/security/keyvault/jca/mtls/ClientMTLSSample.java b/sdk/keyvault/azure-security-keyvault-jca/src/samples/java/com/azure/security/keyvault/jca/mtls/ClientMTLSSample.java
index c4884dbd2ed0..b3f3711b4a6f 100644
--- a/sdk/keyvault/azure-security-keyvault-jca/src/samples/java/com/azure/security/keyvault/jca/mtls/ClientMTLSSample.java
+++ b/sdk/keyvault/azure-security-keyvault-jca/src/samples/java/com/azure/security/keyvault/jca/mtls/ClientMTLSSample.java
@@ -4,21 +4,14 @@
import com.azure.security.keyvault.jca.KeyVaultJcaProvider;
import com.azure.security.keyvault.jca.KeyVaultKeyStore;
-import org.apache.hc.client5.http.classic.methods.HttpGet;
-import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
-import org.apache.hc.client5.http.impl.classic.HttpClients;
-import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
-import org.apache.hc.client5.http.socket.ConnectionSocketFactory;
-import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory;
-import org.apache.hc.client5.http.ssl.TrustSelfSignedStrategy;
-import org.apache.hc.core5.http.ClassicHttpResponse;
-import org.apache.hc.core5.http.config.RegistryBuilder;
-import org.apache.hc.core5.http.io.HttpClientResponseHandler;
-import org.apache.hc.core5.http.io.entity.EntityUtils;
-import org.apache.hc.core5.ssl.SSLContexts;
+import com.azure.security.keyvault.jca.SampleUtils;
+import javax.net.ssl.HttpsURLConnection;
+import javax.net.ssl.KeyManager;
import javax.net.ssl.SSLContext;
+import javax.net.ssl.TrustManager;
import java.io.IOException;
+import java.net.URI;
import java.security.KeyStore;
import java.security.Security;
@@ -44,35 +37,36 @@ public static void main(String[] args) throws Exception {
System.setProperty("azure.keyvault.client-secret", "");
KeyStore trustStore = KeyVaultKeyStore.getKeyVaultKeyStoreBySystemProperty();
- SSLContext sslContext = SSLContexts
- .custom()
- .loadTrustMaterial(trustStore, new TrustSelfSignedStrategy())
- .loadKeyMaterial(keyStore, "".toCharArray())
- .build();
-
- SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(
- sslContext, (hostname, session) -> true);
-
- PoolingHttpClientConnectionManager manager = new PoolingHttpClientConnectionManager(
- RegistryBuilder.create()
- .register("https", sslConnectionSocketFactory)
- .build());
+ // This section initializing SSLContext can be replaced with implementation specific consumption of 'KeyStore',
+ // if the library being used has convenience methods for that.
+ SSLContext sslContext = SSLContext.getInstance("TLS");
+ TrustManager[] trustManagers = SampleUtils.loadTrustMaterial(keyStore);
+ KeyManager[] keyManagers = SampleUtils.loadKeyMaterial(keyStore, "".toCharArray());
+ sslContext.init(keyManagers, trustManagers, null);
String result = null;
+ HttpsURLConnection connection = null;
+ try {
+ // openConnection will return HttpsURLConnection when the protocol is 'https'.
+ connection = (HttpsURLConnection) URI.create("https://localhost:8765").toURL().openConnection();
+
+ // Have the HttpsURLConnection use the SSLSocketFactory returned by SSLContext.
+ connection.setSSLSocketFactory(sslContext.getSocketFactory());
- try (CloseableHttpClient client = HttpClients.custom().setConnectionManager(manager).build()) {
- HttpGet httpGet = new HttpGet("https://localhost:8765");
- HttpClientResponseHandler responseHandler = (ClassicHttpResponse response) -> {
- int status = response.getCode();
- String result1 = "Not success";
- if (status == 200) {
- result1 = EntityUtils.toString(response.getEntity());
- }
- return result1;
- };
- result = client.execute(httpGet, responseHandler);
+ connection.setRequestMethod("GET");
+ int status = connection.getResponseCode();
+ if (status == 200) {
+ result = SampleUtils.readResponse(connection);
+ } else {
+ result = "Not success";
+ }
} catch (IOException ioe) {
ioe.printStackTrace();
+ result = "Not success";
+ } finally {
+ if (connection != null) {
+ connection.disconnect();
+ }
}
System.out.println(result);
// END: readme-sample-clientMTLS
diff --git a/sdk/keyvault/azure-security-keyvault-jca/src/samples/java/com/azure/security/keyvault/jca/mtls/ServerMTLSSample.java b/sdk/keyvault/azure-security-keyvault-jca/src/samples/java/com/azure/security/keyvault/jca/mtls/ServerMTLSSample.java
index 119272fa6edd..3f83b02ed56d 100644
--- a/sdk/keyvault/azure-security-keyvault-jca/src/samples/java/com/azure/security/keyvault/jca/mtls/ServerMTLSSample.java
+++ b/sdk/keyvault/azure-security-keyvault-jca/src/samples/java/com/azure/security/keyvault/jca/mtls/ServerMTLSSample.java
@@ -13,6 +13,7 @@
import javax.net.ssl.TrustManagerFactory;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
+import java.nio.charset.StandardCharsets;
import java.security.KeyStore;
import java.security.Security;
@@ -57,8 +58,8 @@ public static void main(String[] args) throws Exception {
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
String body = "Hello, this is server.";
- String response =
- "HTTP/1.1 200 OK\r\n" + "Content-Type: text/plain\r\n" + "Content-Length: " + body.getBytes("UTF-8").length + "\r\n" + "Connection: close\r\n" + "\r\n" + body;
+ String response = "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nContent-Length: "
+ + body.getBytes(StandardCharsets.UTF_8).length + "\r\nConnection: close\r\n\r\n" + body;
out.write(response);
out.flush();
diff --git a/sdk/keyvault/azure-security-keyvault-jca/src/samples/java/com/azure/security/keyvault/jca/tls/ClientSSLSample.java b/sdk/keyvault/azure-security-keyvault-jca/src/samples/java/com/azure/security/keyvault/jca/tls/ClientSSLSample.java
index 5e0d4205ce2a..cf7d49a6f202 100644
--- a/sdk/keyvault/azure-security-keyvault-jca/src/samples/java/com/azure/security/keyvault/jca/tls/ClientSSLSample.java
+++ b/sdk/keyvault/azure-security-keyvault-jca/src/samples/java/com/azure/security/keyvault/jca/tls/ClientSSLSample.java
@@ -4,21 +4,13 @@
import com.azure.security.keyvault.jca.KeyVaultJcaProvider;
import com.azure.security.keyvault.jca.KeyVaultKeyStore;
-import org.apache.hc.client5.http.classic.methods.HttpGet;
-import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
-import org.apache.hc.client5.http.impl.classic.HttpClients;
-import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
-import org.apache.hc.client5.http.socket.ConnectionSocketFactory;
-import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory;
-import org.apache.hc.client5.http.ssl.TrustSelfSignedStrategy;
-import org.apache.hc.core5.http.ClassicHttpResponse;
-import org.apache.hc.core5.http.config.RegistryBuilder;
-import org.apache.hc.core5.http.io.HttpClientResponseHandler;
-import org.apache.hc.core5.http.io.entity.EntityUtils;
-import org.apache.hc.core5.ssl.SSLContexts;
+import com.azure.security.keyvault.jca.SampleUtils;
+import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
+import javax.net.ssl.TrustManager;
import java.io.IOException;
+import java.net.URI;
import java.security.KeyStore;
import java.security.Security;
@@ -39,34 +31,35 @@ public static void main(String[] args) throws Exception {
KeyStore keyStore = KeyVaultKeyStore.getKeyVaultKeyStoreBySystemProperty();
- SSLContext sslContext = SSLContexts
- .custom()
- .loadTrustMaterial(keyStore, new TrustSelfSignedStrategy())
- .build();
-
- SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(
- sslContext, (hostname, session) -> true);
-
- PoolingHttpClientConnectionManager manager = new PoolingHttpClientConnectionManager(
- RegistryBuilder.create()
- .register("https", sslConnectionSocketFactory)
- .build());
+ // This section initializing SSLContext can be replaced with implementation specific consumption of 'KeyStore',
+ // if the library being used has convenience methods for that.
+ SSLContext sslContext = SSLContext.getInstance("TLS");
+ TrustManager[] trustManagers = SampleUtils.loadTrustMaterial(keyStore);
+ sslContext.init(null, trustManagers, null);
String result = null;
+ HttpsURLConnection connection = null;
+ try {
+ // openConnection will return HttpsURLConnection when the protocol is 'https'.
+ connection = (HttpsURLConnection) URI.create("https://localhost:8765").toURL().openConnection();
+
+ // Have the HttpsURLConnection use the SSLSocketFactory returned by SSLContext.
+ connection.setSSLSocketFactory(sslContext.getSocketFactory());
- try (CloseableHttpClient client = HttpClients.custom().setConnectionManager(manager).build()) {
- HttpGet httpGet = new HttpGet("https://localhost:8765");
- HttpClientResponseHandler responseHandler = (ClassicHttpResponse response) -> {
- int status = response.getCode();
- String result1 = "Not success";
- if (status == 200) {
- result1 = EntityUtils.toString(response.getEntity());
- }
- return result1;
- };
- result = client.execute(httpGet, responseHandler);
+ connection.setRequestMethod("GET");
+ int status = connection.getResponseCode();
+ if (status == 200) {
+ result = SampleUtils.readResponse(connection);
+ } else {
+ result = "Not success";
+ }
} catch (IOException ioe) {
ioe.printStackTrace();
+ result = "Not success";
+ } finally {
+ if (connection != null) {
+ connection.disconnect();
+ }
}
System.out.println(result);
// END: readme-sample-clientSSL
diff --git a/sdk/keyvault/azure-security-keyvault-jca/src/samples/java/com/azure/security/keyvault/jca/tls/ServerSSLSample.java b/sdk/keyvault/azure-security-keyvault-jca/src/samples/java/com/azure/security/keyvault/jca/tls/ServerSSLSample.java
index f925dd04a75c..491c8113c4ae 100644
--- a/sdk/keyvault/azure-security-keyvault-jca/src/samples/java/com/azure/security/keyvault/jca/tls/ServerSSLSample.java
+++ b/sdk/keyvault/azure-security-keyvault-jca/src/samples/java/com/azure/security/keyvault/jca/tls/ServerSSLSample.java
@@ -12,6 +12,7 @@
import javax.net.ssl.SSLSocket;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
+import java.nio.charset.StandardCharsets;
import java.security.KeyStore;
import java.security.Security;
@@ -47,8 +48,8 @@ public static void main(String[] args) throws Exception {
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
String body = "Hello, this is server.";
- String response =
- "HTTP/1.1 200 OK\r\n" + "Content-Type: text/plain\r\n" + "Content-Length: " + body.getBytes("UTF-8").length + "\r\n" + "Connection: close\r\n" + "\r\n" + body;
+ String response = "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nContent-Length: "
+ + body.getBytes(StandardCharsets.UTF_8).length + "\r\nConnection: close\r\n\r\n" + body;
out.write(response);
out.flush();
diff --git a/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/JcaTestUtils.java b/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/JcaTestUtils.java
new file mode 100644
index 000000000000..0014f1b83915
--- /dev/null
+++ b/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/JcaTestUtils.java
@@ -0,0 +1,168 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+package com.azure.security.keyvault.jca;
+
+import javax.net.ssl.KeyManager;
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.SSLEngine;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.TrustManagerFactory;
+import javax.net.ssl.X509ExtendedKeyManager;
+import javax.net.ssl.X509TrustManager;
+import java.net.Socket;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.Principal;
+import java.security.PrivateKey;
+import java.security.UnrecoverableKeyException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.util.function.BiFunction;
+import java.util.function.BiPredicate;
+
+/**
+ * Utility methods for testing KeyVault JCA.
+ */
+public final class JcaTestUtils {
+ /**
+ * Loads {@link TrustManager TrustManagers}.
+ *
+ * @param keyStore The {@link KeyStore}.
+ * @param trustStrategy An optional predicate that is used to skip calling
+ * {@link X509TrustManager#checkServerTrusted(X509Certificate[], String)}.
+ * @return The {@link TrustManager TrustManagers}.
+ * @throws NoSuchAlgorithmException If the algorithm used when calling
+ * {@link TrustManagerFactory#getInstance(String)} doesn't exist.
+ * @throws KeyStoreException If {@link TrustManagerFactory#init(KeyStore)} fails.
+ */
+ public static TrustManager[] loadTrustMaterial(KeyStore keyStore,
+ BiPredicate trustStrategy) throws NoSuchAlgorithmException, KeyStoreException {
+ TrustManagerFactory tmFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
+ tmFactory.init(keyStore);
+ TrustManager[] trustManagers = tmFactory.getTrustManagers();
+
+ if (trustManagers != null && trustStrategy != null) {
+ for (int i = 0; i < trustManagers.length; i++) {
+ TrustManager trustManager = trustManagers[i];
+ if (trustManager instanceof X509TrustManager) {
+ trustManagers[i] = new TrustManagerDelegate((X509TrustManager) trustManager, trustStrategy);
+ }
+ }
+ }
+
+ return trustManagers;
+ }
+
+ /**
+ * Loads {@link KeyManager KeyManagers}.
+ *
+ * @param keyStore The {@link KeyStore}.
+ * @param aliasStrategy An optional function to handle aliasing.
+ * @return The {@link KeyManager KeyManagers}.
+ * @throws NoSuchAlgorithmException If the algorithm used when calling {@link KeyManagerFactory#getInstance(String)}
+ * doesn't exist.
+ * @throws KeyStoreException If {@link KeyManagerFactory#init(KeyStore, char[])} fails.
+ * @throws UnrecoverableKeyException If the {@link KeyManager} can't be recovered when calling
+ * {@link KeyManagerFactory#init(KeyStore, char[])}, such as the {@code password is wrong}.
+ */
+ public static KeyManager[] loadKeyMaterial(KeyStore keyStore, char[] password,
+ BiFunction aliasStrategy)
+ throws NoSuchAlgorithmException, UnrecoverableKeyException, KeyStoreException {
+ KeyManagerFactory kmFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
+ kmFactory.init(keyStore, password);
+ KeyManager[] keyManagers = kmFactory.getKeyManagers();
+
+ if (keyManagers != null && aliasStrategy != null) {
+ for (int i = 0; i < keyManagers.length; i++) {
+ KeyManager keyManager = keyManagers[i];
+ if (keyManager instanceof X509ExtendedKeyManager) {
+ keyManagers[i] = new KeyManagerDelegate((X509ExtendedKeyManager) keyManager, aliasStrategy);
+ }
+ }
+ }
+
+ return keyManagers;
+ }
+
+ private static final class TrustManagerDelegate implements X509TrustManager {
+ private final X509TrustManager delegate;
+ private final BiPredicate trustStrategy;
+
+ private TrustManagerDelegate(X509TrustManager delegate, BiPredicate trustStrategy) {
+ this.delegate = delegate;
+ this.trustStrategy = trustStrategy;
+ }
+
+ @Override
+ public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+ delegate.checkClientTrusted(chain, authType);
+ }
+
+ @Override
+ public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+ if (!trustStrategy.test(chain, authType)) {
+ delegate.checkServerTrusted(chain, authType);
+ }
+ }
+
+ @Override
+ public X509Certificate[] getAcceptedIssuers() {
+ return delegate.getAcceptedIssuers();
+ }
+ }
+
+ private static final class KeyManagerDelegate extends X509ExtendedKeyManager {
+ private final X509ExtendedKeyManager delegate;
+ private final BiFunction aliasStrategy;
+
+ private KeyManagerDelegate(X509ExtendedKeyManager delegate,
+ BiFunction aliasStrategy) {
+ this.delegate = delegate;
+ this.aliasStrategy = aliasStrategy;
+ }
+
+ @Override
+ public String[] getClientAliases(String keyType, Principal[] issuers) {
+ return delegate.getClientAliases(keyType, issuers);
+ }
+
+ @Override
+ public String chooseClientAlias(String[] keyType, Principal[] issuers, Socket socket) {
+ return aliasStrategy.apply(keyType, issuers);
+ }
+
+ @Override
+ public String[] getServerAliases(String keyType, Principal[] issuers) {
+ return delegate.getServerAliases(keyType, issuers);
+ }
+
+ @Override
+ public String chooseServerAlias(String keyType, Principal[] issuers, Socket socket) {
+ return aliasStrategy.apply(new String[] { keyType }, issuers);
+ }
+
+ @Override
+ public X509Certificate[] getCertificateChain(String alias) {
+ return delegate.getCertificateChain(alias);
+ }
+
+ @Override
+ public PrivateKey getPrivateKey(String alias) {
+ return delegate.getPrivateKey(alias);
+ }
+
+ @Override
+ public String chooseEngineClientAlias(String[] keyType, Principal[] issuers, SSLEngine engine) {
+ return aliasStrategy.apply(keyType, issuers);
+ }
+
+ @Override
+ public String chooseEngineServerAlias(String keyType, Principal[] issuers, SSLEngine engine) {
+ return aliasStrategy.apply(new String[] { keyType }, issuers);
+ }
+ }
+
+ private JcaTestUtils() {
+ }
+}
diff --git a/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/JreKeyStoreTest.java b/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/JreKeyStoreTest.java
index 07b74d695e98..fcca34eb1a77 100644
--- a/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/JreKeyStoreTest.java
+++ b/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/JreKeyStoreTest.java
@@ -4,29 +4,21 @@
package com.azure.security.keyvault.jca;
import com.azure.security.keyvault.jca.implementation.certificates.JreCertificates;
-import org.apache.hc.client5.http.classic.methods.HttpGet;
-import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
-import org.apache.hc.client5.http.impl.classic.HttpClients;
-import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
-import org.apache.hc.client5.http.socket.ConnectionSocketFactory;
-import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory;
-import org.apache.hc.core5.http.ClassicHttpResponse;
-import org.apache.hc.core5.http.config.RegistryBuilder;
-import org.apache.hc.core5.http.io.HttpClientResponseHandler;
-import org.apache.hc.core5.ssl.SSLContexts;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
+import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import java.io.IOException;
+import java.net.URI;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.util.Map;
import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertTrue;
@EnabledIfEnvironmentVariable(named = "AZURE_KEYVAULT_CERTIFICATE_NAME", matches = "myalias")
public class JreKeyStoreTest {
@@ -48,7 +40,7 @@ public void testJreKsEntries() {
assertNotNull(jreCertificates);
assertNotNull(jreCertificates.getAliases());
Map certs = jreCertificates.getCertificates();
- assertTrue(certs.size() > 0);
+ assertFalse(certs.isEmpty());
assertNotNull(jreCertificates.getCertificateKeys());
}
@@ -64,33 +56,26 @@ public void testJreKsTrustPeer() throws Exception {
* - Create SSL connection factory.
* - Set hostname verifier to trust any hostname.
*/
-
- SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(ks, null).build();
-
- SSLConnectionSocketFactory sslConnectionSocketFactory
- = new SSLConnectionSocketFactory(sslContext, (hostname, session) -> true);
-
- PoolingHttpClientConnectionManager manager = new PoolingHttpClientConnectionManager(
- RegistryBuilder.create().register("https", sslConnectionSocketFactory).build());
+ SSLContext sslContext = SSLContext.getInstance("TLS");
+ sslContext.init(null, JcaTestUtils.loadTrustMaterial(ks, null), null);
/*
* And now execute the test.
*/
String result = null;
-
- try (CloseableHttpClient client = HttpClients.custom().setConnectionManager(manager).build()) {
- HttpGet httpGet = new HttpGet("https://google.com:443");
- HttpClientResponseHandler responseHandler = (ClassicHttpResponse response) -> {
- int status = response.getCode();
- String result1 = null;
- if (status == 200) {
- result1 = "Success";
- }
- return result1;
- };
- result = client.execute(httpGet, responseHandler);
+ HttpsURLConnection connection = null;
+ try {
+ connection = (HttpsURLConnection) URI.create("https://google.com:443").toURL().openConnection();
+ connection.setRequestMethod("GET");
+ if (connection.getResponseCode() == 200) {
+ result = "Success";
+ }
} catch (IOException ioe) {
ioe.printStackTrace();
+ } finally {
+ if (connection != null) {
+ connection.disconnect();
+ }
}
/*
diff --git a/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/KeyVaultEncodeTest.java b/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/KeyVaultEncodeTest.java
index d6e783d68224..39943cdb33b5 100644
--- a/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/KeyVaultEncodeTest.java
+++ b/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/KeyVaultEncodeTest.java
@@ -21,43 +21,43 @@ public void buildLengthBytesTest() {
Random random = new Random();
int a = random.nextInt(1 << 7);
byte[] result = KeyVaultEncode.buildLengthBytes(TEST_TAG, a);
- Assertions.assertEquals(result.length, 2);
- Assertions.assertEquals(result[0], TEST_TAG);
- Assertions.assertEquals(result[1], (byte) a);
+ Assertions.assertEquals(2, result.length);
+ Assertions.assertEquals(TEST_TAG, result[0]);
+ Assertions.assertEquals((byte) a, result[1]);
a = random.nextInt((1 << 8) - (1 << 7)) + (1 << 7);
result = KeyVaultEncode.buildLengthBytes(TEST_TAG, a);
- Assertions.assertEquals(result.length, 3);
- Assertions.assertEquals(result[0], TEST_TAG);
- Assertions.assertEquals(result[1], (byte) 0x081);
- Assertions.assertEquals(result[2], (byte) a);
+ Assertions.assertEquals(3, result.length);
+ Assertions.assertEquals(TEST_TAG, result[0]);
+ Assertions.assertEquals((byte) 0x081, result[1]);
+ Assertions.assertEquals((byte) a, result[2]);
a = random.nextInt((1 << 16) - (1 << 8)) + (1 << 8);
result = KeyVaultEncode.buildLengthBytes(TEST_TAG, a);
- Assertions.assertEquals(result.length, 4);
- Assertions.assertEquals(result[0], TEST_TAG);
- Assertions.assertEquals(result[1], (byte) 0x082);
- Assertions.assertEquals(result[2], (byte) (a >> 8));
- Assertions.assertEquals(result[3], (byte) a);
+ Assertions.assertEquals(4, result.length);
+ Assertions.assertEquals(TEST_TAG, result[0]);
+ Assertions.assertEquals((byte) 0x082, result[1]);
+ Assertions.assertEquals((byte) (a >> 8), result[2]);
+ Assertions.assertEquals((byte) a, result[3]);
a = random.nextInt((1 << 24) - (1 << 16)) + (1 << 16);
result = KeyVaultEncode.buildLengthBytes(TEST_TAG, a);
- Assertions.assertEquals(result.length, 5);
- Assertions.assertEquals(result[0], TEST_TAG);
- Assertions.assertEquals(result[1], (byte) 0x083);
- Assertions.assertEquals(result[2], (byte) (a >> 16));
- Assertions.assertEquals(result[3], (byte) (a >> 8));
- Assertions.assertEquals(result[4], (byte) a);
+ Assertions.assertEquals(5, result.length);
+ Assertions.assertEquals(TEST_TAG, result[0]);
+ Assertions.assertEquals((byte) 0x083, result[1]);
+ Assertions.assertEquals((byte) (a >> 16), result[2]);
+ Assertions.assertEquals((byte) (a >> 8), result[3]);
+ Assertions.assertEquals((byte) a, result[4]);
a = random.nextInt((1 << 30) - (1 << 24)) + (1 << 24);
result = KeyVaultEncode.buildLengthBytes(TEST_TAG, a);
- Assertions.assertEquals(result.length, 6);
- Assertions.assertEquals(result[0], TEST_TAG);
- Assertions.assertEquals(result[1], (byte) 0x084);
- Assertions.assertEquals(result[2], (byte) (a >> 24));
- Assertions.assertEquals(result[3], (byte) (a >> 16));
- Assertions.assertEquals(result[4], (byte) (a >> 8));
- Assertions.assertEquals(result[5], (byte) a);
+ Assertions.assertEquals(6, result.length);
+ Assertions.assertEquals(TEST_TAG, result[0]);
+ Assertions.assertEquals((byte) 0x084, result[1]);
+ Assertions.assertEquals((byte) (a >> 24), result[2]);
+ Assertions.assertEquals((byte) (a >> 16), result[3]);
+ Assertions.assertEquals((byte) (a >> 8), result[4]);
+ Assertions.assertEquals((byte) a, result[5]);
}
@Test
diff --git a/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/KeyVaultKeyStoreUnitTest.java b/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/KeyVaultKeyStoreUnitTest.java
index 9e290eaf45fc..af65bb94e014 100644
--- a/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/KeyVaultKeyStoreUnitTest.java
+++ b/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/KeyVaultKeyStoreUnitTest.java
@@ -51,12 +51,12 @@ public void testGetRefreshInterval() {
System.clearProperty("azure.keyvault.jca.certificates-refresh-interval");
System.clearProperty("azure.keyvault.jca.certificates-refresh-interval-in-ms");
KeyVaultKeyStore keystore = new KeyVaultKeyStore();
- assertEquals(keystore.getRefreshInterval(), 0);
+ assertEquals(0, keystore.getRefreshInterval());
System.setProperty("azure.keyvault.jca.certificates-refresh-interval", "2000");
keystore = new KeyVaultKeyStore();
- assertEquals(keystore.getRefreshInterval(), 2000);
+ assertEquals(2000, keystore.getRefreshInterval());
System.setProperty("azure.keyvault.jca.certificates-refresh-interval-in-ms", "1000");
- assertEquals(keystore.getRefreshInterval(), 1000);
+ assertEquals(1000, keystore.getRefreshInterval());
}
@Test
diff --git a/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/ServerSocketTest.java b/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/ServerSocketTest.java
index bd2d91b7f6ad..a83d91e3cb87 100644
--- a/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/ServerSocketTest.java
+++ b/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/ServerSocketTest.java
@@ -3,36 +3,22 @@
package com.azure.security.keyvault.jca;
-import org.apache.hc.client5.http.classic.methods.HttpGet;
-import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
-import org.apache.hc.client5.http.impl.classic.HttpClients;
-import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
-import org.apache.hc.client5.http.socket.ConnectionSocketFactory;
-import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory;
-import org.apache.hc.client5.http.ssl.TrustSelfSignedStrategy;
-import org.apache.hc.core5.http.ClassicHttpResponse;
-import org.apache.hc.core5.http.config.RegistryBuilder;
-import org.apache.hc.core5.http.io.HttpClientResponseHandler;
-import org.apache.hc.core5.ssl.PrivateKeyDetails;
-import org.apache.hc.core5.ssl.PrivateKeyStrategy;
-import org.apache.hc.core5.ssl.SSLContexts;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
+import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
-import javax.net.ssl.SSLParameters;
import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.SSLServerSocketFactory;
import javax.net.ssl.TrustManagerFactory;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
+import java.net.URI;
import java.security.KeyStore;
import java.security.Security;
-import java.security.cert.X509Certificate;
-import java.util.Map;
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -57,7 +43,7 @@ public static void beforeEach() throws Exception {
KeyVaultJcaProvider provider = new KeyVaultJcaProvider();
Security.addProvider(provider);
- /**
+ /*
* - Create an Azure Key Vault specific instance of a KeyStore.
* - Set the KeyManagerFactory to use that KeyStore.
*/
@@ -86,16 +72,16 @@ private void startSocket(SSLServerSocket serverSocket) {
@Test
public void testHttpsConnectionWithoutClientTrust() throws Exception {
- SSLContext sslContext = SSLContexts.custom()
- .loadTrustMaterial((final X509Certificate[] chain, final String authType) -> true)
- .build();
+ SSLContext sslContext = SSLContext.getInstance("TLS");
+ sslContext.init(null, JcaTestUtils.loadTrustMaterial(null, (ignoredChain, ignoredAuthType) -> true), null);
testHttpsConnection(8765, sslContext);
}
@Test
public void testHttpsConnectionWithSelfSignedClientTrust() throws Exception {
- SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(ks, new TrustSelfSignedStrategy()).build();
+ SSLContext sslContext = SSLContext.getInstance("TLS");
+ sslContext.init(null, JcaTestUtils.loadTrustMaterial(ks, (chain, ignored) -> chain.length == 1), null);
testHttpsConnection(8766, sslContext);
}
@@ -144,7 +130,7 @@ private void testHttpsConnection(Integer port, SSLContext sslContext) throws Exc
assertEquals("Success", result);
}
- private void serverSocketWithTrustManager(Integer port) throws Exception {
+ private void serverSocketWithTrustManager(int port) throws Exception {
/*
* Setup server side.
*
@@ -169,11 +155,10 @@ private void serverSocketWithTrustManager(Integer port) throws Exception {
* - Create an SSL context.
* - Set SSL context to trust any certificate.
*/
-
- SSLContext sslContext = SSLContexts.custom()
- .loadTrustMaterial(ks, new TrustSelfSignedStrategy())
- .loadKeyMaterial(ks, "".toCharArray(), new ClientPrivateKeyStrategy())
- .build();
+ SSLContext sslContext = SSLContext.getInstance("TLS");
+ sslContext.init(
+ JcaTestUtils.loadKeyMaterial(ks, "".toCharArray(), (ignoredKeyTypes, ignoredIssuers) -> certificateName),
+ JcaTestUtils.loadTrustMaterial(ks, (chain, ignored) -> chain.length == 1), null);
/*
* And now execute the test.
@@ -186,41 +171,28 @@ private void serverSocketWithTrustManager(Integer port) throws Exception {
assertEquals("Success", result);
}
- private String sendRequest(SSLContext sslContext, Integer port) {
+ private String sendRequest(SSLContext sslContext, int port) {
- /**
+ /*
* - Create SSL connection factory.
* - Set hostname verifier to trust any hostname.
*/
- SSLConnectionSocketFactory sslConnectionSocketFactory
- = new SSLConnectionSocketFactory(sslContext, (hostname, session) -> true);
-
- PoolingHttpClientConnectionManager manager = new PoolingHttpClientConnectionManager(
- RegistryBuilder.create().register("https", sslConnectionSocketFactory).build());
-
String result = null;
-
- try (CloseableHttpClient client = HttpClients.custom().setConnectionManager(manager).build()) {
- HttpGet httpGet = new HttpGet("https://localhost:" + port);
- HttpClientResponseHandler responseHandler = (ClassicHttpResponse response) -> {
- int status = response.getCode();
- String result1 = null;
- if (status == 204) {
- result1 = "Success";
- }
- return result1;
- };
- result = client.execute(httpGet, responseHandler);
+ HttpsURLConnection connection = null;
+ try {
+ connection = (HttpsURLConnection) URI.create("https://localhost:" + port).toURL().openConnection();
+ connection.setSSLSocketFactory(sslContext.getSocketFactory());
+ connection.setRequestMethod("GET");
+ if (connection.getResponseCode() == 204) {
+ result = "Success";
+ }
} catch (IOException ioe) {
ioe.printStackTrace();
+ } finally {
+ if (connection != null) {
+ connection.disconnect();
+ }
}
return result;
}
-
- private static class ClientPrivateKeyStrategy implements PrivateKeyStrategy {
- @Override
- public String chooseAlias(Map aliases, SSLParameters sslParameters) {
- return certificateName; // It should be your certificate alias used in client-side
- }
- }
}
diff --git a/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/SpecificPathCertificatesTest.java b/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/SpecificPathCertificatesTest.java
index 8932a202a584..dd4e6d5c71a8 100644
--- a/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/SpecificPathCertificatesTest.java
+++ b/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/SpecificPathCertificatesTest.java
@@ -13,6 +13,7 @@
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.nio.file.FileSystems;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
@@ -35,7 +36,7 @@ public static void setEnvironmentProperty() {
public static String getFilePath(String packageName) {
String filepath = "\\src\\test\\resources\\" + packageName;
- return System.getProperty("user.dir") + filepath.replace("\\", System.getProperty("file.separator"));
+ return System.getProperty("user.dir") + filepath.replace("\\", FileSystems.getDefault().getSeparator());
}
@Test
diff --git a/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/implementation/certificates/ClasspathCertificatesTest.java b/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/implementation/certificates/ClasspathCertificatesTest.java
index e2dab5e2f7b1..fed6265ab347 100644
--- a/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/implementation/certificates/ClasspathCertificatesTest.java
+++ b/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/implementation/certificates/ClasspathCertificatesTest.java
@@ -3,15 +3,14 @@
package com.azure.security.keyvault.jca.implementation.certificates;
-import static org.mockito.Mockito.mock;
-
-import java.security.cert.Certificate;
+import com.azure.security.keyvault.jca.implementation.mocking.MockCertificate;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
-public class ClasspathCertificatesTest {
+import java.security.cert.Certificate;
- private final Certificate certificate = mock(Certificate.class);
+public class ClasspathCertificatesTest {
+ private final Certificate certificate = new MockCertificate();
@Test
public void testSetCertificateEntry() {
diff --git a/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/implementation/certificates/KeyVaultCertificatesTest.java b/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/implementation/certificates/KeyVaultCertificatesTest.java
index e4dc803d6cc2..7e41fa8a92b9 100644
--- a/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/implementation/certificates/KeyVaultCertificatesTest.java
+++ b/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/implementation/certificates/KeyVaultCertificatesTest.java
@@ -3,35 +3,56 @@
package com.azure.security.keyvault.jca.implementation.certificates;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
import com.azure.security.keyvault.jca.implementation.KeyVaultClient;
+import com.azure.security.keyvault.jca.implementation.mocking.MockCertificate;
+import com.azure.security.keyvault.jca.implementation.mocking.MockKey;
+import com.azure.security.keyvault.jca.implementation.mocking.MockKeyVaultClient;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
import java.security.Key;
import java.security.cert.Certificate;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
public class KeyVaultCertificatesTest {
+ private final Key key = new MockKey();
+ private final Certificate certificate = new MockCertificate();
- private final KeyVaultClient keyVaultClient = mock(KeyVaultClient.class);
-
- private final Key key = mock(Key.class);
-
- private final Certificate certificate = mock(Certificate.class);
-
+ // This needs to be mutable.
+ private List aliases = new ArrayList<>(Collections.singletonList("myalias"));
private KeyVaultCertificates keyVaultCertificates;
@BeforeEach
public void beforeEach() {
- List aliases = new ArrayList<>();
- aliases.add("myalias");
- when(keyVaultClient.getAliases()).thenReturn(aliases);
- when(keyVaultClient.getKey("myalias", null)).thenReturn(key);
- when(keyVaultClient.getCertificate("myalias")).thenReturn(certificate);
+ KeyVaultClient keyVaultClient = new MockKeyVaultClient() {
+ @Override
+ public List getAliases() {
+ return aliases;
+ }
+
+ @Override
+ public Key getKey(String alias, char[] password) {
+ return "myalias".equals(alias) && password == null ? key : null;
+ }
+
+ @Override
+ public Certificate getCertificate(String alias) {
+ return "myalias".equals(alias) ? certificate : null;
+ }
+
+ @Override
+ public Certificate[] getCertificateChain(String alias) {
+ return null;
+ }
+
+ @Override
+ public byte[] getSignedWithPrivateKey(String digestName, String digestValue, String keyId) {
+ return null;
+ }
+ };
keyVaultCertificates = new KeyVaultCertificates(60_000, keyVaultClient);
}
@@ -54,7 +75,8 @@ public void testGetCertificate() {
public void testRefreshAndGetAliasByCertificate() {
Assertions.assertEquals("myalias", keyVaultCertificates.refreshAndGetAliasByCertificate(certificate));
Assertions.assertEquals(keyVaultCertificates.getCertificates().get("myalias"), certificate);
- when(keyVaultClient.getAliases()).thenReturn(null);
+
+ this.aliases = null;
Assertions.assertNotEquals("myalias", keyVaultCertificates.refreshAndGetAliasByCertificate(certificate));
Assertions.assertNull(keyVaultCertificates.getCertificates().get("myalias"));
}
diff --git a/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/implementation/mocking/MockCertificate.java b/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/implementation/mocking/MockCertificate.java
new file mode 100644
index 000000000000..b4afd69c7ea9
--- /dev/null
+++ b/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/implementation/mocking/MockCertificate.java
@@ -0,0 +1,48 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+package com.azure.security.keyvault.jca.implementation.mocking;
+
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.security.PublicKey;
+import java.security.SignatureException;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateEncodingException;
+import java.security.cert.CertificateException;
+
+/**
+ * Mock of {@link Certificate}.
+ */
+public class MockCertificate extends Certificate {
+ public MockCertificate() {
+ super("mock");
+ }
+
+ @Override
+ public byte[] getEncoded() throws CertificateEncodingException {
+ return new byte[0];
+ }
+
+ @Override
+ public void verify(PublicKey key) throws CertificateException, NoSuchAlgorithmException, InvalidKeyException,
+ NoSuchProviderException, SignatureException {
+
+ }
+
+ @Override
+ public void verify(PublicKey key, String sigProvider) throws CertificateException, NoSuchAlgorithmException,
+ InvalidKeyException, NoSuchProviderException, SignatureException {
+
+ }
+
+ @Override
+ public String toString() {
+ return "";
+ }
+
+ @Override
+ public PublicKey getPublicKey() {
+ return null;
+ }
+}
diff --git a/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/implementation/mocking/MockKey.java b/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/implementation/mocking/MockKey.java
new file mode 100644
index 000000000000..c6021f17dc0f
--- /dev/null
+++ b/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/implementation/mocking/MockKey.java
@@ -0,0 +1,22 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+package com.azure.security.keyvault.jca.implementation.mocking;
+
+import java.security.Key;
+
+public class MockKey implements Key {
+ @Override
+ public String getAlgorithm() {
+ return "";
+ }
+
+ @Override
+ public String getFormat() {
+ return "";
+ }
+
+ @Override
+ public byte[] getEncoded() {
+ return new byte[0];
+ }
+}
diff --git a/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/implementation/mocking/MockKeyVaultClient.java b/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/implementation/mocking/MockKeyVaultClient.java
new file mode 100644
index 000000000000..94834e2f2ed2
--- /dev/null
+++ b/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/implementation/mocking/MockKeyVaultClient.java
@@ -0,0 +1,11 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+package com.azure.security.keyvault.jca.implementation.mocking;
+
+import com.azure.security.keyvault.jca.implementation.KeyVaultClient;
+
+public class MockKeyVaultClient extends KeyVaultClient {
+ public MockKeyVaultClient() {
+ super("https://accountname.vault.azure.net", "tenant-id", "client-id", "client-secret");
+ }
+}
diff --git a/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/implementation/mocking/MockPrivateKey.java b/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/implementation/mocking/MockPrivateKey.java
new file mode 100644
index 000000000000..b0fbd78f676b
--- /dev/null
+++ b/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/implementation/mocking/MockPrivateKey.java
@@ -0,0 +1,22 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+package com.azure.security.keyvault.jca.implementation.mocking;
+
+import java.security.PrivateKey;
+
+public class MockPrivateKey implements PrivateKey {
+ @Override
+ public String getAlgorithm() {
+ return null;
+ }
+
+ @Override
+ public String getFormat() {
+ return null;
+ }
+
+ @Override
+ public byte[] getEncoded() {
+ return new byte[0];
+ }
+}
diff --git a/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/implementation/mocking/MockPublicKey.java b/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/implementation/mocking/MockPublicKey.java
new file mode 100644
index 000000000000..4ee99bb9511e
--- /dev/null
+++ b/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/implementation/mocking/MockPublicKey.java
@@ -0,0 +1,22 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+package com.azure.security.keyvault.jca.implementation.mocking;
+
+import java.security.PublicKey;
+
+public class MockPublicKey implements PublicKey {
+ @Override
+ public String getAlgorithm() {
+ return null;
+ }
+
+ @Override
+ public String getFormat() {
+ return null;
+ }
+
+ @Override
+ public byte[] getEncoded() {
+ return new byte[0];
+ }
+}
diff --git a/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/implementation/signature/KeyVaultKeylessEcSignatureTest.java b/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/implementation/signature/KeyVaultKeylessEcSignatureTest.java
index 24817ae6ac9f..5f0685815cd9 100644
--- a/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/implementation/signature/KeyVaultKeylessEcSignatureTest.java
+++ b/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/implementation/signature/KeyVaultKeylessEcSignatureTest.java
@@ -6,30 +6,29 @@
import com.azure.security.keyvault.jca.KeyVaultEncode;
import com.azure.security.keyvault.jca.implementation.KeyVaultClient;
import com.azure.security.keyvault.jca.implementation.KeyVaultPrivateKey;
+import com.azure.security.keyvault.jca.implementation.mocking.MockKeyVaultClient;
+import com.azure.security.keyvault.jca.implementation.mocking.MockPrivateKey;
+import com.azure.security.keyvault.jca.implementation.mocking.MockPublicKey;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import org.mockito.ArgumentMatchers;
import java.security.PrivateKey;
import java.security.PublicKey;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
public class KeyVaultKeylessEcSignatureTest {
KeyVaultKeylessEcSignature keyVaultKeylessEcSignature;
- private final KeyVaultClient keyVaultClient = mock(KeyVaultClient.class);
-
- private final KeyVaultPrivateKey keyVaultPrivateKey = mock(KeyVaultPrivateKey.class);
+ private KeyVaultClient keyVaultClient;
private final byte[] signedWithES256 = "fake256Value".getBytes();
private final byte[] signedWithES384 = "fake384Value".getBytes();
+ private final PublicKey publicKey = new MockPublicKey();
+ private final PrivateKey privateKey = new MockPrivateKey();
static final String KEY_VAULT_TEST_URI_GLOBAL = "https://fake.vault.azure.net/";
@@ -39,40 +38,6 @@ public void before() {
keyVaultKeylessEcSignature = new KeyVaultKeylessEcSha256Signature();
}
- private final PublicKey publicKey = new PublicKey() {
- @Override
- public String getAlgorithm() {
- return null;
- }
-
- @Override
- public String getFormat() {
- return null;
- }
-
- @Override
- public byte[] getEncoded() {
- return new byte[0];
- }
- };
-
- private final PrivateKey privateKey = new PrivateKey() {
- @Override
- public String getAlgorithm() {
- return null;
- }
-
- @Override
- public String getFormat() {
- return null;
- }
-
- @Override
- public byte[] getEncoded() {
- return new byte[0];
- }
- };
-
@Test
public void engineInitVerifyTest() {
assertThrows(UnsupportedOperationException.class, () -> keyVaultKeylessEcSignature.engineInitVerify(publicKey));
@@ -102,18 +67,31 @@ public void engineSetParameterTest() {
@Test
public void setDigestNameAndEngineSignTest() {
+ keyVaultClient = new MockKeyVaultClient() {
+ @Override
+ public byte[] getSignedWithPrivateKey(String digestName, String digestValue, String keyId) {
+ return "ES256".equals(digestName) ? signedWithES256 : null;
+ }
+ };
+ KeyVaultPrivateKey keyVaultPrivateKey = new KeyVaultPrivateKey("algorithm", "kid") {
+ @Override
+ public KeyVaultClient getKeyVaultClient() {
+ return keyVaultClient;
+ }
+ };
keyVaultKeylessEcSignature = new KeyVaultKeylessEcSha256Signature();
- when(keyVaultClient.getSignedWithPrivateKey(ArgumentMatchers.eq("ES256"), anyString(),
- ArgumentMatchers.eq(null))).thenReturn(signedWithES256);
- when(keyVaultPrivateKey.getKeyVaultClient()).thenReturn(keyVaultClient);
keyVaultKeylessEcSignature.engineInitSign(keyVaultPrivateKey, null);
Assertions.assertArrayEquals(KeyVaultEncode.encodeByte(signedWithES256),
keyVaultKeylessEcSignature.engineSign());
+ keyVaultClient = new MockKeyVaultClient() {
+ @Override
+ public byte[] getSignedWithPrivateKey(String digestName, String digestValue, String keyId) {
+ return "ES384".equals(digestName) ? signedWithES384 : null;
+ }
+ };
keyVaultKeylessEcSignature = new KeyVaultKeylessEcSha384Signature();
keyVaultKeylessEcSignature.engineInitSign(keyVaultPrivateKey, null);
- when(keyVaultClient.getSignedWithPrivateKey(ArgumentMatchers.eq("ES384"), anyString(),
- ArgumentMatchers.eq(null))).thenReturn(signedWithES384);
assertArrayEquals(KeyVaultEncode.encodeByte(signedWithES384), keyVaultKeylessEcSignature.engineSign());
}
diff --git a/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/implementation/signature/KeyVaultKeylessRsaSsaPssSignatureTest.java b/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/implementation/signature/KeyVaultKeylessRsaSsaPssSignatureTest.java
index bda7ae92447b..946f3e35b843 100644
--- a/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/implementation/signature/KeyVaultKeylessRsaSsaPssSignatureTest.java
+++ b/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/implementation/signature/KeyVaultKeylessRsaSsaPssSignatureTest.java
@@ -3,12 +3,15 @@
package com.azure.security.keyvault.jca.implementation.signature;
-import com.azure.security.keyvault.jca.implementation.KeyVaultPrivateKey;
import com.azure.security.keyvault.jca.implementation.KeyVaultClient;
+import com.azure.security.keyvault.jca.implementation.KeyVaultPrivateKey;
+import com.azure.security.keyvault.jca.implementation.mocking.MockKeyVaultClient;
+import com.azure.security.keyvault.jca.implementation.mocking.MockPrivateKey;
+import com.azure.security.keyvault.jca.implementation.mocking.MockPublicKey;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import org.mockito.ArgumentMatchers;
+import java.nio.charset.StandardCharsets;
import java.security.InvalidAlgorithmParameterException;
import java.security.PrivateKey;
import java.security.PublicKey;
@@ -18,19 +21,15 @@
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
public class KeyVaultKeylessRsaSsaPssSignatureTest {
KeyVaultKeylessRsaSsaPssSignature keyVaultKeylessRsaSsaPssSignature;
- static final String KEY_VAULT_TEST_URI_GLOBAL = "https://fake.vault.azure.net/";
-
- private final KeyVaultClient keyVaultClient = mock(KeyVaultClient.class);
+ private final PublicKey publicKey = new MockPublicKey();
+ private final PrivateKey privateKey = new MockPrivateKey();
- private final KeyVaultPrivateKey keyVaultPrivateKey = mock(KeyVaultPrivateKey.class);
+ static final String KEY_VAULT_TEST_URI_GLOBAL = "https://fake.vault.azure.net/";
@BeforeEach
public void before() {
@@ -38,40 +37,6 @@ public void before() {
keyVaultKeylessRsaSsaPssSignature = new KeyVaultKeylessRsaSsaPssSignature();
}
- private final PublicKey publicKey = new PublicKey() {
- @Override
- public String getAlgorithm() {
- return null;
- }
-
- @Override
- public String getFormat() {
- return null;
- }
-
- @Override
- public byte[] getEncoded() {
- return new byte[0];
- }
- };
-
- private final PrivateKey privateKey = new PrivateKey() {
- @Override
- public String getAlgorithm() {
- return null;
- }
-
- @Override
- public String getFormat() {
- return null;
- }
-
- @Override
- public byte[] getEncoded() {
- return new byte[0];
- }
- };
-
@Test
public void engineInitVerifyTest() {
assertThrows(UnsupportedOperationException.class,
@@ -103,13 +68,17 @@ public void engineSetParameterTest() {
@Test
public void setDigestNameAndEngineSignTest() throws InvalidAlgorithmParameterException {
+ KeyVaultClient keyVaultClient = new MockKeyVaultClient() {
+ @Override
+ public byte[] getSignedWithPrivateKey(String digestName, String digestValue, String keyId) {
+ return "PS256".equals(digestName) ? "fakeValue".getBytes(StandardCharsets.UTF_8) : null;
+ }
+ };
+ KeyVaultPrivateKey keyVaultPrivateKey = new KeyVaultPrivateKey("algorithm", "kid", keyVaultClient);
keyVaultKeylessRsaSsaPssSignature = new KeyVaultKeylessRsaSsaPssSignature();
- when(keyVaultPrivateKey.getKeyVaultClient()).thenReturn(keyVaultClient);
keyVaultKeylessRsaSsaPssSignature.engineInitSign(keyVaultPrivateKey, null);
keyVaultKeylessRsaSsaPssSignature
.engineSetParameter(new PSSParameterSpec("SHA-1", "MGF1", MGF1ParameterSpec.SHA1, 20, 1));
- when(keyVaultClient.getSignedWithPrivateKey(ArgumentMatchers.eq("PS256"), anyString(),
- ArgumentMatchers.eq(null))).thenReturn("fakeValue".getBytes());
assertArrayEquals("fakeValue".getBytes(), keyVaultKeylessRsaSsaPssSignature.engineSign());
}
@@ -123,7 +92,8 @@ public void engineSetParameterWithNullParameterTest() {
@Test
public void engineSetParameterWithNotPSSParameterSpecTest() {
keyVaultKeylessRsaSsaPssSignature = new KeyVaultKeylessRsaSsaPssSignature();
- AlgorithmParameterSpec algorithmParameterSpec = mock(AlgorithmParameterSpec.class);
+ AlgorithmParameterSpec algorithmParameterSpec = new AlgorithmParameterSpec() {
+ };
assertThrows(InvalidAlgorithmParameterException.class,
() -> keyVaultKeylessRsaSsaPssSignature.engineSetParameter(algorithmParameterSpec));
}
diff --git a/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/implementation/utils/JsonConverterUtilTest.java b/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/implementation/utils/JsonConverterUtilTest.java
index 02fcb0ec516f..23c13f00f9b1 100644
--- a/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/implementation/utils/JsonConverterUtilTest.java
+++ b/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/implementation/utils/JsonConverterUtilTest.java
@@ -8,8 +8,7 @@
import com.azure.security.keyvault.jca.implementation.model.CertificateBundle;
import org.junit.jupiter.api.Test;
-import java.io.IOException;
-
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -27,9 +26,9 @@ public class JsonConverterUtilTest {
* Test the {@link JsonConverterUtil#fromJson(ReadValueCallback, String)} method.
*/
@Test
- public void testFromJson() throws IOException {
- String string = "{ \"cer\": \"cer\" }";
- CertificateBundle bundle = JsonConverterUtil.fromJson(CertificateBundle::fromJson, string);
+ public void testFromJson() {
+ CertificateBundle bundle
+ = assertDoesNotThrow(() -> JsonConverterUtil.fromJson(CertificateBundle::fromJson, "{\"cer\":\"cer\"}"));
assertNotNull(bundle);
assertEquals("cer", bundle.getCer());
@@ -41,23 +40,18 @@ public void testFromJson() throws IOException {
@Test
public void testToJson() {
CertificateBundle bundle = new CertificateBundle();
-
bundle.setCer("value");
String string = JsonConverterUtil.toJson(bundle);
- assertTrue(string.contains("cer"));
+ assertTrue(string.contains("\"cer\""));
assertTrue(string.contains("\"value\""));
}
@Test
void testFromJsonWithTokenResponseBody() {
- AccessToken accessToken;
- try {
- accessToken = JsonConverterUtil.fromJson(AccessToken::fromJson, DUMMY_TOKEN_RESPONSE_BODY);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
+ AccessToken accessToken
+ = assertDoesNotThrow(() -> JsonConverterUtil.fromJson(AccessToken::fromJson, DUMMY_TOKEN_RESPONSE_BODY));
assertNotNull(accessToken);
assertEquals("test_access_token_value", accessToken.getAccessToken());
}
From 8c9c5602044b0c2ced7f7bc8ae734c179e45ec10 Mon Sep 17 00:00:00 2001
From: alzimmermsft <48699787+alzimmermsft@users.noreply.github.com>
Date: Fri, 6 Feb 2026 15:26:45 -0500
Subject: [PATCH 3/7] Finalize work
---
.../jca/implementation/{mocking => }/MockKeyVaultClient.java | 0
1 file changed, 0 insertions(+), 0 deletions(-)
rename sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/implementation/{mocking => }/MockKeyVaultClient.java (100%)
diff --git a/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/implementation/mocking/MockKeyVaultClient.java b/sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/implementation/MockKeyVaultClient.java
similarity index 100%
rename from sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/implementation/mocking/MockKeyVaultClient.java
rename to sdk/keyvault/azure-security-keyvault-jca/src/test/java/com/azure/security/keyvault/jca/implementation/MockKeyVaultClient.java
From 32fa6fd5fb05e59b8566ecb70ac3f53b72932450 Mon Sep 17 00:00:00 2001
From: alzimmermsft <48699787+alzimmermsft@users.noreply.github.com>
Date: Fri, 6 Feb 2026 15:45:41 -0500
Subject: [PATCH 4/7] Remove Mockito
---
.../azure-security-keyvault-jca/pom.xml | 28 --
.../jca/implementation/KeyVaultClient.java | 33 +-
.../keyvault/jca/KeyVaultEncodeTest.java | 18 +-
.../implementation/KeyVaultClientTest.java | 351 +++++++++---------
.../implementation/MockKeyVaultClient.java | 4 +-
.../KeyVaultCertificatesTest.java | 2 +-
.../KeyVaultKeylessEcSignatureTest.java | 2 +-
...KeyVaultKeylessRsaSsaPssSignatureTest.java | 2 +-
8 files changed, 215 insertions(+), 225 deletions(-)
diff --git a/sdk/keyvault/azure-security-keyvault-jca/pom.xml b/sdk/keyvault/azure-security-keyvault-jca/pom.xml
index 078b5409ca46..f469d95f3476 100644
--- a/sdk/keyvault/azure-security-keyvault-jca/pom.xml
+++ b/sdk/keyvault/azure-security-keyvault-jca/pom.xml
@@ -55,34 +55,6 @@
slf4j-nop
1.7.36
-
-