if (sniServer)
Ssl::setClientSNI(ssl, sniServer);
}
+
+ if (Ssl::ServerBump *serverBump = csd->serverBump())
+ serverBump->attachServerSSL(ssl);
}
// If CertValidation Helper used do not lookup checklist for errors,
handleServerCertificate();
- if (ConnStateData *csd = request->clientConnectionManager.valid()) {
- if (Ssl::ServerBump *serverBump = csd->serverBump()) {
- // remember validation errors, if any
- if (Ssl::CertErrors *errs = static_cast<Ssl::CertErrors *>(SSL_get_ex_data(ssl, ssl_ex_index_ssl_errors)))
- serverBump->sslErrors = cbdataReference(errs);
- }
- }
-
if (Ssl::TheConfig.ssl_crt_validator) {
Ssl::CertValidationRequest validationRequest;
// WARNING: Currently we do not use any locking for any of the
{
Must(validationResponse != NULL);
- Ssl::CertErrors *errs = NULL;
Ssl::ErrorDetail *errDetails = NULL;
bool validatorFailed = false;
if (!Comm::IsConnOpen(serverConnection())) {
debugs(83,5, request->GetHost() << " cert validation result: " << validationResponse->resultCode);
- if (validationResponse->resultCode == ::Helper::Error)
- errs = sslCrtvdCheckForErrors(*validationResponse, errDetails);
- else if (validationResponse->resultCode != ::Helper::Okay)
+ if (validationResponse->resultCode == ::Helper::Error) {
+ if (Ssl::CertErrors *errs = sslCrtvdCheckForErrors(*validationResponse, errDetails)) {
+ SSL *ssl = fd_table[serverConnection()->fd].ssl;
+ Ssl::CertErrors *oldErrs = static_cast<Ssl::CertErrors*>(SSL_get_ex_data(ssl, ssl_ex_index_ssl_errors));
+ SSL_set_ex_data(ssl, ssl_ex_index_ssl_errors, (void *)errs);
+ delete oldErrs;
+ }
+ } else if (validationResponse->resultCode != ::Helper::Okay)
validatorFailed = true;
if (!errDetails && !validatorFailed) {
if (validatorFailed) {
anErr = new ErrorState(ERR_GATEWAY_FAILURE, Http::scInternalServerError, request.getRaw());
} else {
-
- // Check the list error with
- if (errDetails && request->clientConnectionManager.valid()) {
- // remember the server certificate from the ErrorDetail object
- if (Ssl::ServerBump *serverBump = request->clientConnectionManager->serverBump()) {
- // remember validation errors, if any
- if (errs) {
- if (serverBump->sslErrors)
- cbdataReferenceDone(serverBump->sslErrors);
- serverBump->sslErrors = cbdataReference(errs);
- }
- }
- }
-
anErr = new ErrorState(ERR_SECURE_CONNECT_FAIL, Http::scServiceUnavailable, request.getRaw());
anErr->detail = errDetails;
/*anErr->xerrno= Should preserved*/
if (request->clientConnectionManager.valid()) {
// remember the server certificate from the ErrorDetail object
- if (Ssl::ServerBump *serverBump = request->clientConnectionManager->serverBump()) {
+ if (Ssl::ServerBump *serverBump = request->clientConnectionManager->serverBump())
serverBump->serverCert.resetAndLock(anErr->detail->peerCert());
- // remember validation errors, if any
- if (Ssl::CertErrors *errs = static_cast<Ssl::CertErrors*>(SSL_get_ex_data(ssl, ssl_ex_index_ssl_errors)))
- serverBump->sslErrors = cbdataReference(errs);
- }
-
// For intercepted connections, set the host name to the server
// certificate CN. Otherwise, we just hope that CONNECT is using
// a user-entered address (a host name or a user-entered IP).
#include "squid.h"
#include "client_side.h"
+#include "globals.h"
#include "FwdState.h"
#include "ssl/ServerBump.h"
#include "Store.h"
Ssl::ServerBump::ServerBump(HttpRequest *fakeRequest, StoreEntry *e, Ssl::BumpMode md):
request(fakeRequest),
- sslErrors(NULL),
step(bumpStep1)
{
debugs(33, 4, HERE << "will peek at " << request->GetHost() << ':' << request->port);
storeUnregister(sc, entry, this);
entry->unlock("Ssl::ServerBump");
}
- cbdataReferenceDone(sslErrors);
}
+void
+Ssl::ServerBump::attachServerSSL(SSL *ssl)
+{
+ if (serverSSL.get())
+ return;
+
+ serverSSL.resetAndLock(ssl);
+}
+
+const Ssl::CertErrors *
+Ssl::ServerBump::sslErrors() const
+{
+ if (!serverSSL.get())
+ return NULL;
+
+ const Ssl::CertErrors *errs = static_cast<const Ssl::CertErrors*>(SSL_get_ex_data(serverSSL.get(), ssl_ex_index_ssl_errors));
+ return errs;
+}
public:
explicit ServerBump(HttpRequest *fakeRequest, StoreEntry *e = NULL, Ssl::BumpMode mode = Ssl::bumpServerFirst);
~ServerBump();
+ void attachServerSSL(SSL *); ///< Sets the server SSL object
+ const Ssl::CertErrors *sslErrors() const; ///< SSL [certificate validation] errors
/// faked, minimal request; required by Client API
HttpRequest::Pointer request;
StoreEntry *entry; ///< for receiving Squid-generated error messages
- Ssl::X509_Pointer serverCert; ///< HTTPS server certificate
- Ssl::CertErrors *sslErrors; ///< SSL [certificate validation] errors
+ /// HTTPS server certificate. Maybe it is different than the one
+ /// it is stored in serverSSL object (error SQUID_X509_V_ERR_CERT_CHANGE)
+ Ssl::X509_Pointer serverCert;
struct {
Ssl::BumpMode step1; ///< The SSL bump mode at step1
Ssl::BumpMode step2; ///< The SSL bump mode at step2
} act; ///< bumping actions at various bumping steps
Ssl::BumpStep step; ///< The SSL bumping step
SBuf clientSni; ///< the SSL client SNI name
+ Ssl::SSL_Pointer serverSSL; ///< The SSL object on server side.
private:
store_client *sc; ///< dummy client to prevent entry trimming