Changement pour OpenSSL dans PHP 5.6.x

Les enveloppes de flux vérifient désormais les certificats d'homologue et les noms d'hÎte par défaut lors de l'utilisation de SSL/TLS

Tous les flux clients cryptĂ©s activent dĂ©sormais la vĂ©rification par paire par dĂ©faut. Par dĂ©faut, ceci va utiliser le CA OpenSSL par dĂ©faut pour vĂ©rifier la paire de certificat. Dans la plupart des cas, aucune modification n'a besoin d'ĂȘtre faite pour communiquer avec des serveurs et des certificats SSL valides, sachant que les distributeurs configurent gĂ©nĂ©ralement OpenSSL pour utiliser les CA connus.

Le CA par dĂ©faut peut ĂȘtre Ă©crasĂ© sur une base globale en utilisant les options de configuration openssl.cafile ou openssl.capath, ou via une requĂȘte basique en utilisant les options de contexte cafile ou capath.

Bien que ce ne soit pas conseillĂ© en gĂ©nĂ©ral, il est possible de dĂ©sactiver la vĂ©rification de certificats par paire pour une requĂȘte en dĂ©finissant l'option de contexte verify_peer Ă  false, et pour dĂ©sactiver la validation du nom des paires, en configurant l'option de contexte verify_peer_name Ă  false.

Empreintes digitales de certificat

Le support a été ajouté pour extraire et vérifier les empreintes digitales des certificats. openssl_x509_fingerprint() a été ajouté pour extraire une empreinte digitale d'un certificat X.509 et deux options de contexte de flux SSL ont été ajoutées: capture_peer_cert pour capturer le certificat X.509 de l'homologue et peer_fingerprint pour certifier que le certificat de l'homologue doit correspondre à l'empreinte digitale donnée.

Chiffrements par défaut mis à jour

Les chiffrements par défaut utilisés par PHP ont été mis à jour vers une liste plus sécurisée basée sur les » recommandations de chiffrement de Mozilla, avec deux exclusions supplémentaires: chiffrements Diffie-Hellman anonymes et RC4.

Cette liste est accessible via la nouvelle constante OPENSSL_DEFAULT_STREAM_CIPHERS et peut ĂȘtre remplacĂ©e (comme dans les versions prĂ©cĂ©dentes de PHP) en dĂ©finissant l'option de contexte ciphers.

Compression désactivée par défaut

