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

📄 ssl_engine_vars.c

📁 Apache HTTP Server 是一个功能强大的灵活的与HTTP/1.1相兼容的web服务器.这里给出的是Apache HTTP服务器的源码。
💻 C
📖 第 1 页 / 共 2 页
字号:
    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            },/* This has been removed in OpenSSL 0.9.8-dev. */#ifdef NID_uniqueIdentifier    { "UID",   NID_uniqueIdentifier       },#endif    { "Email", NID_pkcs9_emailAddress     },    { NULL,    0                          }};static char *ssl_var_lookup_ssl_cert_dn(apr_pool_t *p, X509_NAME *xsname, char *var){    char *result;    X509_NAME_ENTRY *xsne;    int i, j, n;    unsigned char *data_ptr;    int data_len;    result = NULL;    for (i = 0; ssl_var_lookup_ssl_cert_dn_rec[i].name != NULL; i++) {        if (strEQ(var, ssl_var_lookup_ssl_cert_dn_rec[i].name)) {            for (j = 0; j < sk_X509_NAME_ENTRY_num((STACK_OF(X509_NAME_ENTRY) *)                                                 X509_NAME_get_entries(xsname));                 j++) {                xsne = sk_X509_NAME_ENTRY_value((STACK_OF(X509_NAME_ENTRY) *)                                             X509_NAME_get_entries(xsname), j);                n =OBJ_obj2nid((ASN1_OBJECT *)X509_NAME_ENTRY_get_object(xsne));                data_ptr = X509_NAME_ENTRY_get_data_ptr(xsne);                data_len = X509_NAME_ENTRY_get_data_len(xsne);                if (n == ssl_var_lookup_ssl_cert_dn_rec[i].nid) {                    result = apr_palloc(p, data_len+1);                    apr_cpystrn(result, (char *)data_ptr, data_len+1);#ifdef CHARSET_EBCDIC                    ascii2ebcdic(result, result, xsne->value->length);#endif /* CHARSET_EBCDIC */                    result[data_len] = NUL;                    break;                }            }            break;        }    }    return result;}static char *ssl_var_lookup_ssl_cert_valid(apr_pool_t *p, ASN1_UTCTIME *tm){    char *result;    BIO* bio;    int n;    if ((bio = BIO_new(BIO_s_mem())) == NULL)        return NULL;    ASN1_UTCTIME_print(bio, tm);    n = BIO_pending(bio);    result = apr_pcalloc(p, n+1);    n = BIO_read(bio, result, n);    result[n] = NUL;    BIO_free(bio);    return result;}static char *ssl_var_lookup_ssl_cert_serial(apr_pool_t *p, X509 *xs){    char *result;    BIO *bio;    int n;    if ((bio = BIO_new(BIO_s_mem())) == NULL)        return NULL;    i2a_ASN1_INTEGER(bio, X509_get_serialNumber(xs));    n = BIO_pending(bio);    result = apr_pcalloc(p, n+1);    n = BIO_read(bio, result, n);    result[n] = NUL;    BIO_free(bio);    return result;}static char *ssl_var_lookup_ssl_cert_chain(apr_pool_t *p, STACK_OF(X509) *sk, char *var){    char *result;    X509 *xs;    int n;    result = NULL;    if (strspn(var, "0123456789") == strlen(var)) {        n = atoi(var);        if (n < sk_X509_num(sk)) {            xs = sk_X509_value(sk, n);            result = ssl_var_lookup_ssl_cert_PEM(p, xs);        }    }    return result;}static char *ssl_var_lookup_ssl_cert_PEM(apr_pool_t *p, X509 *xs){    char *result;    BIO *bio;    int n;    if ((bio = BIO_new(BIO_s_mem())) == NULL)        return NULL;    PEM_write_bio_X509(bio, xs);    n = BIO_pending(bio);    result = apr_pcalloc(p, n+1);    n = BIO_read(bio, result, n);    result[n] = NUL;    BIO_free(bio);    return result;}static char *ssl_var_lookup_ssl_cert_verify(apr_pool_t *p, conn_rec *c){    SSLConnRec *sslconn = myConnConfig(c);    char *result;    long vrc;    const char *verr;    const char *vinfo;    SSL *ssl;    X509 *xs;    result = NULL;    ssl   = sslconn->ssl;    verr  = sslconn->verify_error;    vinfo = sslconn->verify_info;    vrc   = SSL_get_verify_result(ssl);    xs    = SSL_get_peer_certificate(ssl);    if (vrc == X509_V_OK && verr == NULL && vinfo == NULL && xs == NULL)        /* no client verification done at all */        result = "NONE";    else if (vrc == X509_V_OK && verr == NULL && vinfo == NULL && xs != NULL)        /* client verification done successful */        result = "SUCCESS";    else if (vrc == X509_V_OK && vinfo != NULL && strEQ(vinfo, "GENEROUS"))        /* client verification done in generous way */        result = "GENEROUS";    else        /* client verification failed */        result = apr_psprintf(p, "FAILED:%s", verr);    if (xs)        X509_free(xs);    return result;}static char *ssl_var_lookup_ssl_cipher(apr_pool_t *p, conn_rec *c, char *var){    SSLConnRec *sslconn = myConnConfig(c);        char *result;    BOOL resdup;    int usekeysize, algkeysize;    SSL *ssl;    result = NULL;    resdup = TRUE;    ssl = sslconn->ssl;    ssl_var_lookup_ssl_cipher_bits(ssl, &usekeysize, &algkeysize);    if (ssl && strEQ(var, "")) {        SSL_CIPHER *cipher = SSL_get_current_cipher(ssl);        result = (cipher != NULL ? (char *)SSL_CIPHER_get_name(cipher) : NULL);    }    else if (strcEQ(var, "_EXPORT"))        result = (usekeysize < 56 ? "true" : "false");    else if (strcEQ(var, "_USEKEYSIZE")) {        result = apr_psprintf(p, "%d", usekeysize);        resdup = FALSE;    }    else if (strcEQ(var, "_ALGKEYSIZE")) {        result = apr_psprintf(p, "%d", algkeysize);        resdup = FALSE;    }    if (result != NULL && resdup)        result = apr_pstrdup(p, result);    return result;}static void ssl_var_lookup_ssl_cipher_bits(SSL *ssl, int *usekeysize, int *algkeysize){    SSL_CIPHER *cipher;    *usekeysize = 0;    *algkeysize = 0;    if (ssl != NULL)        if ((cipher = SSL_get_current_cipher(ssl)) != NULL)            *usekeysize = SSL_CIPHER_get_bits(cipher, algkeysize);    return;}static char *ssl_var_lookup_ssl_version(apr_pool_t *p, char *var){    char *result;    char *cp, *cp2;    result = NULL;    if (strEQ(var, "PRODUCT")) {#if defined(SSL_PRODUCT_NAME) && defined(SSL_PRODUCT_VERSION)        result = apr_psprintf(p, "%s/%s", SSL_PRODUCT_NAME, SSL_PRODUCT_VERSION);#else        result = NULL;#endif    }    else if (strEQ(var, "INTERFACE")) {        result = apr_psprintf(p, "mod_ssl/%s", MOD_SSL_VERSION);    }    else if (strEQ(var, "LIBRARY")) {        result = apr_pstrdup(p, SSLeay_version(SSLEAY_VERSION));        if ((cp = strchr(result, ' ')) != NULL) {            *cp = '/';            if ((cp2 = strchr(cp, ' ')) != NULL)                *cp2 = NUL;        }    }    return result;}/*  _________________________________________________________________****  SSL Extension to mod_log_config**  _________________________________________________________________*/#include "../../modules/loggers/mod_log_config.h"static const char *ssl_var_log_handler_c(request_rec *r, char *a);static const char *ssl_var_log_handler_x(request_rec *r, char *a);/* * register us for the mod_log_config function registering phase * to establish %{...}c and to be able to expand %{...}x variables. */void ssl_var_log_config_register(apr_pool_t *p){    static APR_OPTIONAL_FN_TYPE(ap_register_log_handler) *log_pfn_register;    log_pfn_register = APR_RETRIEVE_OPTIONAL_FN(ap_register_log_handler);    if (log_pfn_register) {        log_pfn_register(p, "c", ssl_var_log_handler_c, 0);        log_pfn_register(p, "x", ssl_var_log_handler_x, 0);    }    return;}/* * implement the %{..}c log function * (we are the only function) */static const char *ssl_var_log_handler_c(request_rec *r, char *a){    SSLConnRec *sslconn = myConnConfig(r->connection);    char *result;    if (sslconn == NULL || sslconn->ssl == NULL)        return NULL;    result = NULL;    if (strEQ(a, "version"))        result = ssl_var_lookup(r->pool, r->server, r->connection, r, "SSL_PROTOCOL");    else if (strEQ(a, "cipher"))        result = ssl_var_lookup(r->pool, r->server, r->connection, r, "SSL_CIPHER");    else if (strEQ(a, "subjectdn") || strEQ(a, "clientcert"))        result = ssl_var_lookup(r->pool, r->server, r->connection, r, "SSL_CLIENT_S_DN");    else if (strEQ(a, "issuerdn") || strEQ(a, "cacert"))        result = ssl_var_lookup(r->pool, r->server, r->connection, r, "SSL_CLIENT_I_DN");    else if (strEQ(a, "errcode"))        result = "-";    else if (strEQ(a, "errstr"))        result = (char *)sslconn->verify_error;    if (result != NULL && result[0] == NUL)        result = NULL;    return result;}/* * extend the implementation of the %{..}x log function * (there can be more functions) */static const char *ssl_var_log_handler_x(request_rec *r, char *a){    char *result;    result = ssl_var_lookup(r->pool, r->server, r->connection, r, a);    if (result != NULL && result[0] == NUL)        result = NULL;    return result;}

⌨️ 快捷键说明

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