x509 certificates

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Sergiu

    x509 certificates

    Hi PHP folks,

    Does anybody know a way to read the extension fields from a x509
    certificate?
    Maybe there is a better PHP module than openssl.
    Until a better sollution came up, I did some changes to the openssl
    PHP module,
    I added the following lines, but here is still more to work (I hope
    some developer from PHP hear me and give me a help):

    Thanks in advance.
    Sergiu.

    /* {{{ proto array openssl_x509_pa rse(mixed x509 [, bool
    shortnames=true])
    Returns an array of the fields/values of the CERT */
    PHP_FUNCTION(op enssl_x509_pars e)
    {
    zval * zcert;
    X509 * cert = NULL;
    long certresource = -1;
    int i;
    zend_bool useshortnames = 1;
    char * tmpstr;
    zval * subitem;
    X509_EXTENSION *extension;
    ASN1_OCTET_STRI NG *extdata;
    char extstr[20];

    if (zend_parse_par ameters(ZEND_NU M_ARGS() TSRMLS_CC, "z|b", &zcert,
    &useshortnam es) == FAILURE)
    return;

    cert = php_openssl_x50 9_from_zval(&zc ert, 0, &certresourc e
    TSRMLS_CC);
    if (cert == NULL)
    RETURN_FALSE;

    array_init(retu rn_value);

    if (cert->name)
    add_assoc_strin g(return_value, "name", cert->name, 1);
    /* add_assoc_bool( return_value, "valid", cert->valid); */

    add_assoc_name_ entry(return_va lue, "subject",
    X509_get_subjec t_name(cert), useshortnames TSRMLS_CC);
    /* hash as used in CA directories to lookup cert by subject name */
    {
    char buf[32];
    snprintf(buf, sizeof(buf), "%08lx", X509_subject_na me_hash(cert));
    add_assoc_strin g(return_value, "hash", buf, 1);
    }

    add_assoc_name_ entry(return_va lue, "issuer",
    X509_get_issuer _name(cert), useshortnames TSRMLS_CC);
    add_assoc_long( return_value, "version", X509_get_versio n(cert));
    add_assoc_long( return_value, "serialNumb er",
    ASN1_INTEGER_ge t(X509_get_seri alNumber(cert)) );

    add_assoc_asn1_ string(return_v alue, "validFrom" ,
    X509_get_notBef ore(cert));
    add_assoc_asn1_ string(return_v alue, "validTo",
    X509_get_notAft er(cert));

    add_assoc_long( return_value, "validFrom_time _t",
    asn1_time_to_ti me_t(X509_get_n otBefore(cert) TSRMLS_CC));
    add_assoc_long( return_value, "validTo_time_t ",
    asn1_time_to_ti me_t(X509_get_n otAfter(cert) TSRMLS_CC));

    tmpstr = X509_alias_get0 (cert, NULL);
    if (tmpstr)
    add_assoc_strin g(return_value, "alias", tmpstr, 1);

    /*
    add_assoc_long( return_value, "signaturetypeL ONG",
    X509_get_signat ure_type(cert)) ;
    add_assoc_strin g(return_value, "signaturetype" ,
    OBJ_nid2sn(X509 _get_signature_ type(cert)), 1);
    add_assoc_strin g(return_value, "signaturetypeL N",
    OBJ_nid2ln(X509 _get_signature_ type(cert)), 1);
    */
    MAKE_STD_ZVAL(s ubitem);
    array_init(subi tem);

    /* NOTE: the purposes are added as integer keys - the keys match up
    to the X509_PURPOSE_SS L_XXX defines
    in x509v3.h */
    for (i = 0; i < X509_PURPOSE_ge t_count(); i++) {
    int id, purpset;
    char * pname;
    X509_PURPOSE * purp;
    zval * subsub;

    MAKE_STD_ZVAL(s ubsub);
    array_init(subs ub);

    purp = X509_PURPOSE_ge t0(i);
    id = X509_PURPOSE_ge t_id(purp);

    purpset = X509_check_purp ose(cert, id, 0);
    add_index_bool( subsub, 0, purpset);

    purpset = X509_check_purp ose(cert, id, 1);
    add_index_bool( subsub, 1, purpset);

    pname = useshortnames ? X509_PURPOSE_ge t0_sname(purp) :
    X509_PURPOSE_ge t0_name(purp);
    add_index_strin g(subsub, 2, pname, 1);

    /* NOTE: if purpset > 1 then it's a warning - we should mention it ?
    */

    add_index_zval( subitem, id, subsub);
    }
    add_assoc_zval( return_value, "purposes", subitem);

    /* Adding extension support by Sergiu */
    add_assoc_strin g(return_value, "extensions added", "true", 1);
    for (i = 0; i < X509_get_ext_co unt(cert); i++) {
    extension = X509_get_ext(ce rt, i);
    extdata = X509_EXTENSION_ get_data(extens ion);
    sprintf(extstr, "ext%i", i);
    add_assoc_asn1_ string(return_v alue, extstr, extdata);
    }

    if (certresource == -1 && cert)
    X509_free(cert) ;

    }
    /* }}} */
Working...