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

📄 ssl_engine_vars.c

📁 Apache官方在今天放出产品系列2.2的最新版本2.2.11的源码包 最流行的HTTP服务器软件之一
💻 C
📖 第 1 页 / 共 2 页
字号:
/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements.  See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License.  You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *//*                      _             _ *  _ __ ___   ___   __| |    ___ ___| |  mod_ssl * | '_ ` _ \ / _ \ / _` |   / __/ __| |  Apache Interface to OpenSSL * | | | | | | (_) | (_| |   \__ \__ \ | * |_| |_| |_|\___/ \__,_|___|___/___/_| *                      |_____| *  ssl_engine_vars.c *  Variable Lookup Facility */                             /* ``Those of you who think they                                  know everything are very annoying                                  to those of us who do.''                                                  -- Unknown       */#include "ssl_private.h"#include "mod_ssl.h"#include "apr_time.h"/*  _________________________________________________________________****  Variable Lookup**  _________________________________________________________________*/static char *ssl_var_lookup_ssl(apr_pool_t *p, conn_rec *c, char *var);static char *ssl_var_lookup_ssl_cert(apr_pool_t *p, X509 *xs, char *var);static char *ssl_var_lookup_ssl_cert_dn(apr_pool_t *p, X509_NAME *xsname, char *var);static char *ssl_var_lookup_ssl_cert_valid(apr_pool_t *p, ASN1_UTCTIME *tm);static char *ssl_var_lookup_ssl_cert_remain(apr_pool_t *p, ASN1_UTCTIME *tm);static char *ssl_var_lookup_ssl_cert_serial(apr_pool_t *p, X509 *xs);static char *ssl_var_lookup_ssl_cert_chain(apr_pool_t *p, STACK_OF(X509) *sk, char *var);static char *ssl_var_lookup_ssl_cert_PEM(apr_pool_t *p, X509 *xs);static char *ssl_var_lookup_ssl_cert_verify(apr_pool_t *p, conn_rec *c);static char *ssl_var_lookup_ssl_cipher(apr_pool_t *p, conn_rec *c, char *var);static void  ssl_var_lookup_ssl_cipher_bits(SSL *ssl, int *usekeysize, int *algkeysize);static char *ssl_var_lookup_ssl_version(apr_pool_t *p, char *var);static char *ssl_var_lookup_ssl_compress_meth(SSL *ssl);static int ssl_is_https(conn_rec *c){    SSLConnRec *sslconn = myConnConfig(c);    return sslconn && sslconn->ssl;}static const char var_interface[] = "mod_ssl/" MOD_SSL_VERSION;static char var_library_interface[] = SSL_LIBRARY_TEXT;static char *var_library = NULL;void ssl_var_register(apr_pool_t *p){    char *cp, *cp2;    APR_REGISTER_OPTIONAL_FN(ssl_is_https);    APR_REGISTER_OPTIONAL_FN(ssl_var_lookup);    APR_REGISTER_OPTIONAL_FN(ssl_ext_lookup);    /* Perform once-per-process library version determination: */    var_library = apr_pstrdup(p, SSL_LIBRARY_DYNTEXT);    if ((cp = strchr(var_library, ' ')) != NULL) {        *cp = '/';        if ((cp2 = strchr(cp, ' ')) != NULL)            *cp2 = NUL;    }    if ((cp = strchr(var_library_interface, ' ')) != NULL) {        *cp = '/';        if ((cp2 = strchr(cp, ' ')) != NULL)            *cp2 = NUL;    }}/* This function must remain safe to use for a non-SSL connection. */char *ssl_var_lookup(apr_pool_t *p, server_rec *s, conn_rec *c, request_rec *r, char *var){    SSLModConfigRec *mc = myModConfig(s);    const char *result;    BOOL resdup;    apr_time_exp_t tm;    result = NULL;    resdup = TRUE;    /*     * When no pool is given try to find one     */    if (p == NULL) {        if (r != NULL)            p = r->pool;        else if (c != NULL)            p = c->pool;        else            p = mc->pPool;    }    /*     * Request dependent stuff     */    if (r != NULL) {        switch (var[0]) {        case 'H':        case 'h':            if (strcEQ(var, "HTTP_USER_AGENT"))                result = apr_table_get(r->headers_in, "User-Agent");            else if (strcEQ(var, "HTTP_REFERER"))                result = apr_table_get(r->headers_in, "Referer");            else if (strcEQ(var, "HTTP_COOKIE"))                result = apr_table_get(r->headers_in, "Cookie");            else if (strcEQ(var, "HTTP_FORWARDED"))                result = apr_table_get(r->headers_in, "Forwarded");            else if (strcEQ(var, "HTTP_HOST"))                result = apr_table_get(r->headers_in, "Host");            else if (strcEQ(var, "HTTP_PROXY_CONNECTION"))                result = apr_table_get(r->headers_in, "Proxy-Connection");            else if (strcEQ(var, "HTTP_ACCEPT"))                result = apr_table_get(r->headers_in, "Accept");            else if (strlen(var) > 5 && strcEQn(var, "HTTP:", 5))                /* all other headers from which we are still not know about */                result = apr_table_get(r->headers_in, var+5);            break;        case 'R':        case 'r':            if (strcEQ(var, "REQUEST_METHOD"))                result = r->method;            else if (strcEQ(var, "REQUEST_SCHEME"))                result = ap_http_scheme(r);            else if (strcEQ(var, "REQUEST_URI"))                result = r->uri;            else if (strcEQ(var, "REQUEST_FILENAME"))                result = r->filename;            else if (strcEQ(var, "REMOTE_HOST"))                result = ap_get_remote_host(r->connection, r->per_dir_config,                                            REMOTE_NAME, NULL);            else if (strcEQ(var, "REMOTE_IDENT"))                result = ap_get_remote_logname(r);            else if (strcEQ(var, "REMOTE_USER"))                result = r->user;            break;        case 'S':        case 's':            if (strcEQn(var, "SSL", 3)) break; /* shortcut common case */            if (strcEQ(var, "SERVER_ADMIN"))                result = r->server->server_admin;            else if (strcEQ(var, "SERVER_NAME"))                result = ap_get_server_name(r);            else if (strcEQ(var, "SERVER_PORT"))                result = apr_psprintf(p, "%u", ap_get_server_port(r));            else if (strcEQ(var, "SERVER_PROTOCOL"))                result = r->protocol;            else if (strcEQ(var, "SCRIPT_FILENAME"))                result = r->filename;            break;        default:            if (strcEQ(var, "PATH_INFO"))                result = r->path_info;            else if (strcEQ(var, "QUERY_STRING"))                result = r->args;            else if (strcEQ(var, "IS_SUBREQ"))                result = (r->main != NULL ? "true" : "false");            else if (strcEQ(var, "DOCUMENT_ROOT"))                result = ap_document_root(r);            else if (strcEQ(var, "AUTH_TYPE"))                result = r->ap_auth_type;            else if (strcEQ(var, "THE_REQUEST"))                result = r->the_request;            break;        }    }    /*     * Connection stuff     */    if (result == NULL && c != NULL) {        SSLConnRec *sslconn = myConnConfig(c);        if (strlen(var) > 4 && strcEQn(var, "SSL_", 4)            && sslconn && sslconn->ssl)            result = ssl_var_lookup_ssl(p, c, var+4);        else if (strcEQ(var, "REMOTE_ADDR"))            result = c->remote_ip;        else if (strcEQ(var, "HTTPS")) {            if (sslconn && sslconn->ssl)                result = "on";            else                result = "off";        }    }    /*     * Totally independent stuff     */    if (result == NULL) {        if (strlen(var) > 12 && strcEQn(var, "SSL_VERSION_", 12))            result = ssl_var_lookup_ssl_version(p, var+12);        else if (strcEQ(var, "SERVER_SOFTWARE"))            result = ap_get_server_banner();        else if (strcEQ(var, "API_VERSION")) {            result = apr_itoa(p, MODULE_MAGIC_NUMBER);            resdup = FALSE;        }        else if (strcEQ(var, "TIME_YEAR")) {            apr_time_exp_lt(&tm, apr_time_now());            result = apr_psprintf(p, "%02d%02d",                                 (tm.tm_year / 100) + 19, tm.tm_year % 100);            resdup = FALSE;        }#define MKTIMESTR(format, tmfield) \            apr_time_exp_lt(&tm, apr_time_now()); \            result = apr_psprintf(p, format, tm.tmfield); \            resdup = FALSE;        else if (strcEQ(var, "TIME_MON")) {            MKTIMESTR("%02d", tm_mon+1)        }        else if (strcEQ(var, "TIME_DAY")) {            MKTIMESTR("%02d", tm_mday)        }        else if (strcEQ(var, "TIME_HOUR")) {            MKTIMESTR("%02d", tm_hour)        }        else if (strcEQ(var, "TIME_MIN")) {            MKTIMESTR("%02d", tm_min)        }        else if (strcEQ(var, "TIME_SEC")) {            MKTIMESTR("%02d", tm_sec)        }        else if (strcEQ(var, "TIME_WDAY")) {            MKTIMESTR("%d", tm_wday)        }        else if (strcEQ(var, "TIME")) {            apr_time_exp_lt(&tm, apr_time_now());            result = apr_psprintf(p,                        "%02d%02d%02d%02d%02d%02d%02d", (tm.tm_year / 100) + 19,                        (tm.tm_year % 100), tm.tm_mon+1, tm.tm_mday,                        tm.tm_hour, tm.tm_min, tm.tm_sec);            resdup = FALSE;        }        /* all other env-variables from the parent Apache process */        else if (strlen(var) > 4 && strcEQn(var, "ENV:", 4)) {            result = apr_table_get(r->notes, var+4);            if (result == NULL)                result = apr_table_get(r->subprocess_env, var+4);            if (result == NULL)                result = getenv(var+4);        }    }    if (result != NULL && resdup)        result = apr_pstrdup(p, result);    if (result == NULL)        result = "";    return (char *)result;}static char *ssl_var_lookup_ssl(apr_pool_t *p, conn_rec *c, char *var){    SSLConnRec *sslconn = myConnConfig(c);    char *result;    X509 *xs;    STACK_OF(X509) *sk;    SSL *ssl;    result = NULL;    ssl = sslconn->ssl;    if (strlen(var) > 8 && strcEQn(var, "VERSION_", 8)) {        result = ssl_var_lookup_ssl_version(p, var+8);    }    else if (ssl != NULL && strcEQ(var, "PROTOCOL")) {        result = (char *)SSL_get_version(ssl);    }    else if (ssl != NULL && strcEQ(var, "SESSION_ID")) {        char buf[SSL_SESSION_ID_STRING_LEN];        SSL_SESSION *pSession = SSL_get_session(ssl);        if (pSession) {            result = apr_pstrdup(p, SSL_SESSION_id2sz(                                     SSL_SESSION_get_session_id(pSession),                                     SSL_SESSION_get_session_id_length(pSession),                                     buf, sizeof(buf)));        }    }    else if (ssl != NULL && strlen(var) >= 6 && strcEQn(var, "CIPHER", 6)) {        result = ssl_var_lookup_ssl_cipher(p, c, var+6);    }    else if (ssl != NULL && strlen(var) > 18 && strcEQn(var, "CLIENT_CERT_CHAIN_", 18)) {        sk = SSL_get_peer_cert_chain(ssl);        result = ssl_var_lookup_ssl_cert_chain(p, sk, var+18);    }    else if (ssl != NULL && strcEQ(var, "CLIENT_VERIFY")) {        result = ssl_var_lookup_ssl_cert_verify(p, c);    }    else if (ssl != NULL && strlen(var) > 7 && strcEQn(var, "CLIENT_", 7)) {        if ((xs = SSL_get_peer_certificate(ssl)) != NULL) {            result = ssl_var_lookup_ssl_cert(p, xs, var+7);            X509_free(xs);        }    }    else if (ssl != NULL && strlen(var) > 7 && strcEQn(var, "SERVER_", 7)) {        if ((xs = SSL_get_certificate(ssl)) != NULL)            result = ssl_var_lookup_ssl_cert(p, xs, var+7);    }    else if (ssl != NULL && strcEQ(var, "COMPRESS_METHOD")) {        result = ssl_var_lookup_ssl_compress_meth(ssl);    }    return result;}static char *ssl_var_lookup_ssl_cert(apr_pool_t *p, X509 *xs, char *var){    char *result;    BOOL resdup;    X509_NAME *xsname;    int nid;    char *cp;    result = NULL;    resdup = TRUE;    if (strcEQ(var, "M_VERSION")) {        result = apr_psprintf(p, "%lu", X509_get_version(xs)+1);        resdup = FALSE;    }    else if (strcEQ(var, "M_SERIAL")) {        result = ssl_var_lookup_ssl_cert_serial(p, xs);    }    else if (strcEQ(var, "V_START")) {        result = ssl_var_lookup_ssl_cert_valid(p, X509_get_notBefore(xs));    }    else if (strcEQ(var, "V_END")) {        result = ssl_var_lookup_ssl_cert_valid(p, X509_get_notAfter(xs));    }    else if (strcEQ(var, "V_REMAIN")) {        result = ssl_var_lookup_ssl_cert_remain(p, X509_get_notAfter(xs));        resdup = FALSE;    }    else if (strcEQ(var, "S_DN")) {        xsname = X509_get_subject_name(xs);        cp = X509_NAME_oneline(xsname, NULL, 0);        result = apr_pstrdup(p, cp);        modssl_free(cp);        resdup = FALSE;    }    else if (strlen(var) > 5 && strcEQn(var, "S_DN_", 5)) {        xsname = X509_get_subject_name(xs);        result = ssl_var_lookup_ssl_cert_dn(p, xsname, var+5);        resdup = FALSE;    }    else if (strcEQ(var, "I_DN")) {        xsname = X509_get_issuer_name(xs);        cp = X509_NAME_oneline(xsname, NULL, 0);        result = apr_pstrdup(p, cp);        modssl_free(cp);        resdup = FALSE;    }    else if (strlen(var) > 5 && strcEQn(var, "I_DN_", 5)) {        xsname = X509_get_issuer_name(xs);        result = ssl_var_lookup_ssl_cert_dn(p, xsname, var+5);        resdup = FALSE;    }    else if (strcEQ(var, "A_SIG")) {        nid = OBJ_obj2nid((ASN1_OBJECT *)X509_get_signature_algorithm(xs));        result = apr_pstrdup(p,                             (nid == NID_undef) ? "UNKNOWN" : OBJ_nid2ln(nid));        resdup = FALSE;    }    else if (strcEQ(var, "A_KEY")) {        nid = OBJ_obj2nid((ASN1_OBJECT *)X509_get_key_algorithm(xs));        result = apr_pstrdup(p,                             (nid == NID_undef) ? "UNKNOWN" : OBJ_nid2ln(nid));        resdup = FALSE;    }    else if (strcEQ(var, "CERT")) {        result = ssl_var_lookup_ssl_cert_PEM(p, xs);    }    if (result != NULL && resdup)        result = apr_pstrdup(p, result);    return result;}static const struct {    char *name;    int   nid;} ssl_var_lookup_ssl_cert_dn_rec[] = {    { "C",     NID_countryName            },    { "ST",    NID_stateOrProvinceName    }, /* officially    (RFC2156) */    { "SP",    NID_stateOrProvinceName    }, /* compatibility (SSLeay)  */    { "L",     NID_localityName           },    { "O",     NID_organizationName       },    { "OU",    NID_organizationalUnitName },    { "CN",    NID_commonName             },    { "T",     NID_title                  },    { "I",     NID_initials               },    { "G",     NID_givenName              },    { "S",     NID_surname                },    { "D",     NID_description            },#ifdef NID_x500UniqueIdentifier /* new name as of Openssl 0.9.7 */

⌨️ 快捷键说明

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