Mis explicaciones provienen de este PHP/Apache example. Es una explicación simplificada, mira el ejemplo original para más detalles.
El cliente genera una clave pública para el servidor y mantiene una clave privada.
<form>
<keygen name="pubkey" challenge="randomchars">
<input type="submit" name="createcert" value="Generate">
</form>
La clave pública se extrae por el servidor:
$key = $_REQUEST['pubkey'];
El servidor de construir un certificado de cliente:
$command = "/usr/bin/openssl ca -config ".$opensslconf." -days ".$days." -notext -batch -spkac ".$certfolder.$uniq.".spkac -out ".$certfolder.$uniq." -passin pass:'".$capw."' 2>&1";
$output = shell_exec($command);
y lo envía de vuelta al cliente.
A continuación, puede configurar Apache para permitir el acceso a los clientes autenticados:
SSLEngine on
SSLCipherSuite HIGH:MEDIUM
SSLCertificateFile /etc/CA/certs-pub/domain.der
SSLCertificateKeyFile /etc/CA/certs-priv/domain.pem
SSLCACertificateFile /etc/CA/certs-pub/ca.pem
SSLCARevocationFile /etc/CA/crl/cacrl.pem
<Location /secure_area/>
SSLVerifyClient require
SSLVerifyDepth 1
</Location>
¿Ha leído http://stackoverflow.com/questions/4501196/keygen-tag-in-html5? – atomicinf
Sí, he leído el enlace de arriba. Mi pregunta es generar el certificado en el servidor y enviarlo nuevamente para la autenticación del usuario. Estoy buscando un ejemplo completo que genere el certificado usando la clave pública de keygen – swingmicro
Luego habría visto: Esta especificación no especifica cómo se usará la clave privada generada. Se espera que después de recibir la estructura SignedPublicKeyAndChallenge (SPKAC), el servidor genere un certificado de cliente y lo vuelva a ofrecer al usuario para su descarga; este certificado, una vez descargado y almacenado en el almacén de claves junto con la clave privada, puede usarse para autenticarse en servicios que usan TLS y autenticación de certificado. – maxwellb