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) ;
}
/* }}} */
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) ;
}
/* }}} */