39 #define LOG_TLS_FIELD_VERSION BIT_U64(0)
40 #define LOG_TLS_FIELD_SUBJECT BIT_U64(1)
41 #define LOG_TLS_FIELD_ISSUER BIT_U64(2)
42 #define LOG_TLS_FIELD_SERIAL BIT_U64(3)
43 #define LOG_TLS_FIELD_FINGERPRINT BIT_U64(4)
44 #define LOG_TLS_FIELD_NOTBEFORE BIT_U64(5)
45 #define LOG_TLS_FIELD_NOTAFTER BIT_U64(6)
46 #define LOG_TLS_FIELD_SNI BIT_U64(7)
47 #define LOG_TLS_FIELD_CERTIFICATE BIT_U64(8)
48 #define LOG_TLS_FIELD_CHAIN BIT_U64(9)
49 #define LOG_TLS_FIELD_SESSION_RESUMED BIT_U64(10)
50 #define LOG_TLS_FIELD_JA3 BIT_U64(11)
51 #define LOG_TLS_FIELD_JA3S BIT_U64(12)
52 #define LOG_TLS_FIELD_CLIENT BIT_U64(13)
53 #define LOG_TLS_FIELD_CLIENT_CERT BIT_U64(14)
54 #define LOG_TLS_FIELD_CLIENT_CHAIN BIT_U64(15)
55 #define LOG_TLS_FIELD_JA4 BIT_U64(16)
56 #define LOG_TLS_FIELD_SUBJECTALTNAME BIT_U64(17)
57 #define LOG_TLS_FIELD_CLIENT_ALPNS BIT_U64(18)
58 #define LOG_TLS_FIELD_SERVER_ALPNS BIT_U64(19)
59 #define LOG_TLS_FIELD_CLIENT_HANDSHAKE BIT_U64(20)
60 #define LOG_TLS_FIELD_SERVER_HANDSHAKE BIT_U64(21)
97 #define BASIC_FIELDS \
98 (LOG_TLS_FIELD_SUBJECT | \
99 LOG_TLS_FIELD_ISSUER | \
100 LOG_TLS_FIELD_SUBJECTALTNAME)
104 #define EXTENDED_FIELDS \
106 LOG_TLS_FIELD_VERSION | \
107 LOG_TLS_FIELD_SERIAL | \
108 LOG_TLS_FIELD_FINGERPRINT | \
109 LOG_TLS_FIELD_NOTBEFORE | \
110 LOG_TLS_FIELD_NOTAFTER | \
111 LOG_TLS_FIELD_JA3 | \
112 LOG_TLS_FIELD_JA3S | \
113 LOG_TLS_FIELD_JA4 | \
114 LOG_TLS_FIELD_CLIENT | \
115 LOG_TLS_FIELD_CLIENT_ALPNS | \
116 LOG_TLS_FIELD_SERVER_ALPNS | \
135 SCJbSetString(js,
"subject",
"");
147 SCJbSetString(js,
"issuerdn",
"");
158 SCJbOpenArray(js,
"subjectaltname");
176 SCJbSetBool(js,
"session_resumed",
true);
191 SCJbSetStringFromBytes(
206 char ssl_version[SSL_VERSION_MAX_STRLEN];
213 SCJbSetString(js,
"version", ssl_version);
250 SCJbOpenObject(js,
"ja3");
252 JsonTlsLogJa3Hash(js, ssl_state);
253 JsonTlsLogJa3String(js, ssl_state);
263 uint8_t buffer[JA4_HEX_LEN];
265 SCJA4GetHash(ssl_state->
client_connp.
hs, (uint8_t(*)[JA4_HEX_LEN])buffer);
266 SCJbSetStringFromBytes(js,
"ja4", buffer, JA4_HEX_LEN);
291 SCJbOpenObject(js,
"ja3s");
293 JsonTlsLogJa3SHash(js, ssl_state);
294 JsonTlsLogJa3SString(js, ssl_state);
302 if (connp->
hs == NULL) {
306 if (SCTLSHandshakeIsEmpty(connp->
hs)) {
309 SCTLSHandshakeLogALPNs(connp->
hs, js,
object);
332 SCJbOpenArray(js,
"chain");
347 static void JsonTlsLogClientCert(
352 SCJbSetString(js,
"subject",
"");
359 SCJbSetString(js,
"issuerdn",
"");
361 SCJbSetStringFromBytes(
375 SCJbSetString(js,
"notbefore", timebuf);
381 SCJbSetString(js,
"notafter", timebuf);
385 JsonTlsLogCertificate(js, connp);
388 JsonTlsLogChain(js, connp);
403 SCJbOpenObject(js,
"client_handshake");
423 SCJbOpenObject(js,
"server_handshake");
436 JsonTlsLogSubject(js, ssl_state);
440 JsonTlsLogIssuer(js, ssl_state);
444 JsonTlsLogSAN(js, ssl_state);
448 JsonTlsLogSessionResumed(js, ssl_state);
452 JsonTlsLogSerial(js, ssl_state);
456 JsonTlsLogFingerprint(js, ssl_state);
460 JsonTlsLogSni(js, ssl_state);
464 JsonTlsLogVersion(js, ssl_state);
469 JsonTlsLogNotBefore(js, ssl_state);
473 JsonTlsLogNotAfter(js, ssl_state);
485 JsonTlsLogJa3(js, ssl_state);
489 JsonTlsLogJa3S(js, ssl_state);
493 JsonTlsLogSCJA4(js, ssl_state);
496 JsonTlsLogAlpns(js, &ssl_state->
client_connp,
"client_alpns");
500 JsonTlsLogAlpns(js, &ssl_state->
server_connp,
"server_alpns");
505 JsonTlsLogClientHandshake(js, ssl_state);
509 JsonTlsLogServerHandshake(js, ssl_state);
515 SCJbOpenObject(js,
"client");
516 JsonTlsLogClientCert(js, &ssl_state->
client_connp, log_cert, log_chain);
525 SCJbOpenObject(tjs,
"tls");
527 return SCJbClose(tjs);
531 Flow *
f,
void *state,
void *txptr, uint64_t tx_id)
554 SCJbOpenObject(js,
"tls");
556 JsonTlsLogFields(js, ssl_state, tls_ctx->
fields);
573 static TmEcode JsonTlsLogThreadInit(
ThreadVars *t,
const void *initdata,
void **data)
580 if (initdata == NULL) {
581 SCLogDebug(
"Error getting context for eve-log tls 'initdata' argument NULL");
643 for ( ; valid_fields->
name != NULL; valid_fields++) {
644 if (strcasecmp(field->
val, valid_fields->
name) == 0) {
658 if (session_resumption == NULL ||
SCConfValIsTrue(session_resumption)) {
665 SCLogWarning(
"Both 'certificate' and 'chain' contains the top "
666 "certificate, so only one of them should be enabled "
671 SCLogWarning(
"Both 'client_certificate' and 'client_chain' contains the top "
672 "certificate, so only one of them should be enabled "
678 SCLogConfig(
"enabling \"client\" as a dependency of \"client_certificate\"");
682 SCLogConfig(
"enabling \"client\" as a dependency of \"client_chain\"");
690 static void OutputTlsLogDeinitSub(
OutputCtx *output_ctx)
716 SCLogWarning(
"Both 'certificate' and 'chain' contains the top "
717 "certificate, so only one of them should be enabled "
721 output_ctx->
data = tls_ctx;
722 output_ctx->
DeInit = OutputTlsLogDeinitSub;
726 result.
ctx = output_ctx;
731 static bool TlsTxLogCondition(
744 OutputTlsLogInitSub,
ALPROTO_TLS, JsonTlsLogger, TlsTxLogCondition,
745 JsonTlsLogThreadInit, JsonTlsLogThreadDeinit);