|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2006-09-21 23:45 UTC] zeph at purotesto dot it
Description: ------------ i need openssl api support for spkac now there's the possibility to sign a pkcs10 csr (created by explorer) but not an spkac created by firefox/mozilla/netscape/safary ... check www.openca.org for more information... i need that api to create something similar but more usable on the GOsa project http://gosa.gonicus.de by Guido Serra http://dev.purotesto.it/support/gosa GOsa CA Management plugin Patchesspki.patch (last revision 2011-12-22 10:41 UTC by jason dot gerfen at gmail dot com)Pull Requests
Pull requests:
HistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Wed Nov 05 19:00:01 2025 UTC |
Here is a patch to implement three new functions to help with verification of the SPKAC HTML keygen element. To patch: 1. Download PHP-5.3.8 2. Download patch from here (spki.patch) 3. Apply patch %> patch -p0 < spki.patch 4. Configure and compiled PHP %> ./configure --with-openssl=/path/to/openssl %> make && make install Test script: $key = openssl_pkey_new(array('digest_alg' => 'sha1', 'private_key_type' => OPENSSL_KEYTYPE_RSA, 'private_key_bits' => 2048)); if (function_exists('openssl_spki_new')){ $spki = openssl_spki_new($key, 'password'); echo $spki.'\n\r'; } if (function_exists('openssl_spki_verify')){ echo openssl_spki_verify(preg_replace('/SPKAC=/', '', $spki)).'\n\r'; } if (function_exists('openssl_spki_export')){ echo openssl_spki_export(preg_replace('/SPKAC=/', '', $spki)).'\n\r'; }I modified the test case and fixed a slight memory problem that would occasionally take place when allocating memory for the openssl_spki_new() return value. echo "Generating private key..."; $key = openssl_pkey_new(array('digest_alg' => 'sha1', 'private_key_type' => OPENSSL_KEYTYPE_RSA, 'private_key_bits' => 2048)); echo "done\n"; echo "============================\n"; echo "Creating SPKAC...\n"; if (function_exists('openssl_spki_new')){ $spki = openssl_spki_new($key, 'wtfd00d'); echo $spki; } echo "done\n"; echo "============================\n"; echo "SPKAC details...\n"; if (function_exists('openssl_spki_details')){ $x = (empty($_POST['spki-key'])) ? openssl_spki_details(preg_replace('/SPKAC=/', '', $spki)) : openssl_spki_details($_POST['spki-key']); var_dump($x); } echo "done\n"; echo "============================\n"; echo "Verifying SPKAC...\n"; if (function_exists('openssl_spki_verify')){ $y = (empty($_POST['spki-key'])) ? openssl_spki_verify(preg_replace('/SPKAC=/', '', $spki)) : openssl_spki_verify($_POST['spki-key']); var_dump($y); } echo "\n============================\n"; echo "Exporting public key from SPKAC...\n"; if (function_exists('openssl_spki_export')){ $z = (empty($_POST['spki-key'])) ? openssl_spki_export(preg_replace('/SPKAC=/', '', $spki)) : openssl_spki_export($_POST['spki-key']); var_dump($z); }<form id="spkac" name="spkac" method="post" action="openssl-spki.php"> <keygen name="spki-key" keytype="rsa" challenge="testing"></keygen> <input type="submit"> </form> <?php if (!empty($_POST['spki-key'])) { echo '<pre>'; print_r($_POST['spki-key']); echo '</pre>'; } if (empty($_POST['spki-key'])){ echo "Generating private key..."; $key = openssl_pkey_new(array('digest_alg' => 'sha1', 'private_key_type' => OPENSSL_KEYTYPE_RSA, 'private_key_bits' => 2048)); echo "done<br/>"; echo "============================<br/>"; } if (empty($_POST['spki-key'])){ echo "Creating SPKAC...<br/>"; if (function_exists('openssl_spki_new')){ $spki = openssl_spki_new($key, 'wtfd00d'); echo "<pre>".$spki."</pre>"; } echo "<br/>done<br/>"; echo "============================<br/>"; } echo "Verifying SPKAC...<br/>"; if (function_exists('openssl_spki_verify')){ $y = (empty($_POST['spki-key'])) ? openssl_spki_verify(preg_replace('/SPKAC=/', '', $spki)) : openssl_spki_verify($_POST['spki-key']); var_dump($y); } echo "<br/>============================<br/>"; echo "Exporting challenge from SPKAC...<br/>"; if (function_exists('openssl_spki_export_challenge')){ $x = (empty($_POST['spki-key'])) ? openssl_spki_export_challenge(preg_replace('/SPKAC=/', '', $spki)) : openssl_spki_export_challenge($_POST['spki-key']); echo $x; } echo "<br/>done<br/>"; echo "============================<br/>"; echo "Exporting public key from SPKAC...<br/>"; if (function_exists('openssl_spki_export')){ $z = (empty($_POST['spki-key'])) ? openssl_spki_export(preg_replace('/SPKAC=/', '', $spki)) : openssl_spki_export($_POST['spki-key']); echo '<pre>'; print_r($z); echo '</pre>'; } echo "<br/>============================<br/>"; echo "SPKAC details...<br/>"; if (function_exists('openssl_spki_details')){ $w = (empty($_POST['spki-key'])) ? openssl_spki_details(preg_replace('/SPKAC=/', '', $spki)) : openssl_spki_details($_POST['spki-key']); echo '<pre>'; print_r($w); echo '</pre>'; } echo "done<br/>"; echo "============================<br/>"; if (empty($_POST['spki-key'])){ openssl_free_key($key); } ?>This will test all five new functions unless you would like one test case per function? --TEST-- openssl_spki_new(), openssl_spki_verify(), openssl_spki_export(), openssl_spki_export_challenge(), openssl_spki_details() --SKIPIF-- <?php if (!extension_loaded("openssl")) die("skip"); if (!@openssl_pkey_new()) die("skip cannot create private key"); ?> --FILE-- <?php echo "Creating private key\n"; $key = openssl_pkey_new(); if ($key === false) die("failed to create private key\n"); echo "Creating new SPKAC\n"; if (!function_exists("openssl_spki_new")) die("openssl_spki_new() does not exist\n"); $spki = openssl_spki_new($key, "sample_challenge_string"); if ($spki === false) die("could not create spkac\n"); echo "Verifying SPKAC\n"; if (!function_exists("openssl_spki_verify")) die("openssl_spki_verify() does not exist\n"); $x = openssl_spki_verify(preg_replace("/SPKAC=/", "", $spki)); if ($x === false) die("could not verify spkac\n"); echo "Exporting challenge\n"; if (!function_exists("openssl_spki_export_challenge")) die("openssl_spki_export_challenge() does not exist\n"); $y = openssl_spki_export_challenge(preg_replace("/SPKAC=/", "", $spki)); if ($y !== "sample_challenge_string") die("could not verify challenge string from spkac\n"); echo "Exporting public key from SPKAC\n"; if (!function_exists("openssl_spki_export")) die("openssl_spki_export() does not exist\n"); $z = openssl_spki_export(preg_replace("/SPKAC=/", '', $spki)); if ($z === "") die("could not export public key from spkac\n"); echo "Generating details of SPKAC structure\n"; if (!function_exists("openssl_spki_details")) die("openssl_spki_details() does not exist\n"); $w = openssl_spki_details(preg_replace('/SPKAC=/', '', $spki)); if ($w === "") die("could not obtain details from spkac\n"); echo "OK!\n"; openssl_free_key($key); ?> --EXPECT-- Creating private key Creating new SPKAC Verifying SPKAC Exporting challenge Exporting public key from SPKAC Generating details of SPKAC structure OK!Please disregard my previous comment. I did a little more digging and am under the impression that adding the following to php_openssl_make_REQ() function should allow me to create a self signed certificate using the SPKAC NID like so? if (strcmp(strindex, "SPKAC") == 0) { if (!X509_NAME_add_entry_by_txt(subj, strindex, MBSTRING_ASC, (unsigned char*)Z_STRVAL_PP(item), -1, -1, 0)){ php_error_docref(NULL TSRMLS_CC, E_WARNING, "dn: add_entry_by_txt %s -> %s (failed)", strindex, Z_STRVAL_PP(item)); return FAILURE; } } Would you recommend another method? Please advise.