En lugar de generar un primer par de claves en su cliente (que parece descartar después de este procedimiento) y generar otro par de claves en el servidor para producir el certificado, podría:
- generar un solo par de claves en el cliente,
- convertir su clave pública en una solicitud de certificación,
- envíelo a través de HTTPS con la información de registro al servicio de su emisor,
- haga que el servicio emita el certificado y lo devuelva,
- el cliente asocia el certificado con la clave privada.
Todo esto se puede hacer directamente dentro de un navegador, por ejemplo, pero también lo pueden hacer otros clientes, como su cliente personalizado basado en SOAP. Tiene la ventaja de que la clave privada nunca abandona la parte destinada a retenerla: el cliente ni siquiera necesita confiar en que el servicio del emisor no haya guardado una copia.
Siempre que confíe en la conexión HTTPS para asegurarse de que la información de registro se envió con esta solicitud de certificación en particular, su mecanismo de verificación inicial estará bien.
EDIT:
Después de los comentarios, parece que no desea que sus claves privadas se guarden en depósito en su servidor emisor de todos modos. En este caso, no tiene sentido correr el riesgo de transmitir la clave privada. No está ganando nada generando el par de claves de certificado en el servidor; en todo caso, está aumentando el riesgo (aunque limitado por el hecho de que está transmitiendo esa clave privada a través de HTTPS de todos modos).
Cuando emite un certificado, el punto que realmente importa es el enlace entre la información del solicitante y la clave pública que terminará en el certificado, precisamente porque la parte emisora es firmar la aserción de ese enlace al formar un certificado .
De lo que realmente quiere asegurarse es que la clave pública utilizada para el certificado y la clave de registro compartida fuera de las bandas pertenezcan a la misma persona. Desde ese punto de vista, si le dan su clave pública, o si la genera y se la devuelve (con la clave privada) es lo mismo. Transmitir la clave privada de una forma u otra en este esquema es simplemente innecesario.
Todo lo que necesita hacer es obtener la clave pública de la solicitud / solicitud (en el sentido de que el usuario solicita / solicita el certificado), verifique que venga con el secreto de registro correcto y emita el certificado. Puede obtener esta clave pública de una CSR o simplemente como una clave pública simple si lo desea. (Los detalles de lo que el solicitante pudo haber puesto en el CSR son apenas relevantes, cualquier buena CA debe descartarlo y solo poner lo que ha verificado de las bandas en el certificado de todos modos).
Si el cliente ha verificado que la conexión HTTPS a su servidor está configurada correctamente: conjuntos de cifrado suficientemente sólidos, desactivando la compresión TLS , y la correcta verificación del certificado, debe tener la garantía de que la información de registro secreta y la clave pública se unieron.