#define LOG_TLS_FIELD_NOTBEFORE (1 << 4)
#define LOG_TLS_FIELD_NOTAFTER (1 << 5)
#define LOG_TLS_FIELD_SNI (1 << 6)
+#define LOG_TLS_FIELD_CERTIFICATE (1 << 7)
+#define LOG_TLS_FIELD_CHAIN (1 << 8)
typedef struct {
char *name;
{ "not_before", LOG_TLS_FIELD_NOTBEFORE },
{ "not_after", LOG_TLS_FIELD_NOTAFTER },
{ "sni", LOG_TLS_FIELD_SNI },
+ { "certificate", LOG_TLS_FIELD_CERTIFICATE },
+ { "chain", LOG_TLS_FIELD_CHAIN },
{ NULL, -1 }
};
}
}
+static void JsonTlsLogCertificate(json_t *js, SSLState *ssl_state)
+{
+ if ((ssl_state->server_connp.cert_input == NULL) ||
+ (ssl_state->server_connp.cert_input_len == 0)) {
+ return;
+ }
+
+ SSLCertsChain *cert = TAILQ_FIRST(&ssl_state->server_connp.certs);
+ if (cert == NULL) {
+ return;
+ }
+
+ unsigned long len = cert->cert_len * 2;
+ uint8_t encoded[len];
+ if (Base64Encode(cert->cert_data, cert->cert_len, encoded, &len) ==
+ SC_BASE64_OK) {
+ json_object_set_new(js, "certificate", json_string((char *)encoded));
+ }
+}
+
+static void JsonTlsLogChain(json_t *js, SSLState *ssl_state)
+{
+ if ((ssl_state->server_connp.cert_input == NULL) ||
+ (ssl_state->server_connp.cert_input_len == 0)) {
+ return;
+ }
+
+ json_t *chain = json_array();
+ if (chain == NULL) {
+ return;
+ }
+
+ SSLCertsChain *cert;
+ TAILQ_FOREACH(cert, &ssl_state->server_connp.certs, next) {
+ unsigned long len = cert->cert_len * 2;
+ uint8_t encoded[len];
+ if (Base64Encode(cert->cert_data, cert->cert_len, encoded, &len) ==
+ SC_BASE64_OK) {
+ json_array_append_new(chain, json_string((char *)encoded));
+ }
+ }
+
+ json_object_set_new(js, "chain", chain);
+}
+
void JsonTlsLogJSONBasic(json_t *js, SSLState *ssl_state)
{
/* tls.subject */
/* tls.notafter */
if (tls_ctx->fields & LOG_TLS_FIELD_NOTAFTER)
JsonTlsLogNotAfter(js, ssl_state);
+
+ /* tls.certificate */
+ if (tls_ctx->fields & LOG_TLS_FIELD_CERTIFICATE)
+ JsonTlsLogCertificate(js, ssl_state);
+
+ /* tls.chain */
+ if (tls_ctx->fields & LOG_TLS_FIELD_CHAIN)
+ JsonTlsLogChain(js, ssl_state);
}
void JsonTlsLogJSONExtended(json_t *tjs, SSLState * state)
tls_ctx->file_ctx = ojc->file_ctx;
+ if ((tls_ctx->fields & LOG_TLS_FIELD_CERTIFICATE) &&
+ (tls_ctx->fields & LOG_TLS_FIELD_CHAIN)) {
+ SCLogWarning(SC_WARN_DUPLICATE_OUTPUT,
+ "Both 'certificate' and 'chain' contains the top "
+ "certificate, so only one of them should be enabled "
+ "at a time");
+ }
+
output_ctx->data = tls_ctx;
output_ctx->DeInit = OutputTlsLogDeinitSub;
extended: yes # enable this for extended logging information
# custom allows to control which tls fields that are included
# in eve-log
- #custom: [subject, issuer, fingerprint, sni, version, not_before, not_after]
+ #custom: [subject, issuer, fingerprint, sni, version, not_before, not_after, certificate, chain]
- files:
force-magic: no # force logging magic on all logged files
# force logging of checksums, available hash functions are md5,