Domanda

Ho un'applicazione che lavora, che stabilisce una connessione SSL a un server. Il server utilizza un certificato auto-firmato e dei carichi del cliente una catena di un'autorità di certificazione per dirgli che il server è OK per la fiducia. L'ho fatto con il codice come questo sul client:

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);

E sul server:

  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;
  }

sto cercando di modificare questo codice in modo che il server verifica anche il certificato pari del client (auto-firmato, utilizzando uno stesso emittente come server) e avere un po 'di problemi. Non ho trovato bene "panoramica concettuale" della documentazione da nessuna parte, e che sembra essere un ostacolo tipico con le librerie OpenSSL.

Sul client ho aggiunto questo dopo le SSL_CTX_load_verify_locations () chiamata:

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

Sul server ho aggiunto questo dopo l'SSL_CTX_use_PrivateKey_file () chiamata:

  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 connessione non riesce perché il certificato non convalida. Il cliente sembra caricare il bel certificato e se io commento la linea SSL_CTX_set_verify, il collega client senza difficoltà (perché il relativo certificato non è mai verificata).

Sembra che il server non pensa che la catena autorità di certificazione del client è buona. Che cosa mi manca qui?

Dalla riga di comando posso correre: openssl verificare -CAfile generic_client.pem ca-chain2.crt E si passa, quindi non ho i dati del certificato giusti a disposizione, devo solo utilizzerò sbagliato in qualche modo.

È stato utile?

Soluzione

Sul server, è necessario chiamare SSL_CTX_load_verify_locations(). Questa funzione indica al server quale certificati da utilizzare per la verifica dei certificati; la funzione SSL_CTX_set_client_CA_list() imposta l'elenco di CA consentiti che vengono inviati al cliente nella stretta di mano. Entrambi sono necessari.

(È inoltre necessario una chiamata SSL_CTX_use_PrivateKey_file() sul client, dopo la chiamata use_certificate_file, ma io ti immagino che stai facendo e appena lasciato fuori).

Altri suggerimenti

SSL_CTX_set_client_CA_list imposta il CA . Un certificato CA, per definizione, è distinto da un certificato utente (ad esempio ha il bit impostato CA). Quindi vi consiglio di creare una corretta CA (il cui certificato CA è auto-firmato), e l'uso che a firmare sia il client e il certificato del server. Suppongo che OpenSSL non si aspetta che il cliente effettivamente utilizzare il certificato CA per la comunicazione anche.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top