%USER_CERT_xx SSL User certificate subject attribute xx
%USER_CA_xx SSL User certificate issuer attribute xx
%ssl::>sni SSL client SNI sent to Squid
+ %ssl::<cert_subject SSL server certificate DN
+ %ssl::<cert_issuer SSL server certificate issuer DN
%>{Header} HTTP request header "Header"
%>{Hdr:member}
format->header = xstrdup(token + 11);
} else if (strcmp(token, "%ssl::>sni") == 0)
format->type = Format::LFT_SSL_CLIENT_SNI;
+ else if (strcmp(token, "%ssl::<cert_subject") == 0)
+ format->type = Format::LFT_SSL_SERVER_CERT_SUBJECT;
+ else if (strcmp(token, "%ssl::<cert_issuer") == 0)
+ format->type = Format::LFT_SSL_SERVER_CERT_ISSUER;
#endif
#if USE_AUTH
else if (strcmp(token, "%EXT_USER") == 0 || strcmp(token, "%ue") == 0)
DUMP_EXT_ACL_TYPE_FMT(EXT_ACL_USER_CERT, " %%USER_CERT_%s", format->header);
DUMP_EXT_ACL_TYPE_FMT(EXT_ACL_USER_CA_CERT, " %%USER_CA_CERT_%s", format->header);
DUMP_EXT_ACL_TYPE_FMT(SSL_CLIENT_SNI, "ssl::>sni");
+ DUMP_EXT_ACL_TYPE_FMT(SSL_SERVER_CERT_SUBJECT, "%%ssl::<cert_subject");
+ DUMP_EXT_ACL_TYPE_FMT(SSL_SERVER_CERT_ISSUER, "%%ssl::<cert_issuer");
#endif
#if USE_AUTH
DUMP_EXT_ACL_TYPE_FMT(USER_EXTERNAL," %%ue");
}
}
break;
+
+ case Format::LFT_SSL_SERVER_CERT_SUBJECT:
+ case Format::LFT_SSL_SERVER_CERT_ISSUER: {
+ X509 *serverCert = NULL;
+ if (ch->serverCert.get())
+ serverCert = ch->serverCert.get();
+ else if (ch->conn()->serverBump())
+ serverCert = ch->conn()->serverBump()->serverCert.get();
+
+ if (serverCert) {
+ if (format->type == Format::LFT_SSL_SERVER_CERT_SUBJECT)
+ str = Ssl::GetX509UserAttribute(serverCert, "DN");
+ else
+ str = Ssl::GetX509CAAttribute(serverCert, "DN");
+ }
+ break;
+ }
+
#endif
#if USE_AUTH
case Format::LFT_USER_EXTERNAL:
bool
Ssl::PeerConnector::checkForPeekAndSplice(bool checkDone, Ssl::BumpMode peekMode)
{
+ SSL *ssl = fd_table[serverConn->fd].ssl;
// Mark Step3 of bumping
if (request->clientConnectionManager.valid()) {
if (Ssl::ServerBump *serverBump = request->clientConnectionManager->serverBump()) {
serverBump->step = Ssl::bumpStep3;
+ if (!serverBump->serverCert.get())
+ serverBump->serverCert.reset(SSL_get_peer_certificate(ssl));
}
}
acl_checklist->nonBlockingCheck(Ssl::PeerConnector::cbCheckForPeekAndSplice, this);
return false;
}
-
- SSL *ssl = fd_table[serverConn->fd].ssl;
+
BIO *b = SSL_get_rbio(ssl);
Ssl::ServerBio *srvBio = static_cast<Ssl::ServerBio *>(b->ptr);
debugs(83,5, "Will check for peek and splice on fd " << serverConn->fd);