⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ssl_engine_ext.c

📁 mod_ssl-2.8.31-1.3.41.tar.gz 好用的ssl工具
💻 C
📖 第 1 页 / 共 2 页
字号:
static int ssl_ext_mp_canon(request_rec *r, char *url){    int rc;    if (strcEQn(url, "https:", 6)) {        rc = OK;        ap_hook_call("ap::mod_proxy::http::canon",                     &rc, r, url+6, "https", DEFAULT_HTTPS_PORT);        return rc;    }    return DECLINED;}static int ssl_ext_mp_handler(    request_rec *r, void *cr, char *url, char *proxyhost, int proxyport, char *protocol){    int rc;    if (strcEQ(protocol, "https")) {        ap_ctx_set(r->ctx, "ssl::proxy::enabled", PTRUE);        ap_hook_call("ap::mod_proxy::http::handler",                     &rc, r, cr, url, proxyhost, proxyport);        return rc;    }    else {        ap_ctx_set(r->ctx, "ssl::proxy::enabled", PFALSE);    }    return DECLINED;}static int ssl_ext_mp_set_destport(request_rec *r){    if (ap_ctx_get(r->ctx, "ssl::proxy::enabled") == PTRUE)        return DEFAULT_HTTPS_PORT;    else        return DEFAULT_HTTP_PORT;}static char *ssl_ext_mp_new_connection(request_rec *r, BUFF *fb, char *peer){#ifndef SSL_EXPERIMENTAL_PROXY    SSL_CTX *ssl_ctx;#endif    SSL *ssl;    char *errmsg;    int rc;    char *cpVHostID;    char *cpVHostMD5;#ifdef SSL_EXPERIMENTAL_PROXY    SSLSrvConfigRec *sc;    char *cp;#endif    if (ap_ctx_get(r->ctx, "ssl::proxy::enabled") == PFALSE)        return NULL;    /*     * Find context     */#ifdef SSL_EXPERIMENTAL_PROXY    sc = mySrvConfig(r->server);#endif    cpVHostID = ssl_util_vhostid(r->pool, r->server);    /*     * Create a SSL context and handle     */#ifdef SSL_EXPERIMENTAL_PROXY    ssl = SSL_new(sc->pSSLProxyCtx);#else    ssl_ctx = SSL_CTX_new(SSLv23_client_method());    ssl = SSL_new(ssl_ctx);#endif    if (ssl == NULL) {        errmsg = ap_psprintf(r->pool, "SSL proxy new failed (%s): peer %s: %s",                             cpVHostID, peer, ERR_reason_error_string(ERR_get_error()));        ap_ctx_set(fb->ctx, "ssl", NULL);        return errmsg;    }    SSL_clear(ssl);    cpVHostMD5 = ap_md5(r->pool, (unsigned char *)cpVHostID);    if (!SSL_set_session_id_context(ssl, (unsigned char *)cpVHostMD5, strlen(cpVHostMD5))) {        errmsg = ap_psprintf(r->pool, "Unable to set session id context to `%s': peer %s: %s",                             cpVHostMD5, peer, ERR_reason_error_string(ERR_get_error()));        ap_ctx_set(fb->ctx, "ssl", NULL);        return errmsg;    }    SSL_set_fd(ssl, fb->fd);#ifdef SSL_EXPERIMENTAL_PROXY    SSL_set_app_data(ssl, fb->ctx);#endif    ap_ctx_set(fb->ctx, "ssl", ssl);#ifdef SSL_EXPERIMENTAL_PROXY    ap_ctx_set(fb->ctx, "ssl::proxy::server_rec", r->server);    ap_ctx_set(fb->ctx, "ssl::proxy::peer", peer);    ap_ctx_set(fb->ctx, "ssl::proxy::servername", cpVHostID);    ap_ctx_set(fb->ctx, "ssl::proxy::verifyerror", NULL);#endif    /*     * Give us a chance to gracefully close the connection     */    ap_register_cleanup(r->pool, (void *)fb,                        ssl_ext_mp_close_connection, ssl_ext_mp_close_connection);    /*     * Establish the SSL connection     */    if ((rc = SSL_connect(ssl)) <= 0) {#ifdef SSL_EXPERIMENTAL_PROXY        if ((cp = (char *)ap_ctx_get(fb->ctx, "ssl::proxy::verifyerror")) != NULL) {            SSL_set_shutdown(ssl, SSL_RECEIVED_SHUTDOWN);             SSL_smart_shutdown(ssl);            SSL_free(ssl);            ap_ctx_set(fb->ctx, "ssl", NULL);            ap_bsetflag(fb, B_EOF|B_EOUT, 1);            return NULL;        }#endif        errmsg = ap_psprintf(r->pool, "SSL proxy connect failed (%s): peer %s: %s",                             cpVHostID, peer, ERR_reason_error_string(ERR_get_error()));        ssl_log(r->server, SSL_LOG_ERROR, "%s", errmsg);        SSL_free(ssl);        ap_ctx_set(fb->ctx, "ssl", NULL);        return errmsg;    }    return NULL;}static void ssl_ext_mp_close_connection(void *_fb){    BUFF *fb = _fb;    SSL *ssl;#ifndef SSL_EXPERIMENTAL_PROXY    SSL_CTX *ctx;#endif    ssl = ap_ctx_get(fb->ctx, "ssl");    if (ssl != NULL) {#ifndef SSL_EXPERIMENTAL_PROXY        ctx = SSL_get_SSL_CTX(ssl);#endif        SSL_set_shutdown(ssl, SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN);        SSL_smart_shutdown(ssl);        SSL_free(ssl);        ap_ctx_set(fb->ctx, "ssl", NULL);#ifndef SSL_EXPERIMENTAL_PROXY        if (ctx != NULL)            SSL_CTX_free(ctx);#endif    }    return;}static int ssl_ext_mp_write_host_header(    request_rec *r, BUFF *fb, char *host, int port, char *portstr){    if (ap_ctx_get(r->ctx, "ssl::proxy::enabled") == PFALSE)        return DECLINED;    if (portstr != NULL && port != DEFAULT_HTTPS_PORT) {        ap_bvputs(fb, "Host: ", host, ":", portstr, "\r\n", NULL);        return OK;    }    return DECLINED;}#ifdef SSL_EXPERIMENTAL_PROXY/*  * Callback for client certificate stuff. * If the remote site sent us a SSLv3 list of acceptable CA's then trawl the * table of client certs and send the first one that matches. */static int ssl_ext_mp_clientcert_cb(SSL *ssl, X509 **x509, EVP_PKEY **pkey) {    SSLSrvConfigRec *sc;    X509_NAME *xnx;    X509_NAME *issuer;    X509_INFO *xi;    char *peer;    char *servername;    server_rec *s;    ap_ctx *pCtx;    STACK_OF(X509_NAME) *sk;    STACK_OF(X509_INFO) *pcerts;    char *cp;    int i, j;        pCtx       = (ap_ctx *)SSL_get_app_data(ssl);    s          = ap_ctx_get(pCtx, "ssl::proxy::server_rec");    peer       = ap_ctx_get(pCtx, "ssl::proxy::peer");    servername = ap_ctx_get(pCtx, "ssl::proxy::servername");    sc         = mySrvConfig(s);    pcerts     = sc->skProxyClientCerts;    ssl_log(s, SSL_LOG_DEBUG,             "Proxy client certificate callback: (%s) entered", servername);    if ((pcerts == NULL) || (sk_X509_INFO_num(pcerts) <= 0)) {        ssl_log(s, SSL_LOG_TRACE,                "Proxy client certificate callback: (%s) "                "site wanted client certificate but none available",                 servername);        return 0;    }                                                                         sk = SSL_get_client_CA_list(ssl);    if ((sk == NULL) || (sk_X509_NAME_num(sk) <= 0)) {        /*          * remote site didn't send us a list of acceptable CA certs,          * so lets send the first one we came across          */           xi = sk_X509_INFO_value(pcerts, 0);        cp = X509_NAME_oneline(X509_get_subject_name(xi->x509), NULL, 0);        ssl_log(s, SSL_LOG_DEBUG,                "SSL Proxy: (%s) no acceptable CA list, sending %s",                 servername, cp != NULL ? cp : "-unknown-");        OPENSSL_free(cp);        /* export structures to the caller */        *x509 = xi->x509;        *pkey = xi->x_pkey->dec_pkey;        /* prevent OpenSSL freeing these structures */        CRYPTO_add(&((*x509)->references), +1, CRYPTO_LOCK_X509_PKEY);        CRYPTO_add(&((*pkey)->references), +1, CRYPTO_LOCK_X509_PKEY);        return 1;    }             for (i = 0; i < sk_X509_NAME_num(sk); i++) {        xnx = sk_X509_NAME_value(sk, i);        for (j = 0; j < sk_X509_INFO_num(pcerts); j++) {            xi = sk_X509_INFO_value(pcerts,j);            issuer = X509_get_issuer_name(xi->x509);            if (X509_NAME_cmp(issuer, xnx) == 0) {                cp = X509_NAME_oneline(X509_get_subject_name(xi->x509), NULL, 0);                ssl_log(s, SSL_LOG_DEBUG, "SSL Proxy: (%s) sending %s",                         servername, cp != NULL ? cp : "-unknown-");                OPENSSL_free(cp);                /* export structures to the caller */                *x509 = xi->x509;                *pkey = xi->x_pkey->dec_pkey;                /* prevent OpenSSL freeing these structures */                CRYPTO_add(&((*x509)->references), +1, CRYPTO_LOCK_X509_PKEY);                CRYPTO_add(&((*pkey)->references), +1, CRYPTO_LOCK_X509_PKEY);                return 1;            }        }    }    ssl_log(s, SSL_LOG_TRACE,            "Proxy client certificate callback: (%s) "            "no client certificate found!?", servername);    return 0; }/* * This is the verify callback when we are connecting to a remote SSL server * from the proxy. Information is passed in via the SSL "ctx" app_data * mechanism. We pass in an Apache context in this field, which contains * server_rec of the server making the proxy connection from the * "ssl::proxy::server_rec" context. * * The result of the verification is passed back out to SSLERR via the return * value. We also store the error message in the "proxyverifyfailed" context, * so the caller of SSL_connect() can log a detailed error message. */static int ssl_ext_mp_verify_cb(int ok, X509_STORE_CTX *ctx){    SSLSrvConfigRec *sc;    X509 *xs;    int errnum;    int errdepth;    char *cp, *cp2;    ap_ctx *pCtx;    server_rec *s;    SSL *ssl;    char *peer;    char *servername;    ssl        = (SSL *)X509_STORE_CTX_get_app_data(ctx);    pCtx       = (ap_ctx *)SSL_get_app_data(ssl);    s          = ap_ctx_get(pCtx, "ssl::proxy::server_rec");    peer       = ap_ctx_get(pCtx, "ssl::proxy::peer");    servername = ap_ctx_get(pCtx, "ssl::proxy::servername");    sc         = mySrvConfig(s);    /*     * Unless stated otherwise by the configuration, we really don't     * care if the verification was okay or not, so lets return now     * before we do anything involving memory or time.     */    if (sc->bProxyVerify == FALSE)        return ok;                         /*     * Get verify ingredients     */    xs       = X509_STORE_CTX_get_current_cert(ctx);    errnum   = X509_STORE_CTX_get_error(ctx);    errdepth = X509_STORE_CTX_get_error_depth(ctx);    /*      * Log verification information     */    cp  = X509_NAME_oneline(X509_get_subject_name(xs), NULL, 0);    cp2 = X509_NAME_oneline(X509_get_issuer_name(xs),  NULL, 0);    ssl_log(s, SSL_LOG_DEBUG,            "SSL Proxy: (%s) Certificate Verification for remote server %s: "            "depth: %d, subject: %s, issuer: %s",             servername, peer != NULL ? peer : "-unknown-",            errdepth, cp != NULL ? cp : "-unknown-",             cp2 != NULL ? cp2 : "-unknown");    OPENSSL_free(cp);    OPENSSL_free(cp2);    /*     * If we already know it's not ok, log the real reason     */    if (!ok) {        ssl_log(s, SSL_LOG_ERROR,                "SSL Proxy: (%s) Certificate Verification failed for %s: "                "Error (%d): %s", servername,                peer != NULL ? peer : "-unknown-",                errnum, X509_verify_cert_error_string(errnum));        ap_ctx_set(pCtx, "ssl::proxy::verifyerror",                    (void *)X509_verify_cert_error_string(errnum));        return ok;    }    /*     * Check the depth of the certificate chain     */    if (sc->nProxyVerifyDepth > 0) {        if (errdepth > sc->nProxyVerifyDepth) {            ssl_log(s, SSL_LOG_ERROR,                "SSL Proxy: (%s) Certificate Verification failed for %s: "                "Certificate Chain too long "                "(chain has %d certificates, but maximum allowed are only %d)",                 servername, peer, errdepth, sc->nProxyVerifyDepth);            ap_ctx_set(pCtx, "ssl::proxy::verifyerror",                       (void *)X509_verify_cert_error_string(X509_V_ERR_CERT_CHAIN_TOO_LONG));            ok = FALSE;        }    }    /*     * And finally signal OpenSSL the (perhaps changed) state     */    return (ok);}#endif /* SSL_EXPERIMENTAL_PROXY *//*  _________________________________________________________________****  SSL Extension to mod_status**  _________________________________________________________________*/static void ssl_ext_ms_display(request_rec *, int, int);static void ssl_ext_ms_register(void){    ap_hook_register("ap::mod_status::display", ssl_ext_ms_display, AP_HOOK_NOCTX);    return;}static void ssl_ext_ms_unregister(void){    ap_hook_unregister("ap::mod_status::display", ssl_ext_ms_display);    return;}static void ssl_ext_ms_display_cb(char *str, void *_r){    request_rec *r = (request_rec *)_r;    if (str != NULL)        ap_rputs(str, r);    return;}static void ssl_ext_ms_display(request_rec *r, int no_table_report, int short_report){    SSLSrvConfigRec *sc = mySrvConfig(r->server);    if (sc == NULL)        return;    if (short_report)        return;    ap_rputs("<hr>\n", r);    ap_rputs("<table cellspacing=0 cellpadding=0>\n", r);    ap_rputs("<tr><td bgcolor=\"#000000\">\n", r);    ap_rputs("<b><font color=\"#ffffff\" face=\"Arial,Helvetica\">SSL/TLS Session Cache Status:</font></b>\r", r);    ap_rputs("</td></tr>\n", r);    ap_rputs("<tr><td bgcolor=\"#ffffff\">\n", r);    ssl_scache_status(r->server, r->pool, ssl_ext_ms_display_cb, r);    ap_rputs("</td></tr>\n", r);    ap_rputs("</table>\n", r);    return;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -