Skip to content

Commit f03fc1e

Browse files
committed
Log registered TLS providers on attach
Logs the providers registered for SSLContext.TLS in priority order when the agent loads, helping diagnose cases where an unsupported provider is active. Warns if the first (active) provider is not known to this tool. Test coverage added to the integration test suite via check_provider_logs, which asserts the log line is present after each server start.
1 parent 1ddcc13 commit f03fc1e

2 files changed

Lines changed: 36 additions & 0 deletions

File tree

src/main/java/name/neykov/secrets/agent/AgentMain.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import java.net.MalformedURLException;
99
import java.net.URISyntaxException;
1010
import java.net.URL;
11+
import java.security.Provider;
12+
import java.security.Security;
1113
import java.util.Collections;
1214
import java.util.HashMap;
1315
import java.util.HashSet;
@@ -17,6 +19,7 @@
1719
import java.util.logging.Level;
1820
import java.util.logging.Logger;
1921
import javax.net.ssl.SSLEngine;
22+
import name.neykov.secrets.Java6Compat;
2023

2124
/** Entry point of the agent. Loaded in the "App" class loader */
2225
public class AgentMain {
@@ -150,6 +153,8 @@ private static void attach(String agentArgs, Instrumentation inst, File jarFile)
150153

151154
inst.addTransformer(new Transformer(), true);
152155

156+
logSecurityProviders();
157+
153158
log.info(
154159
"Successfully attached agent "
155160
+ jarFile
@@ -158,6 +163,28 @@ private static void attach(String agentArgs, Instrumentation inst, File jarFile)
158163
+ ". ");
159164
}
160165

166+
private static void logSecurityProviders() {
167+
Provider[] sslProviders = Security.getProviders("SSLContext.TLS");
168+
if (sslProviders == null || sslProviders.length == 0) {
169+
log.warning("No provider found for SSLContext.TLS — TLS secrets will not be captured.");
170+
return;
171+
}
172+
String[] names = new String[sslProviders.length];
173+
for (int i = 0; i < sslProviders.length; i++) {
174+
names[i] = sslProviders[i].getName() + " " + sslProviders[i].getVersion();
175+
}
176+
log.info("Registered TLS providers: " + Java6Compat.join(", ", names));
177+
178+
String activeSslProvider = sslProviders[0].getName();
179+
if (!activeSslProvider.equals("SunJSSE") && !activeSslProvider.equals("BCJSSE")) {
180+
log.warning(
181+
"TLS provider '"
182+
+ activeSslProvider
183+
+ "' is not supported by this tool."
184+
+ " TLS secrets will not be captured.");
185+
}
186+
}
187+
161188
private static void openBaseModule(Instrumentation inst) {
162189
Method getModule;
163190
try {

src/test/docker/test.sh

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,15 @@ start_server() {
115115
docker exec ssl-secrets-server java -jar /project/$JAR_PATH list
116116
docker exec ssl-secrets-server java -jar /project/$JAR_PATH 1 /secrets/server.keys
117117
fi
118+
check_provider_logs "$provider" "$INJECT_TYPE"
119+
}
120+
121+
# Assert agent logged expected security provider diagnostics.
122+
# Usage: check_provider_logs <provider> <inject_type>
123+
check_provider_logs() {
124+
local provider="$1" inject_type="$2"
125+
local ssl_provider
126+
wait_for_log ssl-secrets-server "Registered TLS providers"
118127
}
119128

120129
# Verify that a captured pcap can be decrypted using the given keylog file.

0 commit comments

Comments
 (0)