Skip to content

Commit 0a48490

Browse files
authored
Added flag to export site report to JSON file (#238)
* Added flag to export site report to JSON file
1 parent 66f01c1 commit 0a48490

File tree

4 files changed

+119
-0
lines changed

4 files changed

+119
-0
lines changed

Scanner-Core/src/main/java/de/rub/nds/scanner/core/config/ScannerConfig.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ public abstract class ScannerConfig extends TLSDelegateConfig {
2828
@Parameter(names = "-reportDetail", required = false, description = "How detailed do you want the report to be?")
2929
private ScannerDetail reportDetail = ScannerDetail.NORMAL;
3030

31+
@Parameter(names = "-outputFile", required = false,
32+
description = "Specify a file to write the site report in JSON to")
33+
private String outputFile = null;
34+
3135
@Parameter(names = "-probeTimeout", required = false,
3236
description = "The timeout for each probe in ms (default 1800000)")
3337
private int probeTimeout = 1800000;
@@ -81,4 +85,16 @@ public int getProbeTimeout() {
8185
public void setProbeTimeout(int probeTimeout) {
8286
this.probeTimeout = probeTimeout;
8387
}
88+
89+
public boolean isWriteReportToFile() {
90+
return outputFile != null;
91+
}
92+
93+
public String getOutputFile() {
94+
return outputFile;
95+
}
96+
97+
public void setOutputFile(String outputFile) {
98+
this.outputFile = outputFile;
99+
}
84100
}

TLS-Server-Scanner/src/main/java/de/rub/nds/tlsscanner/serverscanner/Main.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
import de.rub.nds.tlsscanner.serverscanner.config.ServerScannerConfig;
1919
import de.rub.nds.tlsscanner.serverscanner.execution.TlsServerScanner;
2020
import de.rub.nds.tlsscanner.serverscanner.report.ServerReport;
21+
import de.rub.nds.tlsscanner.serverscanner.report.ServerReportSerializer;
22+
import java.io.File;
2123
import java.io.IOException;
2224
import org.apache.logging.log4j.LogManager;
2325
import org.apache.logging.log4j.Logger;
@@ -45,6 +47,10 @@ public static void main(String[] args) throws IOException {
4547
ConsoleLogger.CONSOLE
4648
.info(AnsiColor.RESET.getCode() + "Scanned in: " + ((System.currentTimeMillis() - time) / 1000)
4749
+ "s\n" + report.getFullReport(config.getReportDetail(), !config.isNoColor()));
50+
if (config.isWriteReportToFile()) {
51+
File outputFile = new File(config.getOutputFile());
52+
ServerReportSerializer.serialize(outputFile, report);
53+
}
4854
} catch (ConfigurationException e) {
4955
LOGGER.error("Encountered a ConfigurationException aborting.", e);
5056
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/**
2+
* TLS-Server-Scanner - A TLS configuration and analysis tool based on TLS-Attacker
3+
*
4+
* Copyright 2017-2022 Ruhr University Bochum, Paderborn University, Hackmanit GmbH
5+
*
6+
* Licensed under Apache License, Version 2.0
7+
* http://www.apache.org/licenses/LICENSE-2.0.txt
8+
*/
9+
10+
package de.rub.nds.tlsscanner.serverscanner.converter;
11+
12+
import com.fasterxml.jackson.core.JsonGenerator;
13+
import com.fasterxml.jackson.databind.SerializerProvider;
14+
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
15+
import de.rub.nds.asn1.model.Asn1Field;
16+
import de.rub.nds.modifiablevariable.util.ArrayConverter;
17+
import java.io.IOException;
18+
19+
public class Asn1FieldSerializer extends StdSerializer<Asn1Field> {
20+
21+
public Asn1FieldSerializer() {
22+
super(Asn1Field.class);
23+
}
24+
25+
@Override
26+
public void serialize(Asn1Field asn1Field, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
27+
throws IOException {
28+
jsonGenerator.writeStartObject();
29+
jsonGenerator.writeStringField("Asn1Field",
30+
ArrayConverter.bytesToHexString(asn1Field.getSerializer().serialize(), false));
31+
jsonGenerator.writeEndObject();
32+
}
33+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/**
2+
* TLS-Server-Scanner - A TLS configuration and analysis tool based on TLS-Attacker
3+
*
4+
* Copyright 2017-2022 Ruhr University Bochum, Paderborn University, Hackmanit GmbH
5+
*
6+
* Licensed under Apache License, Version 2.0
7+
* http://www.apache.org/licenses/LICENSE-2.0.txt
8+
*/
9+
10+
package de.rub.nds.tlsscanner.serverscanner.report;
11+
12+
import com.fasterxml.jackson.annotation.JsonFormat;
13+
import com.fasterxml.jackson.databind.ObjectMapper;
14+
import com.fasterxml.jackson.databind.SerializationFeature;
15+
import com.fasterxml.jackson.databind.module.SimpleModule;
16+
import com.fasterxml.jackson.databind.ser.std.ByteArraySerializer;
17+
import de.rub.nds.scanner.core.report.ScanReport;
18+
import de.rub.nds.tlsscanner.serverscanner.converter.Asn1CertificateSerializer;
19+
import de.rub.nds.tlsscanner.serverscanner.converter.Asn1FieldSerializer;
20+
import de.rub.nds.tlsscanner.serverscanner.converter.CertificateSerializer;
21+
import de.rub.nds.tlsscanner.serverscanner.converter.CustomDhPublicKeySerializer;
22+
import de.rub.nds.tlsscanner.serverscanner.converter.CustomDsaPublicKeySerializer;
23+
import de.rub.nds.tlsscanner.serverscanner.converter.CustomEcPublicKeySerializer;
24+
import de.rub.nds.tlsscanner.serverscanner.converter.CustomRsaPublicKeySerializer;
25+
import de.rub.nds.tlsscanner.serverscanner.converter.HttpsHeaderSerializer;
26+
import de.rub.nds.tlsscanner.serverscanner.converter.PointSerializer;
27+
import de.rub.nds.tlsscanner.serverscanner.converter.ResponseFingerprintSerializer;
28+
import de.rub.nds.tlsscanner.serverscanner.converter.VectorSerializer;
29+
import java.io.File;
30+
import java.io.IOException;
31+
import java.math.BigDecimal;
32+
import org.apache.logging.log4j.LogManager;
33+
34+
public class ServerReportSerializer {
35+
36+
private static final org.apache.logging.log4j.Logger LOGGER = LogManager.getLogger();
37+
38+
public static void serialize(File outputFile, ScanReport scanReport) {
39+
try {
40+
ObjectMapper mapper = new ObjectMapper();
41+
42+
SimpleModule module = new SimpleModule();
43+
module.addSerializer(new ByteArraySerializer());
44+
module.addSerializer(new ResponseFingerprintSerializer());
45+
module.addSerializer(new CertificateSerializer());
46+
module.addSerializer(new Asn1CertificateSerializer());
47+
module.addSerializer(new CustomDhPublicKeySerializer());
48+
module.addSerializer(new CustomEcPublicKeySerializer());
49+
module.addSerializer(new CustomRsaPublicKeySerializer());
50+
module.addSerializer(new CustomDsaPublicKeySerializer());
51+
module.addSerializer(new VectorSerializer());
52+
module.addSerializer(new PointSerializer());
53+
module.addSerializer(new HttpsHeaderSerializer());
54+
module.addSerializer(new Asn1FieldSerializer());
55+
56+
mapper.registerModule(module);
57+
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
58+
mapper.configOverride(BigDecimal.class).setFormat(JsonFormat.Value.forShape(JsonFormat.Shape.STRING));
59+
mapper.writeValue(outputFile, scanReport);
60+
} catch (IOException ex) {
61+
LOGGER.error(ex);
62+
}
63+
}
64+
}

0 commit comments

Comments
 (0)