2011-05-25 12 views
5

Estoy utilizando el siguiente recorte para configurar el certificado y la clave para la autenticación del cliente.No se puede usar libcurl para acceder a un sitio que requiere la autenticación del cliente

curl_easy_setopt(curl,CURLOPT_SSLCERT,"clientCert.pem"); 
    curl_easy_setopt(curl,CURLOPT_SSLCERTPASSWD,"changeit"); 
    curl_easy_setopt(curl,CURLOPT_SSLCERTTYPE,"PEM"); 
    curl_easy_setopt(curl,CURLOPT_SSLKEY,"privateKey.pem"); 
    curl_easy_setopt(curl,CURLOPT_SSLKEYPASSWD,"changeit"); 
    curl_easy_setopt(curl,CURLOPT_SSLKEYTYPE,"PEM"); 

El certificado no tiene una contraseña, no sé qué en la tierra existe la opción SSLCERTPASSWD, que acaba de proporcionar un valor ficticio. Cuando ejecuto el programa en Linux me aparece un código de error de 58 y un mensaje de error incapaz de fijar archivo de clave privada: 'privateKey.pem' tipo PEM

En Windows sin embargo me sale no puede utilizar certificados de cliente (no se ha encontrado ninguna clave o una contraseña incorrecta?)

Parece sugerir que el certificado y la clave no coinciden, pero no sé cómo. He extraído tanto el certificado como la clave de un archivo p12 usando comandos openssl. El comando que utiliza para extraer la clave es

openssl.exe pkcs12 -in client.p12 -nocerts -out privateKey.pem 

y el comando utilizado para extraer el CERT es

openssl.exe pkcs12 -in client.p12 -nokeys -out clientCert.pem 

El archivo de p12 se ha utilizado con éxito en un navegador para acceder a la url de autenticación de cliente. Por favor ayuda antes de dispararme.

Editar: Aquí está la prueba de que la clave privada y el certificado se corresponden entre sí:

[[email protected] ~/curlm]$ openssl x509 -noout -modulus -in clientCert.pem | openssl md5 
d7207cf82b771251471672dd54c59927 

[[email protected] ~/curlm]$ openssl rsa -noout -modulus -in privateKey.pem | openssl md5 
Enter pass phrase for privateKey.pem: 
d7207cf82b771251471672dd54c59927 

¿Por qué no puede funcionar?

+1

Estoy enfrentando el mismo resultado con el curl de la línea de comandos. Concatené el certificado y la clave del cliente en un archivo y lo intenté de la siguiente manera: curl --cert concatenatedCert.pem --cert-type PEM --cacert cabundle.crt https: // inaveo: 8775/DataIntegrationService/WebService/WS_test/ Enter Frase de contraseña PEM: curl: (58) no se puede establecer el archivo de clave privada: tipo'concatenatedCert.pem 'PEM –

Respuesta

3

Usando el curl de la línea de comando, tengo el mismo error usando un archivo .pem que también se obtuvo con openssl de un archivo p12. El p12 también pudo funcionar correctamente al autenticar al cliente cuando se importó en un navegador. Tal como lo describiste, creo.

Mi problema fue causado porque el archivo .pem no estaba enumerando los certificados en el orden correcto: parece que cada certificado en el archivo debe ser seguido por su certificado de emisor. Edité el archivo y cambié el orden de las secciones y Curl se mostró feliz.

Para el registro, mi archivo .p12 original se obtuvo haciendo una copia de seguridad de un certificado de Firefox.

También tenga en cuenta que en mi caso, no estaba consiguiendo pedirá la contraseña y estaba recibiendo la

curl: (58) unable to set private key file: 'alice.pem' type PEM 

antes de la solicitud de contraseña

+0

Muchas gracias ... –

2

que estaba frente a problemas similares, descubrí que el problema era relacionado con permisos de archivos del certificado y archivos de claves privadas. El proceso que ejecuta PHP no tiene acceso de lectura a esos archivos.

Una cosa que usted puede intentar (y eso me ayudó a calcular esto) es ejecutar el siguiente código:

$result=openssl_get_privatekey('file://path/to/private/key.pem','password'); 

y comprobar si el valor devuelto no es falsa y no hay errores.Obtenía:

file_get_contents(/path/to/private/key.pem): failed to open stream: Permission denied 
0

Gracias Hugh por el hilo y raugfer por la pista de openssl. Lo posterior: a la vez útil y engañoso. ;-)

En realidad, he resuelto el problema asegurándome de que la ruta del archivo de la clave es correcta. Y aquí está por qué la sugerencia de openssl fue engañosa, a pesar de ayudarme a verificar si mi archivo PEM estaba bien:

cURL necesita la ruta completa, pero sin el prefijo 'file: //'. Mientras fopen está contento con una ruta relativa, cURL no. Entonces, todas mis pruebas para abrir el archivo de clave habían sido exitosas, mientras que cURL no.

BTW .:

curl_easy_setopt(curl,CURLOPT_SSLCERTPASSWD,"changeit"); 
curl_easy_setopt(curl,CURLOPT_SSLCERTTYPE,"PEM"); 
curl_easy_setopt(curl,CURLOPT_SSLKEYTYPE,"PEM"); 

no son necesarios, ya que la contraseña sólo se utiliza para descifrar la clave privada y PEM es el valor predeterminado.

Cuestiones relacionadas