Pregunta

Tengo una aplicación de trabajo que establece una conexión SSL con el servidor. El servidor utiliza un certificado autofirmado y las cargas de los clientes de una cadena de autoridad de certificación para decirle que el servidor está bien para la confianza. Lo hice con el código como este en el cliente:

SSL_METHOD* method = TLSv1_client_method();
_ctx = SSL_CTX_new(method);
if ( SSL_CTX_load_verify_locations(_ctx, "ca-all.crt", NULL) != 1 )
{
    return false;
}
_ssl = SSL_new(_ctx);
int val = SSL_set_fd(_ssl, _socket->GetFD());
if ( val != SSL_SUCCESS )
{
    int err = SSL_get_error(_ssl, val);
    return false;
}
val = SSL_connect(_ssl);

Y en el servidor:

  if ( SSL_CTX_use_certificate_chain_file( g_ctx, "ca-chain1.crt" ) <= 0 ) {
    return 1;
  }
  ppem_file = getenv( "PEM_FILE" );
  if ( ppem_file == NULL ) {
    ppem_file = pem_file;
  }
  if ( SSL_CTX_use_certificate_file( g_ctx, ppem_file,
                                     SSL_FILETYPE_PEM ) <= 0 ) {
    return 1;
  }
  if ( SSL_CTX_use_PrivateKey_file( g_ctx, ppem_file,
                                    SSL_FILETYPE_PEM ) <= 0 ) {
    return 2;
  }

Estoy intentando modificar el código para que el servidor también verifica el certificado de pares del cliente (auto-firmado, el uso de un mismo emisor como el servidor) y teniendo un poco de problemas. No he encontrado buena "visión general conceptual" en cualquier documentación, y que parece ser un obstáculo típico con las bibliotecas de OpenSSL.

En el cliente que añade esto después de las SSL_CTX_load_verify_locations () llamada:

if ( SSL_CTX_use_certificate_file(_ctx, "generic_client.pem", SSL_FILETYPE_PEM ) != 1 )
{
    return false;
}

En el servidor que añade esto después de la SSL_CTX_use_PrivateKey_file () llamada:

  STACK_OF(X509_NAME) *list;
  list = SSL_load_client_CA_file( "ca_chain2.crt" );
  if( list == NULL ) {
    return 4;
  }
  SSL_CTX_set_client_CA_list( g_ctx, list );
  SSL_CTX_set_verify( g_ctx, SSL_VERIFY_PEER, NULL );

La conexión falla porque el certificado no valida. El cliente parece cargar la multa certificado y si me comente la línea SSL_CTX_set_verify, se conecta el cliente sin problemas (ya que su certificado no se verifica).

Parece que el servidor no cree que la cadena de autoridad de certificación del cliente es buena. Lo que me estoy perdiendo aquí?

Desde la línea de comandos que se puede ejecutar: OpenSSL verificar -CAfile generic_client.pem ca-chain2.crt Y pasa, así que tengo los datos de los certificados adecuados disponibles, sólo debe utilizar mal de alguna manera.

¿Fue útil?

Solución

En el servidor, también debe llamar SSL_CTX_load_verify_locations(). Esta función le dice al servidor qué certificados de usar para la verificación del certificado; la función SSL_CTX_set_client_CA_list() establece la lista de entidades de certificación autorizadas que se envían al cliente en el saludo. Ambos son necesarios.

(También necesita una llamada SSL_CTX_use_PrivateKey_file() en el cliente, después de la llamada use_certificate_file, pero yo supongo que están haciendo eso y sólo dejó fuera).

Otros consejos

SSL_CTX_set_client_CA_list establece el CA lista. Un certificado CA, por definición, es distinta de un certificado de usuario (por ejemplo que tiene el conjunto de bits CA). Así que recomiendo crear una CA adecuada (cuyo certificado CA es autofirmado), y el uso que para firmar el cliente y el certificado del servidor. Asumo que OpenSSL no está a la espera de que el cliente va a utilizar realmente el certificado de CA para la comunicación también.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top