>This is a multi-part message in MIME format.

>------=_NextPart_000_00FD_01BE9B12.DD5367E0
>Content-Type: multipart/alternative;
>       boundary="----=_NextPart_001_00FE_01BE9B12.DD5367E0"


>------=_NextPart_001_00FE_01BE9B12.DD5367E0
>Content-Type: text/plain;
>       charset="iso-8859-1"
>Content-Transfer-Encoding: quoted-printable

>Hi,
>=20
>I patched ssl_engine_kernel.c to realize an OCSP responder function
>that check cert status on ldap v2 directory.
>=20
>I send all my patch to ssl_engine_kernel.c, every routine start is =
>marked
>with "Giacob" label. The ldap_hook search the certificate in our ldap =
>directory, by=20
>client e-mail: if the cert is in ldap is good, neither is revoked (first =
>semplification
>assumption because we're still working on ldap)
>=20
>My next step will be to exchange OCSP requests and response between two
>servers Apache, by http protocol session: one will be OCSP client, and =
>the other one=20
>OCSP responder.
>Any idea how to set http-ssl comunication between two Apache ?
>=20
>Thank you in advance=20
>Giacob
>=20

>------=_NextPart_001_00FE_01BE9B12.DD5367E0
>Content-Type: text/html;
>       charset="iso-8859-1"
>Content-Transfer-Encoding: quoted-printable

><!DOCTYPE HTML PUBLIC "-//W3C//DTD W3 HTML//EN">
><HTML>
><HEAD>

><META content=3Dtext/html;charset=3Diso-8859-1 =
>http-equiv=3DContent-Type>
><META content=3D'"MSHTML 4.72.3110.7"' name=3DGENERATOR>
></HEAD>
><BODY bgColor=3D#ffffff>
><DIV>
><DIV>
><DIV><FONT color=3D#000000 size=3D2>Hi,</FONT></DIV>
><DIV><FONT color=3D#000000 size=3D2></FONT>&nbsp;</DIV>
><DIV><FONT color=3D#000000 size=3D2>I patched ssl_engine_kernel.c to =
>realize an OCSP=20
>responder function</FONT></DIV>
><DIV><FONT color=3D#000000 size=3D2></FONT><FONT size=3D2>that check =
>cert status on=20
>ldap v2 directory.</FONT></DIV>
><DIV><FONT size=3D2></FONT>&nbsp;</DIV>
><DIV><FONT size=3D2>I send all my patch to ssl_engine_kernel.c, every =
>routine=20
>start is marked</FONT></DIV>
><DIV><FONT size=3D2>with &quot;Giacob&quot; label. The ldap_hook search =
>the=20
>certificate in our ldap directory, by </FONT></DIV>
><DIV><FONT size=3D2>client e-mail: if the cert is in ldap is good, =
>neither is=20
>revoked (first semplification</FONT></DIV>
><DIV><FONT size=3D2>assumption because we're still working on =
>ldap)</FONT></DIV>
><DIV><FONT size=3D2></FONT>&nbsp;</DIV>
><DIV><FONT color=3D#000000 size=3D2>My next step will be to exchange =
>OCSP requests=20
>and response between two</FONT></DIV>
><DIV><FONT color=3D#000000 size=3D2></FONT><FONT size=3D2>servers =
>Apache, by http=20
>protocol session: one will be OCSP client, and the other one =
></FONT></DIV>
><DIV><FONT size=3D2>OCSP responder.</FONT></DIV>
><DIV><FONT size=3D2>Any idea how to set http-ssl comunication between =
>two Apache=20
>?</FONT></DIV>
><DIV><FONT size=3D2></FONT>&nbsp;</DIV>
><DIV><FONT size=3D2>Thank you in advance</FONT>&nbsp;</DIV>
><DIV><FONT size=3D2>Giacob</FONT></DIV>
><DIV><FONT size=3D2></FONT>&nbsp;</DIV></DIV></DIV></BODY></HTML>

>------=_NextPart_001_00FE_01BE9B12.DD5367E0--

>------=_NextPart_000_00FD_01BE9B12.DD5367E0
>Content-Type: application/msword;
>       name="OCSP_responder_patch.rtf"
>Content-Transfer-Encoding: quoted-printable
>Content-Disposition: attachment;
>       filename="OCSP_responder_patch.rtf"

>{\rtf1\ansi\ansicpg1252\uc1 =
>\deff0\deflang1033\deflangfe1040{\fonttbl{\f0\froman\fcharset0\fprq2{\*\p=
>anose 02020603050405020304}Times New =
>Roman;}{\f2\fmodern\fcharset0\fprq1{\*\panose =
>02070309020205020404}Courier New;}}{\colortbl;\red0\green0\blue0;
>\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\=
>green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green2=
>55\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blu=
>e0;\red128\green0\blue128;
>\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red=
>192\green192\blue192;}{\stylesheet{\nowidctlpar\widctlpar\adjustright =
>\fs20\lang1040\cgrid \snext0 Normal;}{\*\cs10 \additive Default =
>Paragraph Font;}{
>\s15\nowidctlpar\widctlpar\adjustright \f2\fs20\lang1040\cgrid =
>\sbasedon0 \snext15 Plain Text;}}{\info{\title #include =
>"mod_ssl}{\author Andrea e Luca Giacobazzi}{\operator Andrea e Luca =
>Giacobazzi}{\creatim\yr1999\mo5\dy10\hr17\min58}
>{\revtim\yr1999\mo5\dy10\hr18\min4}{\version3}{\edmins2}{\nofpages10}{\no=
>fwords3031}{\nofchars17279}{\*\company La =
>Villa}{\nofcharsws21219}{\vern73}}\paperw11906\paperh16838\margl1134\marg=
>r1134\margt1417\margb1134=20
>\deftab708\widowctrl\ftnbj\aenddoc\hyphhotz283\formshade\viewkind4\viewsc=
>ale124\viewzk2\pgbrdrhead\pgbrdrfoot \fet0\sectd =
>\linex0\headery709\footery709\colsx709\endnhere\sectdefaultcl =
>{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang{\pntxta .}}
>{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang{\pntxta =
>.}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang{\pntxta =
>.}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang{\pntxta =
>)}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta =
>)}}
>{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta =
>)}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta =
>)}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta =
>)}}{\*\pnseclvl9
>\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}\pard\plain =
>\s15\nowidctlpar\widctlpar\adjustright \f2\fs20\lang1040\cgrid =
>{\lang1024 #include "mod_ssl.h"
>\par  =20
>\par /* Giacob: static declaration data and function for ocsp */
>\par=20
>\par #include <lber.h>
>\par #include <ldap.h>
>\par #include "ocsp.h"
>\par=20
>\par typedef struct cert_file_st=20
>\par         \{=20
>\par         char *name;
>\par         int   status;
>\par         int   reason;
>\par         char *time;
>\par         char *this;
>\par         char *next;=20
>\par         \} CERT_FILE;
>\par    =20
>\par typedef struct response_st
>\par         \{
>\par         CERT_FILE *cert_file;
>\par         int rsp_status;
>\par         \} RESPONSE_FILE;
>\par   =20
>\par typedef struct strtbl_st \{ int t; char *m; \} STRTBL;
>\par=20
>\par static OCSP_RESPONSE *ocsp_response_hook (int id, int  rsp_status, =
>X509* xcert, OCSP_CERTID *certid, OCSP_CERTSTATUS *ocsp_status, char =
>*this, char *next);
>\par static OCSP_REQUEST *ocsp_request_hook (X509* xcert, OCSP_CERTID =
>*certid);
>\par static RESPONSE_FILE *ocsp_ldap_hook(X509 *xs, char *mail);
>\par static void get_entry(LDAP *ld, LDAPMessage *entry, RESPONSE_FILE =
>**response);
>\par static void *ocsp_responder (X509 *xs);
>\par=20
>\par static STRTBL crlReasons[8]=3D \{
>\par         \{ OCSP_REVOKED_STATUS_UNSPECIFIED, "unspecified" \},
>\par         \{ OCSP_REVOKED_STATUS_KEYCOMPROMISE, "keyCompromise" \},
>\par         \{ OCSP_REVOKED_STATUS_CACOMPROMISE, "cACompromise" \},
>\par         \{ OCSP_REVOKED_STATUS_AFFILIATIONCHANGED, =
>"affiliationChanged" \},
>\par         \{ OCSP_REVOKED_STATUS_SUPERSEDED, "superseded" \},
>\par         \{ OCSP_REVOKED_STATUS_CESSATIONOFOPERATION, =
>"cessationOfOperation" \},
>\par         \{ OCSP_REVOKED_STATUS_CERTIFICATEHOLD, "certificateHold" =
>\},
>\par         \{ OCSP_REVOKED_STATUS_REMOVEFROMCRL, "removeFromCRL" \} =
>\};
>\par=20
>\par static STRTBL respStatus[6] =3D \{
>\par         \{ OCSP_RESPONSE_STATUS_SUCCESSFULL, "successfull" \},
>\par         \{ OCSP_RESPONSE_STATUS_MALFORMEDREQUEST, =
>"malformedRequest" \},
>\par         \{ OCSP_RESPONSE_STATUS_INTERNALERROR, "internalError" \},
>\par         \{ OCSP_RESPONSE_STATUS_TRYLATER, "tryLater" \},
>\par         \{ OCSP_RESPONSE_STATUS_SIGREQUIRED, "sigRequired" \},
>\par         \{ OCSP_RESPONSE_STATUS_UNAUTHORIZED, "unauthorized" \} \};
>\par=20
>\par static STRTBL certStatus[3] =3D \{
>\par         \{ V_OCSP_CERTSTATUS_GOOD, "good" \},
>\par         \{ V_OCSP_CERTSTATUS_REVOKED, "revoked" \},
>\par         \{ V_OCSP_CERTSTATUS_UNKNOWN, "unknown" \} \};
>\par=20
>\par static STRTBL respIds[2] =3D \{
>\par         \{ V_OCSP_RESPID_NAME, "name" \},
>\par         \{ V_OCSP_RESPID_KEY, "key" \} \};
>\par=20
>\par static BIO *bio_err =3D NULL;=20
>\par static int count;  /* certificate file lenght */
>\par static char certificate[1000];   /*  certificate to verify in DER =
>*/
>\par static char ocsp_response[50];
>\par static char *attrs[] =3D \{"mail", "cn", "usercertificate;binary", =
>NULL\}; /* attributes to be retrieved */
>\par=20
>\par FILE *fperr; /* ocsp debug file pointer */
>\par=20
>\par static const char *ssl_hook_Fixup_vars[] =3D \{
>\par     "SSL_VERSION_INTERFACE",
>\par     "SSL_VERSION_LIBRARY",
>\par     "SSL_PROTOCOL",
>\par     "SSL_CIPHER",
>\par     "SSL_CIPHER_EXPORT",
>\par     "SSL_CIPHER_USEKEYSIZE",
>\par     "SSL_CIPHER_ALGKEYSIZE",
>\par     "SSL_CLIENT_M_VERSION",
>\par     "SSL_CLIENT_M_SERIAL",
>\par     "SSL_CLIENT_V_START",
>\par     "SSL_CLIENT_V_END",
>\par     "SSL_CLIENT_S_DN",
>\par     "SSL_CLIENT_S_DN_C",
>\par     "SSL_CLIENT_S_DN_SP",
>\par     "SSL_CLIENT_S_DN_L",
>\par     "SSL_CLIENT_S_DN_O",
>\par     "SSL_CLIENT_S_DN_OU",
>\par     "SSL_CLIENT_S_DN_CN",
>\par     "SSL_CLIENT_S_DN_Email",
>\par     "SSL_CLIENT_I_DN",
>\par     "SSL_CLIENT_I_DN_C",
>\par     "SSL_CLIENT_I_DN_SP",
>\par     "SSL_CLIENT_I_DN_L",
>\par     "SSL_CLIENT_I_DN_O",
>\par     "SSL_CLIENT_I_DN_OU",
>\par     "SSL_CLIENT_I_DN_CN",
>\par     "SSL_CLIENT_I_DN_Email",
>\par     "SSL_CLIENT_A_KEY",
>\par     "SSL_CLIENT_A_SIG",
>\par     "SSL_OCSP_LDAP_RESPONSE",  /* Giacob: environment var for ocsp =
>*/
>\par     "SSL_SERVER_M_VERSION",
>\par     "SSL_SERVER_M_SERIAL",
>\par     "SSL_SERVER_V_START",
>\par     "SSL_SERVER_V_END",
>\par     "SSL_SERVER_S_DN",
>\par     "SSL_SERVER_S_DN_C",
>\par     "SSL_SERVER_S_DN_SP",
>\par     "SSL_SERVER_S_DN_L",
>\par     "SSL_SERVER_S_DN_O",
>\par     "SSL_SERVER_S_DN_OU",
>\par     "SSL_SERVER_S_DN_CN",
>\par     "SSL_SERVER_S_DN_Email",
>\par     "SSL_SERVER_I_DN",
>\par     "SSL_SERVER_I_DN_C",
>\par     "SSL_SERVER_I_DN_SP",
>\par     "SSL_SERVER_I_DN_L",
>\par     "SSL_SERVER_I_DN_O",
>\par     "SSL_SERVER_I_DN_OU",
>\par     "SSL_SERVER_I_DN_CN",
>\par     "SSL_SERVER_I_DN_Email",
>\par     "SSL_SERVER_A_KEY",
>\par     "SSL_SERVER_A_SIG",
>\par     NULL
>\par \};
>\par=20
>\par /* Giacob: retrieve cert status from ldap */
>\par   =20
>\par static RESPONSE_FILE *ocsp_ldap_hook(X509 *xs, char *mail)
>\par /* static char* ocsp_ldap_hook(request_rec *r) */
>\par \{=20
>\par    RESPONSE_FILE *response;=20
>\par    STRTBL *table;
>\par    LDAP *ld;
>\par    LDAPMessage *res,*e;
>\par    BIO *bp_cert;
>\par   =20
>\par    char filtpattern[1024], time[15];
>\par    char *ldapservers =3D "/*ldap-idd.comune.modena.it:389*/ =
>callisto.comune.modena.it:3389";
>\par    int done, rc;
>\par   =20
>\par    FILE *fpcert; /* certificate file pointer */
>\par   =20
>\par    /* default response: certificate status REVOKED */
>\par    response->rsp_status =3D OCSP_RESPONSE_STATUS_SUCCESSFULL;
>\par    response->cert_file->status =3D V_OCSP_CERTSTATUS_REVOKED;
>\par    response->cert_file->reason =3D =
>OCSP_REVOKED_STATUS_KEYCOMPROMISE;
>\par    strcpy(time, "19990506120000");
>\par    response->cert_file->time =3D time;
>\par    table =3D &certStatus[V_OCSP_CERTSTATUS_REVOKED];
>\par    strcpy(ocsp_response, table->m);
>\par=20
>\par    /* bp_cert =3D BIO_new(BIO_s_mem());
>\par    i2d_X509_bio(bp_cert, xs);
>\par    BIO_gets(bp_cert, certificate, bp_cert->num_read);
>\par    fprintf(fperr, "Certificate der in var %s.\\n", certificate);
>\par    fflush(fperr); */
>\par=20
>\par    fpcert =3D fopen("/tmp/certificato.der", "w");
>\par    i2d_X509_fp(fpcert, xs);
>\par    fclose(fpcert);
>\par=20
>\par    fpcert =3D fopen("/tmp/certificato.der", "r");
>\par    count =3D fread(certificate, 1, 999, fpcert);
>\par    fclose(fpcert);=20
>\par   =20
>\par    fprintf(fperr, "Certificate to verify lenght in bytes: %d. \\n", =
>count);
>\par    fflush(fperr);
>\par   =20
>\par    if ((ld =3D ldap_init(ldapservers, 0)) =3D=3D NULL )
>\par        \{
>\par         fprintf(fperr,"can't initialize ldap support \\n");
>\par         fflush(fperr);
>\par         response->rsp_status =3D OCSP_RESPONSE_STATUS_TRYLATER;
>\par         response->cert_file->status =3D V_OCSP_CERTSTATUS_UNKNOWN;
>\par         table =3D &respStatus[OCSP_RESPONSE_STATUS_TRYLATER];
>\par         strcpy(ocsp_response, table->m);
>\par         return response;
>\par        \}
>\par    ld -> ld_options =3D LDAP_OPT_REFERRALS;
>\par    ld -> ld_sizelimit =3D 0;
>\par    ld -> ld_timelimit =3D 0;
>\par    ld -> ld_deref =3D LDAP_DEREF_ALWAYS;
>\par   =20
>\par  if ((rc =3D ldap_bind_s (ld, NULL, NULL, LDAP_AUTH_SIMPLE)) !=3D =
>LDAP_SUCCESS)
>\par     \{
>\par      fprintf(fperr,"can't bind to LDAP server =
>%s\\n",ldap_err2string (rc));
>\par      fflush(fperr);
>\par      response->rsp_status =3D OCSP_RESPONSE_STATUS_INTERNALERROR;
>\par      response->cert_file->status =3D V_OCSP_CERTSTATUS_UNKNOWN;
>\par      table =3D &respStatus[OCSP_RESPONSE_STATUS_INTERNALERROR];
>\par      strcpy(ocsp_response, table->m);
>\par      return response;
>\par     \} else \{
>\par             fprintf(fperr,"binded to LDAP server!!!\\n");
>\par             fflush(fperr);
>\par            \}
>\par   =20
>\par    /* build filter for ldap search by e-mail */
>\par    ldap_build_filter (filtpattern, 1024, "(%a=3D%v)", NULL, NULL, =
>"mail", mail, NULL);
>\par   =20
>\par    if (ldap_search(ld, "o=3Dgiacob ,c=3Dit", LDAP_SCOPE_SUBTREE, =
>filtpattern, attrs, 0 ) =3D=3D -1 )
>\par       \{
>\par        fprintf(fperr,"User %s NOT found in LDAP\\n", mail);
>\par        fflush(fperr);
>\par        response->rsp_status =3D OCSP_RESPONSE_STATUS_UNAUTHORIZED;
>\par        response->cert_file->status =3D V_OCSP_CERTSTATUS_UNKNOWN;
>\par        table =3D &respStatus[OCSP_RESPONSE_STATUS_UNAUTHORIZED];
>\par        strcpy(ocsp_response, table->m);
>\par        return response;
>\par       \} else \{
>\par               fprintf(fperr,"user %s found in LDAP\\n", mail);
>\par               fflush(fperr);
>\par              \}
>\par   =20
>\par    done =3D 0;
>\par   =20
>\par    /* retrieve results of ldap search: must be just one entry */
>\par    while ((rc =3D ldap_result(ld, LDAP_RES_ANY, 0, NULL, &res)) =
>=3D=3D LDAP_RES_SEARCH_ENTRY)
>\par           \{
>\par            e =3D ldap_first_entry(ld, res);
>\par            get_entry(ld, e, &response);
>\par            fprintf(fperr,"loop:\\n");
>\par            fflush(fperr);
>\par            ldap_msgfree(res);
>\par            done =3D 1;
>\par           \}
>\par   =20
>\par    if (!done) \{
>\par                fprintf(fperr,"Ldap search result not retrieved: =
>%s.\\n", ldap_err2string (rc));
>\par                fflush(fperr);
>\par                response->rsp_status =3D =
>OCSP_RESPONSE_STATUS_INTERNALERROR;
>\par                response->cert_file->status =3D =
>V_OCSP_CERTSTATUS_UNKNOWN;
>\par                table =3D =
>&respStatus[OCSP_RESPONSE_STATUS_INTERNALERROR];
>\par                strcpy(ocsp_response, table->m);
>\par                return response;
>\par               \}
>\par   =20
>\par    ldap_msgfree(res);
>\par    ldap_unbind(ld);
>\par   =20
>\par    fprintf(fperr,"Risposta ocsp: %s.\\n", ocsp_response);
>\par    fflush(fperr);
>\par   =20
>\par    return response;
>\par \} =20
>\par=20
>\par static void get_entry (LDAP *ld, LDAPMessage *entry, RESPONSE_FILE =
>**response)
>\par    \{
>\par     char *attribute;
>\par     char *value;
>\par     BerElement *ber;
>\par     struct berval **bvals;
>\par     int k;
>\par     STRTBL *table;
>\par   =20
>\par     /* retrieve attributes of the entry found by ldap search */
>\par     for (attribute =3D ldap_first_attribute(ld, entry, &ber); =
>attribute !=3D NULL; attribute =3D ldap_next_attribute(ld, entry, ber))
>\par         \{
>\par          if ((bvals =3D ldap_get_values_len(ld, entry, attribute)) =
>!=3D NULL)
>\par              \{
>\par               /* get each attribute value of current entry */
>\par               for (k =3D 0; bvals[k] !=3D NULL; k++)
>\par                   \{
>\par                    value =3D bvals[k]->bv_val;
>\par                    if (!strcmp(attribute, =
>"usercertificate;binary"))
>\par                       \{
>\par                        int cert_len =3D bvals[k]->bv_len;
>\par                        fprintf(fperr,"Certificato trovato in LDAP =
>lungo %d caratteri:\\n", cert_len);
>\par                        fflush(fperr);
>\par   =20
>\par                        /* value, cert_len =3D certificato corrente =
>LDAP in DER e lunghezza in byte */
>\par                        /* certificate, count =3D certificato da =
>testare */
>\par                        if (cert_len =3D=3D count)
>\par                           \{
>\par                            /* verify certificate found in LDAP */
>\par                            char *lc;
>\par                            char *sc;
>\par                            sc =3D certificate;
>\par                            lc =3D value;
>\par                            while (lc < value + cert_len && *lc++ =
>=3D=3D *sc++); /* NULL INSTRUCTION */
>\par   =20
>\par                            if (lc =3D=3D value + cert_len)   /* =
>certificate found ! */
>\par                               \{
>\par                                (*response)->rsp_status =3D =
>OCSP_RESPONSE_STATUS_SUCCESSFULL;
>\par                                (*response)->cert_file->status =3D =
>V_OCSP_CERTSTATUS_GOOD;
>\par                                table =3D =
>&certStatus[V_OCSP_CERTSTATUS_GOOD];
>\par                                strcpy(ocsp_response, table->m);
>\par                               \}
>\par                           \}
>\par                       \}
>\par                     else \{
>\par                           ; /* NULL INSTRUCTION. Nothing on other =
>attributes retrieved:
>\par                                mail, cn
>\par                                was: if (!strcmp(attribute, "cn")) =
>strcpy(nome,value);
>\par                                     printf("%s=3D%s\\n", attribute, =
>value);
>\par                             */
>\par                          \}
>\par                    \}
>\par   =20
>\par               \}
>\par          ber_bvecfree(bvals);  /* frees array of berval returned =
>from search */
>\par   \}
>\par  return;
>\par \}
>\par=20
>\par /* Giacob: creating ocsp request on certificate */
>\par=20
>\par static OCSP_REQUEST *ocsp_request_hook (X509 *xcert, OCSP_CERTID =
>*certid)
>\par \{
>\par  OCSP_REQUEST *req =3D NULL;
>\par  X509_NAME *xn =3D NULL;
>\par  BIO *bio =3D NULL;
>\par  STACK *extns =3D NULL;
>\par  FILE *fpocsp;
>\par=20
>\par  xn =3D X509_get_subject_name(xcert);
>\par=20
>\par  if (!(req =3D OCSP_request_new(xn, extns)))=20
>\par     \{
>\par      fprintf(fperr,"Can't create OCSP request.\\n");
>\par      fflush(fperr);
>\par      return NULL;
>\par     \}=20
>\par     else \{
>\par           fprintf(fperr,"OCSP request created.\\n");
>\par           fflush(fperr);
>\par          \}  =20
>\par=20
>\par  if (OCSP_request_add(req, certid, NULL) =3D=3D 0)
>\par     \{
>\par      fprintf(fperr,"Can't put data in OCSP request.\\n");           =
>                =20
>\par      fflush(fperr);
>\par      if (req) OCSP_REQUEST_free(req);
>\par      return NULL;=20
>\par     \}
>\par     else \{
>\par           fprintf(fperr,"OCSP request filled with data.\\n");
>\par           fflush(fperr);
>\par          \}
>\par=20
>\par  fpocsp =3D fopen ("/tmp/ocsp-patch.log", "w");
>\par  if ((bio =3D BIO_new(BIO_s_file())) !=3D NULL) BIO_set_fp(bio, =
>fpocsp, BIO_NOCLOSE);
>\par  OCSP_REQUEST_print(bio, req);
>\par  fflush(fpocsp);
>\par  fclose(fpocsp);
>\par=20
>\par  return req;
>\par \}
>\par=20
>\par /* Giacob: creating ocsp response on certificate */
>\par    =20
>\par static OCSP_RESPONSE *ocsp_response_hook (int id, int rsp_status, =
>X509 *xcert, OCSP_CERTID *certid, OCSP_CERTSTATUS *ocsp_status, char =
>*this, char *next)
>\par \{  =20
>\par  OCSP_BASICRESP *brsp =3D NULL;
>\par  OCSP_RESPONSE *rsp =3D NULL;
>\par  X509_NAME* xn;
>\par  BIO *bio;
>\par  FILE *fpocsp;
>\par    =20
>\par  xn =3D X509_get_subject_name(xcert);
>\par=20
>\par  if (!(brsp =3D OCSP_basic_response_new(id, xcert, NULL)))
>\par     \{=20
>\par      fprintf(fperr,"Cant't create OCSP basic response.\\n");
>\par      fflush(fperr);
>\par      return NULL;
>\par     \}
>\par     else \{
>\par           fprintf(fperr,"OCSP basic response created.\\n");
>\par           fflush(fperr);
>\par          \}
>\par=20
>\par  if (!(OCSP_basic_response_add(brsp, certid, ocsp_status, this, =
>next, NULL)))
>\par     \{
>\par      fprintf(fperr,"Can't put data in OCSP basic response.\\n");
>\par      fflush(fperr);
>\par      if (brsp) OCSP_BASICRESP_free(brsp);
>\par      return NULL;
>\par     \}
>\par     else \{
>\par           fprintf(fperr,"OCSP basic response filled with =
>data.\\n"); =20
>\par           fflush(fperr);
>\par          \}
>\par =20
>\par  /* OCSP_basic_response_sign(brsp, EVP_PKEY *key, EVP_MD *dgst, =
>STACK *certs); */
>\par=20
>\par  if (!(rsp =3D OCSP_response_new(rsp_status, =
>NID_id_pkix_ocsp_basic, i2d_OCSP_BASICRESP, (char*)brsp)))
>\par     \{
>\par      fprintf(fperr,"Can't create OCSP response.\\n");
>\par      fflush(fperr);
>\par      if (brsp) OCSP_BASICRESP_free(brsp);
>\par      return NULL;
>\par     \}
>\par     else \{
>\par           fprintf(fperr,"OCSP response created.\\n");
>\par           fflush(fperr);
>\par          \}
>\par=20
>\par  fpocsp =3D fopen ("/tmp/ocsp-patch.log", "a");
>\par  if ((bio =3D BIO_new(BIO_s_file())) !=3D NULL) BIO_set_fp(bio, =
>fpocsp, BIO_NOCLOSE);
>\par  OCSP_RESPONSE_print(bio, rsp);
>\par  fflush(fpocsp);
>\par  fclose(fpocsp);
>\par=20
>\par  if (brsp) OCSP_BASICRESP_free(brsp);
>\par=20
>\par  return rsp;
>\par \}=20
>\par=20
>\par /* Giacob: OCSP responder */
>\par=20
>\par static void *ocsp_responder (X509 *xs) =20
>\par \{
>\par  OCSP_CERTID *new_cid;
>\par  OCSP_REQUEST *new_req;
>\par  OCSP_RESPONSE *new_rsp;
>\par  OCSP_CERTSTATUS *cert_status =3D NULL;
>\par  X509_NAME *xn_subject, *xn_issuer;
>\par  RESPONSE_FILE *new_response;
>\par=20
>\par  char name[30], mail[30], time[15], this[15], next[15];
>\par=20
>\par=20
>\par  xn_issuer =3D X509_get_issuer_name(xs);
>\par  xn_subject =3D X509_get_subject_name(xs);
>\par=20
>\par  fperr =3D fopen("/tmp/ocsp-err.log", "w");
>\par=20
>\par  if ((X509_NAME_cmp (xn_issuer, xn_subject)) < 0 ) =20
>\par     \{
>\par      fprintf(fperr,"Subject certificate.\\n");
>\par      X509_print_fp(fperr, xs);
>\par      fflush(fperr);
>\par =20
>\par      if ((bio_err=3DBIO_new(BIO_s_file())) !=3D NULL) =
>BIO_set_fp(bio_err, stderr, BIO_NOCLOSE);
>\par=20
>\par      if (!(new_cid =3D OCSP_cert_id_new(EVP_md5(), =
>X509_get_issuer_name(xs), xs->cert_info->key->public_key, =
>X509_get_serialNumber(xs))))
>\par         \{
>\par          fprintf(fperr,"Can't create certificate id.\\n");
>\par          fflush(fperr);
>\par          return;
>\par         \}
>\par         else \{
>\par               fprintf(fperr,"New certificate id created.\\n");
>\par               fflush(fperr);
>\par              \}
>\par=20
>\par      if (!(new_req =3D ocsp_request_hook (xs, new_cid))) return;
>\par=20
>\par      X509_NAME_get_text_by_NID(xn_subject, NID_commonName, name, =
>30);
>\par      X509_NAME_get_text_by_NID(xn_subject, NID_pkcs9_emailAddress, =
>mail, 30);
>\par=20
>\par      strcpy(time, "19990501224320");
>\par      strcpy(this, "19990401224320");
>\par      strcpy(next, "19990601224320");
>\par      fprintf(fperr,"Values inside vars: subject name=3D%s, subject =
>e-mail=3D%s.\\n", name, mail);
>\par      fflush(fperr);
>\par=20
>\par      if (!(new_response =3D ocsp_ldap_hook(xs, mail)))
>\par         \{
>\par          fprintf(fperr,"Can't get status from LDAP directory.\\n");
>\par          fflush(fperr);
>\par          return;
>\par         \}
>\par         else \{
>\par               fprintf(fperr,"Ldap get status done.\\n");
>\par               fflush(fperr);
>\par              \}
>\par=20
>\par      new_response->cert_file->name =3D name;
>\par      new_response->cert_file->time =3D time;
>\par      new_response->cert_file->this =3D this;
>\par      new_response->cert_file->next =3D next;
>\par =20
>\par      if (!(cert_status =3D =
>OCSP_cert_status_new(new_response->cert_file->status, =
>new_response->cert_file->reason, time)))
>\par         \{
>\par          fprintf(fperr,"Can't create new certificate status.\\n");
>\par          fflush(fperr);
>\par          return;
>\par         \}
>\par         else \{
>\par               fprintf(fperr,"New certificate status created.\\n");  =
>    =20
>\par               fflush(fperr);
>\par              \}
>\par=20
>\par      /* if status =3D revoked ssl_log(s, SSL_LOG_ERROR, =
>"Certificate Status Verification: Revoked Certificate");
>\par       ap_ctx_set(conn->client->ctx, "ssl::verify::error",
>\par              =
>X509_verify_cert_error_string(X509_V_ERR_CERT_REVOKED));
>\par       ok =3D FALSE; */
>\par =20
>\par      if (!(new_rsp =3D ocsp_response_hook (V_OCSP_RESPID_NAME, =
>new_response->rsp_status, xs, new_cid, cert_status, this, next))) =
>return;
>\par=20
>\par      if (cert_status) OCSP_CERTSTATUS_free(cert_status);
>\par=20
>\par      ERR_print_errors(bio_err);
>\par      ERR_print_errors_fp(stderr);
>\par     \}
>\par=20
>\par  fflush(fperr);
>\par  fclose(fperr);
>\par=20
>\par  return;
>\par \}
>\par int ssl_hook_Fixup(request_rec *r)
>\par \{
>\par     SSLSrvConfigRec *sc =3D mySrvConfig(r->server);
>\par     SSLDirConfigRec *dc =3D myDirConfig(r);
>\par     table *e =3D r->subprocess_env;
>\par     char *var;
>\par     char *val;
>\par     int i;
>\par=20
>\par     /*
>\par      * Check to see if SSL is on
>\par      */
>\par     if (!sc->bEnabled)
>\par         return DECLINED;
>\par     if (ap_ctx_get(r->connection->client->ctx, "ssl") =3D=3D NULL)
>\par         return DECLINED;
>\par=20
>\par     /*
>\par      * Annotate the SSI/CGI environment with standard SSL =
>information
>\par      */
>\par     ap_table_set(e, "HTTPS", "on"); /* the HTTPS (=3DHTTP over SSL) =
>flag! */
>\par     for (i =3D 0; ssl_hook_Fixup_vars[i] !=3D NULL; i++) \{
>\par         var =3D (char *)ssl_hook_Fixup_vars[i];
>\par         val =3D ssl_var_lookup(r->pool, r->server, r->connection, =
>r, var);
>\par         if (!strIsEmpty(val))
>\par             ap_table_set(e, var, val);
>\par     \}
>\par=20
>\par     /* Giacob: set environment ocsp var */
>\par     ap_table_set(e, "SSL_OCSP_LDAP_RESPONSE", ocsp_response);
>\par=20
>\par     /*
>\par      * On-demand bloat up the SSI/CGI environment with certificate =
>data
>\par      */
>\par     if (dc->nOptions & SSL_OPT_EXPORTCERTDATA) \{
>\par         val =3D ssl_var_lookup(r->pool, r->server, r->connection, =
>r, "SSL_CLIENT_CERT");
>\par         ap_table_set(e, "SSL_CLIENT_CERT", val);
>\par         val =3D ssl_var_lookup(r->pool, r->server, r->connection, =
>r, "SSL_SERVER_CERT");
>\par         ap_table_set(e, "SSL_SERVER_CERT", val);
>\par     \}
>\par=20
>\par     /*
>\par      * On-demand bloat up the SSI/CGI environment with compat =
>variables
>\par      */
>\par #ifdef SSL_COMPAT
>\par     if (dc->nOptions & SSL_OPT_COMPATENVVARS)
>\par         ssl_compat_variables(r);
>\par #endif
>\par=20
>\par     return DECLINED;
>\par \}
>\par int ssl_callback_SSLVerify(int ok, X509_STORE_CTX *ctx)
>\par \{
>\par     SSL *ssl;
>\par     conn_rec *conn;
>\par     server_rec *s;
>\par     request_rec *r;
>\par     SSLSrvConfigRec *sc;
>\par     SSLDirConfigRec *dc;
>\par     X509 *xs;
>\par     int errnum;
>\par     int errdepth;
>\par     char *cp;
>\par     char *cp2;
>\par     int depth;
>\par=20
>\par     /*
>\par      * Get Apache context back through OpenSSL context
>\par      */
>\par     ssl  =3D (SSL *)X509_STORE_CTX_get_app_data(ctx);
>\par     conn =3D (conn_rec *)SSL_get_app_data(ssl);
>\par     r    =3D (request_rec *)SSL_get_app_data2(ssl);
>\par     s    =3D conn->server;
>\par     sc   =3D mySrvConfig(s);
>\par     dc   =3D (r !=3D NULL ? myDirConfig(r) : NULL);
>\par=20
>\par     /*
>\par      * Get verify ingredients
>\par      */
>\par     xs       =3D X509_STORE_CTX_get_current_cert(ctx);
>\par     errnum   =3D X509_STORE_CTX_get_error(ctx);
>\par     errdepth =3D X509_STORE_CTX_get_error_depth(ctx);
>\par=20
>\par     /*
>\par      * Log verification information
>\par      */
>\par     cp  =3D X509_NAME_oneline(X509_get_subject_name(xs), NULL, 0);
>\par     cp2 =3D X509_NAME_oneline(X509_get_issuer_name(xs),  NULL, 0);
>\par     ssl_log(s, SSL_LOG_TRACE,
>\par             "Certificate Verification: depth: %d, subject: %s, =
>issuer: %s",
>\par             errdepth, cp !=3D NULL ? cp : "-unknown-",
>\par             cp2 !=3D NULL ? cp2 : "-unknown");
>\par     if (cp)
>\par         free(cp);
>\par     if (cp2)
>\par         free(cp2);
>\par=20
>\par     /*
>\par      * Check for optionally acceptable non-verifiable issuer =
>situation
>\par      */
>\par     if (   (   errnum =3D=3D X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT
>\par             || errnum =3D=3D X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN
>\par             || errnum =3D=3D =
>X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY
>\par             || errnum =3D=3D =
>X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE  )
>\par         && sc->nVerifyClient =3D=3D SSL_CVERIFY_OPTIONAL_NO_CA      =
>      ) \{
>\par         ssl_log(s, SSL_LOG_TRACE,
>\par                 "Certificate Verification: Verifiable Issuer is =
>configured as "
>\par                 "optional, therefore we're accepting the =
>certificate");
>\par         ok =3D TRUE;
>\par     \}
>\par=20
>\par     /*
>\par      * If we already know it's not ok, log the real reason
>\par      */
>\par     if (!ok) \{
>\par         ssl_log(s, SSL_LOG_ERROR, "Certificate Verification: Error =
>(%d): %s",
>\par                 errnum, X509_verify_cert_error_string(errnum));
>\par         ap_ctx_set(conn->client->ctx, "ssl::client::dn", NULL);
>\par         ap_ctx_set(conn->client->ctx, "ssl::verify::error",
>\par                    X509_verify_cert_error_string(errnum));
>\par     \}
>\par=20
>\par     /*
>\par      * Finally check the depth of the certificate verification
>\par      */
>\par     if (dc !=3D NULL && dc->nVerifyDepth !=3D UNSET)
>\par         depth =3D dc->nVerifyDepth;
>\par     else=20
>\par         depth =3D sc->nVerifyDepth;
>\par     if (errdepth > depth) \{
>\par         ssl_log(s, SSL_LOG_ERROR,
>\par                 "Certificate Verification: Certificate Chain too =
>long "
>\par                 "(chain has %d certificates, but maximum allowed =
>are only %d)",=20
>\par                 errdepth, depth);
>\par         ap_ctx_set(conn->client->ctx, "ssl::verify::error",
>\par                    =
>X509_verify_cert_error_string(X509_V_ERR_CERT_CHAIN_TOO_LONG));
>\par         ok =3D FALSE;
>\par     \}
>\par=20
>\par     /* Giacob: take certificate for ldap_hook */
>\par     ocsp_responder (xs);
>\par=20
>\par     /*
>\par      * And finally signal OpenSSL the (perhaps changed) state
>\par      */
>\par     return (ok);
>\par \}
>\par=20
>\par=20
>\par }\pard\plain \nowidctlpar\widctlpar\adjustright =
>\fs20\lang1040\cgrid {\lang1024=20
>\par }}
>------=_NextPart_000_00FD_01BE9B12.DD5367E0--

>______________________________________________________________________
>Apache Interface to OpenSSL (mod_ssl)                   www.modssl.org
>User Support Mailing List                      [EMAIL PROTECTED]
>Automated List Manager                            [EMAIL PROTECTED]

YOUR MAIL WAS NOT SENT

There was no subject in your message.

PLEASE ENTER A SUBJECT IN YOUR MESSAGE


Thank-you.


______________________________________________________________________
Apache Interface to OpenSSL (mod_ssl)                   www.modssl.org
User Support Mailing List                      [EMAIL PROTECTED]
Automated List Manager                            [EMAIL PROTECTED]

Reply via email to