La compression SSL/TLS a Ă©tĂ© dĂ©sactivĂ©e par dĂ©faut pour attĂ©nuer l'attaque CRIME. PHP 5.4.13 a ajoutĂ© une option de contexte disable_compression pour permettre Ă  la compression d'ĂȘtre dĂ©sactivĂ©e: elle est maintenant dĂ©finie Ă  true (c'est-Ă -dire que la compression est dĂ©sactivĂ©e) par dĂ©faut.

Autoriser les serveurs à préférer leur ordre de chiffrement

L'option de contexte SSL honor_cipher_order a été ajoutée pour permettre aux serveurs de flux chiffrés d'atténuer les vulnérabilités de BEAST en préférant les chiffrements du serveur au client.

Accéder au protocole négocié et au chiffrement

Le protocole et le chiffrement qui ont Ă©tĂ© nĂ©gociĂ©s pour un flux chiffrĂ© peuvent dĂ©sormais ĂȘtre accĂ©dĂ©s via stream_get_meta_data() ou stream_context_get_options() lorsque l'option de contexte SSL capture_session_meta est dĂ©finie Ă  true.

<?php
$ctx
= stream_context_create(['ssl' => [
'capture_session_meta' => TRUE
]]);

$html = file_get_contents('https://google.com/', FALSE, $ctx);
$meta = stream_context_get_options($ctx)['ssl']['session_meta'];
var_dump($meta);
?>

L'exemple ci-dessus va afficher :

array(4) {
  ["protocol"]=>
  string(5) "TLSv1"
  ["cipher_name"]=>
  string(20) "ECDHE-RSA-AES128-SHA"
  ["cipher_bits"]=>
  int(128)
  ["cipher_version"]=>
  string(11) "TLSv1/SSLv3"
}

De nouvelles options pour la confidentialité persistante sur les serveurs de flux chiffrés

Les flux de clients chiffrés prennent déjà en charge la confidentialité persistante, car elle est généralement contrÎlée par le serveur. Les flux de serveurs chiffrés en PHP à l'aide de certificats capables d'une confidentialité persistante n'ont pas besoin de prendre d'autres mesures pour activer PFS ; toutefois, un certain nombre de nouvelles options de contexte SSL ont été ajoutées pour permettre un plus grand contrÎle sur PFS et traiter les problÚmes de compatibilité qui peuvent survenir.

ecdh_curve

Cette option permet de sélectionner une courbe spécifique à utiliser avec les chiffrements ECDH. Si elle n'est pas spécifiée, prime256v1 sera utilisé.

dh_param

Chemin d'accÚs à un fichier contenant des paramÚtres pour l'échange de clés Diffie-Hellman, tel que celui créé par la commande suivante :

openssl dhparam -out /path/to/my/certs/dh-2048.pem 2048
single_dh_use

Si définie à true, une nouvelle paire de clés sera créée lors de l'utilisation des paramÚtres Diffie-Hellman, améliorant ainsi la confidentialité persistante.

single_ecdh_use

Si définie à true, une nouvelle paire de clés sera toujours générée lors de la négociation des suites de chiffrement ECDH. Cela améliore la confidentialité persistante.

Sélection de la version SSL/TLS

Il est désormais possible de sélectionner des versions spécifiques de SSL et TLS via l'option de contexte SSL crypto_method ou en spécifiant un transport spécifique lors de la création d'une enveloppe de flux (par exemple, en appelant stream_socket_client() ou stream_socket_server()).

L'option de contexte SSL crypto_method accepte un masque de bits énumérant les protocoles qui sont autorisés, comme le fait le crypto_type de stream_socket_enable_crypto().

Versions de protocole sélectionnées et options correspondantes
Protocole(s) Drapeau client Drapeau serveur Transport
Toute version TLS ou SSL STREAM_CRYPTO_METHOD_ANY_CLIENT STREAM_CRYPTO_METHOD_ANY_SERVER ssl://
Toute version TLS STREAM_CRYPTO_METHOD_TLS_CLIENT STREAM_CRYPTO_METHOD_TLS_SERVER tls://
TLS 1.0 STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT STREAM_CRYPTO_METHOD_TLSv1_0_SERVER tlsv1.0://
TLS 1.1 STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT STREAM_CRYPTO_METHOD_TLSv1_1_SERVER tlsv1.1://
TLS 1.2 STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT STREAM_CRYPTO_METHOD_TLSv1_2_SERVER tlsv1.2://
SSL 3 STREAM_CRYPTO_METHOD_SSLv3_CLIENT STREAM_CRYPTO_METHOD_SSLv3_SERVER sslv3://
<?php

// Nécessitant TLS 1.0 ou mieux lors de l'utilisation de file_get_contents():
$ctx = stream_context_create([
'ssl' => [
'crypto_method' => STREAM_CRYPTO_METHOD_TLS_CLIENT,
],
]);
$html = file_get_contents('https://google.com/', false, $ctx);

// Nécessitant TLS 1.1 ou 1.2:
$ctx = stream_context_create([
'ssl' => [
'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT |
STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT,
],
]);
$html = file_get_contents('https://google.com/', false, $ctx);

// Connexion Ă  l'aide du transport de socket tlsv1.2://.
$sock = stream_socket_client('tlsv1.2://google.com:443/');

?>

Ajout de openssl_get_cert_locations()

La fonction openssl_get_cert_locations() a été ajoutée : elle renvoie les emplacements par défaut que PHP recherchera lors de la recherche de paquets CA.

<?php
var_dump
(openssl_get_cert_locations());
?>

L'exemple ci-dessus va afficher :

array(8) {
  ["default_cert_file"]=>
  string(21) "/etc/pki/tls/cert.pem"
  ["default_cert_file_env"]=>
  string(13) "SSL_CERT_FILE"
  ["default_cert_dir"]=>
  string(18) "/etc/pki/tls/certs"
  ["default_cert_dir_env"]=>
  string(12) "SSL_CERT_DIR"
  ["default_private_dir"]=>
  string(20) "/etc/pki/tls/private"
  ["default_default_cert_area"]=>
  string(12) "/etc/pki/tls"
  ["ini_cafile"]=>
  string(0) ""
  ["ini_capath"]=>
  string(0) ""
}

Support de SPKI

Le support a été ajouté pour générer, extraire et vérifier les clés et les défis publics signés (SPKAC). openssl_spki_new(), openssl_spki_verify(), openssl_spki_export_challenge() et openssl_spki_export() ont été ajoutées pour créer, vérifier la clé publique PEM d'exportation et le défi associé de SPKAC générés à partir d'un élément HTML5 KeyGen.

openssl_spki_new

GénÚre un nouveau SPKAC en utilisant la clé privée, la chaßne de défi et l'algorithme de hachage.

<?php
$pkey
= openssl_pkey_new();
openssl_pkey_export($pkey, 'secret passphrase');

$spkac = openssl_spki_new($pkey, 'challenge string');
?>

L'exemple ci-dessus va afficher :

SPKAC=MIIBXjCByDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA3L0IfUijj7+A8CPC8EmhcdNoe5fUAog7OrBdhn7EkxFButUp40P7+LiYiygYG1TmoI/a5EgsLU3s9twEz3hmgY9mYIqb/rb+SF8qlD/K6KVyUORC7Wlz1Df4L8O3DuRGzx6/+3jIW6cPBpfgH1sVuYS1vDBsP/gMMIxwTsKJ4P0CAwEAARYkYjViMzYxMTktNjY5YS00ZDljLWEyYzctMGZjNGFhMjVlMmE2MA0GCSqGSIb3DQEBAwUAA4GBAF7hu0ifzmjonhAak2FhhBRsKFDzXdKIkrWxVNe8e0bZzMrWOxFM/rqBgeH3/gtOUDRS5Fnzyq425UsTYbjfiKzxGeCYCQJb1KJ2V5Ij/mIJHZr53WYEXHQTNMGR8RPm7IxwVXVSHIgAfXsXZ9IXNbFbcaLRiSTr9/N4U+MXUWL7
openssl_spki_verify

Vérifie le SPKAC fourni.

<?php
$pkey
= openssl_pkey_new();
openssl_pkey_export($pkey, 'secret passphrase');

$spkac = openssl_spki_new($pkey, 'challenge string');
var_dump(openssl_spki_verify($spkac));
?>
openssl_spki_export_challenge

Exporte le défi associé au SPKAC fourni.

<?php
$pkey
= openssl_pkey_new();
openssl_pkey_export($pkey, 'secret passphrase');

$spkac = openssl_spki_new($pkey, 'challenge string');
$challenge = openssl_spki_export_challenge($spkac);
echo
$challenge;
?>

L'exemple ci-dessus va afficher :

challenge string
openssl_spki_export

Exporte la clé publique RSA au format PEM du SPKAC.

<?php
$pkey
= openssl_pkey_new();
openssl_pkey_export($pkey, 'secret passphrase');

$spkac = openssl_spki_new($pkey, 'challenge string');
echo
openssl_spki_export($spkac);
?>

L'exemple ci-dessus va afficher :

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcvQh9SKOPv4DwI8LwSaFx02h7
l9QCiDs6sF2GfsSTEUG61SnjQ/v4uJiLKBgbVOagj9rkSCwtTez23ATPeGaBj2Zg
ipv+tv5IXyqUP8ropXJQ5ELtbXPUN/gvw7cO5EbPHr/7eMhbpw8Gl+AfWxW5hLW8
MGw/+AwwjHBOwong/QIDAQAB
-----END PUBLIC KEY-----
add a note

User Contributed Notes

There are no user contributed notes for this page.