REST con ssl

Hola cómo andan?
Estoy retomando nuevamente este asunto que me había quedado colgado el año pasado.
Ahora estamos por hacer una implementación con REST y es muy importante que podamos garantizar la seguridad durante el consumo de servicios web entre las aplicaciones.
Richard, seguí tus últimas indicaciones, y creo nos está faltando un detalle para que salga funcionando pero no podemos saber qué.
Paso a detallar la configuración de ambos extremos de la comunicación y nuestras dudas en cada caso. De momento estamos realizando prueba en local, de allí que coincida la ip para ambos servidores.

En la aplicación servidor de los web services tenemos lo siguiente:
servidor_usuarios.ini


[admin]
fingerprint = 078eb7355d61488272d27d3b2addbb0d896337c9 

El fingerprint lo calculamos usando la librería SIUToba\SSLCertUtils\SSLCertUtils;

Pregunta: El fingerprint que aquí debemos calcular, es a partir del certificado .crt del servidor o cliente? Nosotros probamos generando el fingerprint de ambos, pero no sabemos cuál es el que corresponde

servidor.ini

autenticacion = ssl

virtualhost sw.unpa.edu.ar.conf


<VirtualHost 192.168.10.241:443>

    ServerName sw.unpa.edu.ar
    Include /home/roberto/toba_2.7.2/vendor/siu-toba/framework/instalacion/toba.conf
 
    SSLEngine on


     SSLVerifyClient require
    SSLOptions +StdEnvVars +ExportCertData   

    
    SSLCertificateFile /home/roberto/certificados/CA/certificados/hubservicios.crt
    SSLCertificateKeyFile /home/roberto/certificados/CA/privado/hubservicios.key
    SSLCertificateChainFile /home/roberto/certificados/CA/certificados/ca.crt
    
</VirtualHost> 

En la aplicación cliente que consume los web service tenemos los siguiente

cliente.ini


[conexion]
;;Recuerde dejar una barra (/) al finalizar la URL
to = "https://sw.unpa.edu.ar/hub_servicios/1.0/rest/"
auth_tipo = "ssl"
cert_file = "/home/roberto/certificados/CA/certificados/hubservicios.crt"
key_file = "/home/roberto/certificados/CA/privado/hubservicios.key"
ca_cert= "/home/roberto/certificados/CA/certificados/ca.crt"

Pregunta: los certificados que hay que referenciar aquí son los del servidor de servicios web?

virtualhost tarjeta.unpa.edu.ar.conf


<VirtualHost 192.168.10.241:443>
    ServerName tarjeta.unpa.edu.ar
    Include /home/roberto/toba_2.7.2/vendor/siu-toba/framework/instalacion/toba.conf

    SSLEngine on
    SSLCertificateFile /home/roberto/certificados/CA/certificados/cliente.crt
    SSLCertificateKeyFile /home/roberto/certificados/CA/privado/cliente.key
    SSLCertificateChainFile /home/roberto/certificados/CA/certificados/ca.crt

</VirtualHost> 

Los certificados estamos seguros que funcionan, hemos hecho las siguientes pruebas para corroborar que permiten verificar la identidad de cada uno:
curl --cacert /home/roberto/certificados/CA/certificados/ca.crt -E /home/roberto/certificados/CA/cliente.pem https://tarjeta.unpa.edu.ar
curl -v --cacert /home/roberto/certificados/CA/certificados/ca.crt https://tarjeta.unpa.edu.ar

Estos comandos los hemos ejecutado para cada servidor. Con el sitio cliente tarjeta.unpa.edu.ar, los comando retornaron resultado satisfactorio. Sin embargo para el caso del servidor sw.unpa.edu.ar, con las variables: SSLVerifyClient y SSLOptions, seteadas, los comandos fallan. Cuando las quitamos, los comandos de verificación retornan resultado satisfactorio.

Algo similar ocurre al ejecutar la aplicación cliente. Cuando invocamos un web services desde el cliente, y el servidor posee las variables SSLVerifyClient y SSLOptions seteadas, retorna el siguiente error:


* Hostname was NOT found in DNS cache
*   Trying 192.168.10.241...
* Connected to sw.unpa.edu.ar (192.168.10.241) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: /home/roberto/certificados/CA/certificados/ca.crt
  CApath: /etc/ssl/certs
* error:14094418:SSL routines:SSL3_READ_BYTES:tlsv1 alert unknown ca
* Closing connection 0
PHP Fatal error:  Uncaught exception 'GuzzleHttp\Ring\Exception\ConnectException' with message 'cURL error 35: error:14094418:SSL routines:SSL3_READ_BYTES:tlsv1 alert unknown ca' in /home/roberto/toba_2.7.2/vendor/guzzlehttp/ringphp/src/Client/CurlFactory.php:126

Cuando quitamos las variables de la configuración del virtualhost del servidor, la verificación de certificados entendemos que funciona, pero lanza una excepción de acceso no autorizado:


* Hostname was NOT found in DNS cache
*   Trying 192.168.10.241...
* Connected to sw.unpa.edu.ar (192.168.10.241) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: /home/roberto/certificados/CA/certificados/ca.crt
  CApath: /etc/ssl/certs
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
* Server certificate:
*        subject: C=AR; ST=SANTA CRUZ; L=RIO GALLEGOS; O=UNPA; OU=PSTI; CN=sw.unpa.edu.ar; emailAddress=huelemu@unpa.edu.ar
*        start date: 2017-03-15 19:42:53 GMT
*        expire date: 2018-03-15 19:42:53 GMT
*        common name: sw.unpa.edu.ar (matched)
*        issuer: C=AR; ST=SANTA CRUZ; L=RIO GALLEGOS; O=UNPA; OU=PSTI; CN=www.unpa.edu.ar; emailAddress=huelemu@unpa.edu.ar
*        SSL certificate verify ok.
> GET /hub_servicios/1.0/rest/mapuche/agentes/29058990 HTTP/1.1
Host: sw.unpa.edu.ar
User-Agent: Guzzle/5.1.0 curl/7.38.0 PHP/5.6.24-0+deb8u1

< HTTP/1.1 401 Unauthorized
< Date: Thu, 16 Mar 2017 16:24:59 GMT
* Server Apache/2.4.10 (Debian) is not blacklisted
< Server: Apache/2.4.10 (Debian)
< API-Version: 1.0.0
< Content-Length: 85
< Content-Type: application/json
< 
* Connection #0 to host sw.unpa.edu.ar left intact
PHP Fatal error:  Uncaught exception 'GuzzleHttp\Exception\ClientException' with message 'Client error response [url] https://sw.unpa.edu.ar/hub_servicios/1.0/rest/mapuche/agentes/29058990 [status code] 401 [reason phrase] Unauthorized'

De acuerdo a la documentación de wiki, dichas variables son obligatorias para permitir el intercambio de certificados. Quizás nos estemos pasando por alto un paso para que funcione, pero no hemos podido encontrarle la vuelta

Espero nos puedan ayudar.
Saludos a todos