📄 ssl_engine_vars.c
字号:
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 + -