40 #define LOG_TLS_FIELD_VERSION BIT_U64(0)
41 #define LOG_TLS_FIELD_SUBJECT BIT_U64(1)
42 #define LOG_TLS_FIELD_ISSUER BIT_U64(2)
43 #define LOG_TLS_FIELD_SERIAL BIT_U64(3)
44 #define LOG_TLS_FIELD_FINGERPRINT BIT_U64(4)
45 #define LOG_TLS_FIELD_NOTBEFORE BIT_U64(5)
46 #define LOG_TLS_FIELD_NOTAFTER BIT_U64(6)
47 #define LOG_TLS_FIELD_SNI BIT_U64(7)
48 #define LOG_TLS_FIELD_CERTIFICATE BIT_U64(8)
49 #define LOG_TLS_FIELD_CHAIN BIT_U64(9)
50 #define LOG_TLS_FIELD_SESSION_RESUMED BIT_U64(10)
51 #define LOG_TLS_FIELD_JA3 BIT_U64(11)
52 #define LOG_TLS_FIELD_JA3S BIT_U64(12)
53 #define LOG_TLS_FIELD_CLIENT BIT_U64(13)
54 #define LOG_TLS_FIELD_CLIENT_CERT BIT_U64(14)
55 #define LOG_TLS_FIELD_CLIENT_CHAIN BIT_U64(15)
56 #define LOG_TLS_FIELD_JA4 BIT_U64(16)
57 #define LOG_TLS_FIELD_SUBJECTALTNAME BIT_U64(17)
58 #define LOG_TLS_FIELD_CLIENT_ALPNS BIT_U64(18)
59 #define LOG_TLS_FIELD_SERVER_ALPNS BIT_U64(19)
60 #define LOG_TLS_FIELD_CLIENT_HANDSHAKE BIT_U64(20)
61 #define LOG_TLS_FIELD_SERVER_HANDSHAKE BIT_U64(21)
98 #define BASIC_FIELDS \
99 (LOG_TLS_FIELD_SUBJECT | \
100 LOG_TLS_FIELD_ISSUER | \
101 LOG_TLS_FIELD_SUBJECTALTNAME)
105 #define EXTENDED_FIELDS \
107 LOG_TLS_FIELD_VERSION | \
108 LOG_TLS_FIELD_SERIAL | \
109 LOG_TLS_FIELD_FINGERPRINT | \
110 LOG_TLS_FIELD_NOTBEFORE | \
111 LOG_TLS_FIELD_NOTAFTER | \
112 LOG_TLS_FIELD_JA3 | \
113 LOG_TLS_FIELD_JA3S | \
114 LOG_TLS_FIELD_JA4 | \
115 LOG_TLS_FIELD_CLIENT | \
116 LOG_TLS_FIELD_CLIENT_ALPNS | \
117 LOG_TLS_FIELD_SERVER_ALPNS | \
132 static void JsonTlsLogSubject(SCJsonBuilder *js,
SSLState *ssl_state)
136 SCJbSetString(js,
"subject",
"");
144 static void JsonTlsLogIssuer(SCJsonBuilder *js,
SSLState *ssl_state)
148 SCJbSetString(js,
"issuerdn",
"");
156 static void JsonTlsLogSAN(SCJsonBuilder *js,
SSLState *ssl_state)
159 SCJbOpenArray(js,
"subjectaltname");
168 static void JsonTlsLogSessionResumed(SCJsonBuilder *js,
SSLState *ssl_state)
177 SCJbSetBool(js,
"session_resumed",
true);
182 static void JsonTlsLogFingerprint(SCJsonBuilder *js,
SSLState *ssl_state)
189 static void JsonTlsLogSni(SCJsonBuilder *js,
SSLState *ssl_state)
192 SCJbSetStringFromBytes(
197 static void JsonTlsLogSerial(SCJsonBuilder *js,
SSLState *ssl_state)
205 static void JsonTlsLogVersion(SCJsonBuilder *js,
SSLState *ssl_state)
207 char ssl_version[SSL_VERSION_MAX_STRLEN];
214 SCJbSetString(js,
"version", ssl_version);
217 static void JsonTlsLogNotBefore(SCJsonBuilder *js,
SSLState *ssl_state)
224 static void JsonTlsLogNotAfter(SCJsonBuilder *js,
SSLState *ssl_state)
231 static void JsonTlsLogJa3Hash(SCJsonBuilder *js,
SSLState *ssl_state)
238 static void JsonTlsLogJa3String(SCJsonBuilder *js,
SSLState *ssl_state)
246 static void JsonTlsLogJa3(SCJsonBuilder *js,
SSLState *ssl_state)
251 SCJbOpenObject(js,
"ja3");
253 JsonTlsLogJa3Hash(js, ssl_state);
254 JsonTlsLogJa3String(js, ssl_state);
260 static void JsonTlsLogSCJA4(SCJsonBuilder *js,
SSLState *ssl_state)
264 uint8_t buffer[JA4_HEX_LEN];
266 SCJA4GetHash(ssl_state->
client_connp.
hs, (uint8_t(*)[JA4_HEX_LEN])buffer);
267 SCJbSetStringFromBytes(js,
"ja4", buffer, JA4_HEX_LEN);
272 static void JsonTlsLogJa3SHash(SCJsonBuilder *js,
SSLState *ssl_state)
279 static void JsonTlsLogJa3SString(SCJsonBuilder *js,
SSLState *ssl_state)
287 static void JsonTlsLogJa3S(SCJsonBuilder *js,
SSLState *ssl_state)
292 SCJbOpenObject(js,
"ja3s");
294 JsonTlsLogJa3SHash(js, ssl_state);
295 JsonTlsLogJa3SString(js, ssl_state);
301 static void JsonTlsLogAlpns(SCJsonBuilder *js,
SSLStateConnp *connp,
const char *
object)
303 if (connp->
hs == NULL) {
307 if (SCTLSHandshakeIsEmpty(connp->
hs)) {
310 SCTLSHandshakeLogALPNs(connp->
hs, js,
object);
313 static void JsonTlsLogCertificate(SCJsonBuilder *js,
SSLStateConnp *connp)
327 static void JsonTlsLogChain(SCJsonBuilder *js,
SSLStateConnp *connp)
333 SCJbOpenArray(js,
"chain");
350 static void JsonTlsLogClientCert(
351 SCJsonBuilder *js,
SSLStateConnp *connp,
const bool log_cert,
const bool log_chain)
355 SCJbSetString(js,
"subject",
"");
362 SCJbSetString(js,
"issuerdn",
"");
364 SCJbSetStringFromBytes(
378 SCJbSetString(js,
"notbefore", timebuf);
384 SCJbSetString(js,
"notafter", timebuf);
388 JsonTlsLogCertificate(js, connp);
391 JsonTlsLogChain(js, connp);
395 static void JsonTlsLogClientHandshake(SCJsonBuilder *js,
SSLState *ssl_state)
406 SCJbOpenObject(js,
"client_handshake");
416 static void JsonTlsLogServerHandshake(SCJsonBuilder *js,
SSLState *ssl_state)
426 SCJbOpenObject(js,
"server_handshake");
435 static void JsonTlsLogFields(SCJsonBuilder *js,
SSLState *ssl_state, uint64_t fields)
439 JsonTlsLogSubject(js, ssl_state);
443 JsonTlsLogIssuer(js, ssl_state);
447 JsonTlsLogSAN(js, ssl_state);
451 JsonTlsLogSessionResumed(js, ssl_state);
455 JsonTlsLogSerial(js, ssl_state);
459 JsonTlsLogFingerprint(js, ssl_state);
463 JsonTlsLogSni(js, ssl_state);
467 JsonTlsLogVersion(js, ssl_state);
472 JsonTlsLogNotBefore(js, ssl_state);
476 JsonTlsLogNotAfter(js, ssl_state);
488 JsonTlsLogJa3(js, ssl_state);
492 JsonTlsLogJa3S(js, ssl_state);
496 JsonTlsLogSCJA4(js, ssl_state);
499 JsonTlsLogAlpns(js, &ssl_state->
client_connp,
"client_alpns");
503 JsonTlsLogAlpns(js, &ssl_state->
server_connp,
"server_alpns");
508 JsonTlsLogClientHandshake(js, ssl_state);
512 JsonTlsLogServerHandshake(js, ssl_state);
518 SCJbOpenObject(js,
"client");
519 JsonTlsLogClientCert(js, &ssl_state->
client_connp, log_cert, log_chain);
528 SCJbOpenObject(tjs,
"tls");
530 return SCJbClose(tjs);
534 Flow *f,
void *state,
void *txptr, uint64_t tx_id)
557 SCJbOpenObject(js,
"tls");
559 JsonTlsLogFields(js, ssl_state, tls_ctx->
fields);
576 static TmEcode JsonTlsLogThreadInit(
ThreadVars *t,
const void *initdata,
void **data)
583 if (initdata == NULL) {
584 SCLogDebug(
"Error getting context for eve-log tls 'initdata' argument NULL");
646 for ( ; valid_fields->
name != NULL; valid_fields++) {
647 if (strcasecmp(field->
val, valid_fields->
name) == 0) {
661 if (session_resumption == NULL ||
SCConfValIsTrue(session_resumption)) {
668 SCLogWarning(
"Both 'certificate' and 'chain' contains the top "
669 "certificate, so only one of them should be enabled "
674 SCLogWarning(
"Both 'client_certificate' and 'client_chain' contains the top "
675 "certificate, so only one of them should be enabled "
681 SCLogConfig(
"enabling \"client\" as a dependency of \"client_certificate\"");
685 SCLogConfig(
"enabling \"client\" as a dependency of \"client_chain\"");
693 static void OutputTlsLogDeinitSub(
OutputCtx *output_ctx)
719 SCLogWarning(
"Both 'certificate' and 'chain' contains the top "
720 "certificate, so only one of them should be enabled "
724 output_ctx->
data = tls_ctx;
725 output_ctx->
DeInit = OutputTlsLogDeinitSub;
729 result.
ctx = output_ctx;