Question

J'ai une application de travail qui établit une connexion SSL à un serveur. Le serveur utilise un certificat auto-signé et les charges du client une chaîne d'autorité de certification pour lui dire que le serveur est OK pour la confiance. Je l'ai fait avec le code comme celui-ci sur le 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);

Et sur le serveur:

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

Je suis en train de modifier ce code afin que le serveur vérifie également le certificat de pairs du client (auto-signé, en utilisant un même émetteur que le serveur) et ayant un peu de mal. Je n'ai pas trouvé une bonne documentation « aperçu conceptuel » partout, et qui semble être un obstacle typique avec les bibliothèques OpenSSL.

Sur le client j'ajouté après les SSL_CTX_load_verify_locations () appel:

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

Sur le serveur j'ajouté après l'appel SSL_CTX_use_PrivateKey_file ():

  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 connexion échoue car le certificat ne valide pas. Le client semble charger l'amende de certificat et si je commente la ligne SSL_CTX_set_verify, le client se connecte sans problème (parce que son certificat est jamais vérifié).

Il semble que le serveur ne pense pas que la chaîne d'autorité de certification du client est bon. Qu'est-ce que je manque ici?

De la ligne de commande, je peux courir: OpenSSL vérifier -CAfile ca-chain2.crt generic_client.pem Et il passe, donc j'ai les données de certificats de droit disponibles, je dois juste utiliserai mal en quelque sorte.

Était-ce utile?

La solution

Sur le serveur, vous devez également appeler SSL_CTX_load_verify_locations(). Cette fonction indique au serveur de certificats à utiliser pour la vérification des certificats; la fonction SSL_CTX_set_client_CA_list() établit la liste des autorités de certification autorisés qui sont envoyés au client dans la poignée de main. Les deux sont nécessaires.

(Vous devez également un appel SSL_CTX_use_PrivateKey_file() sur le client, après l'appel use_certificate_file, mais je suppose que vous faites cela et juste à gauche dehors).

Autres conseils

SSL_CTX_set_client_CA_list définit le CA liste. Un certificat de CA, par définition, est distinct d'un certificat d'utilisateur (par exemple, il a l'ensemble de bits de CA). Je vous recommande de créer une autorité de certification appropriée (dont le certificat CA est auto-signé), et l'utiliser pour signer à la fois le client et le certificat de serveur. Je suppose que OpenSSL ne s'y attend pas que le client utilisera effectivement le certificat CA pour la communication aussi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top