2017-10-13 11 views
0

Je sais que pendant l'établissement de liaison SSL normal, le client reçoit le certificat du serveur et le vérifie, puis utilise la clé publique du serveur pour chiffrer la clé de session.Comment un client peut-il utiliser le certificat du serveur pré-stocké pour établir une liaison SSL?

Je souhaite écrire un client SSL en langage C sous Linux. Lors de l'établissement de liaison SSL, il n'a pas besoin d'attendre le certificat du serveur et il envoie la clé de session chiffrée avec la clé publique du serveur qui a déjà été téléchargée précédemment. J'apprends à utiliser OpenSSL, j'ai seulement besoin de la partie do-handshake ici.

Merci pour votre attention. Pourquoi faire ça? Le FAI ou la passerelle peut censurer le certificat et bloquer la connexion en fonction des noms figurant dans le certificat.

+0

pourquoi? Comment dire au serveur de ne pas envoyer le certificat? comment gérez-vous un certificat modifié? Cela me semble être une mauvaise idée, cela pourrait-il être un [problème XY] (https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)? –

+0

Pour ce faire, vous devez avoir accès au code client et serveur, et une fois implémenté, cette négociation ne fonctionnerait qu'entre votre client et votre serveur, c'est-à-dire que le serveur ne pourrait pas communiquer avec d'autres clients. – mnistic

+0

"* Comment un client peut-il utiliser le certificat du serveur préalablement mémorisé pour établir une liaison SSL? *" Il suffit de l'utiliser, en ignorant ce que le serveur a envoyé au client? – alk

Répondre

1

Malheureusement, ceci est impossible. Dans le cadre du protocole SSL (ou TLS), le serveur enverra toujours son certificat.

Si vous souhaitez contourner la censure des FAI, je recommande d'utiliser un VPN ou Tor.

+1

À moins que les deux homologues ne prennent en charge et ne s'accordent sur l'un des changements de clés «anonymes» ou PSK ou SRP - mais aucun serveur public ne le fait; vous devez exécuter votre propre serveur, et si vous le faites, vous pouvez utiliser plus facilement (et de façon moins visible) keyexchange basé sur un certificat normal avec un nom que vous avez choisi pour être inoffensif. –

+0

@ dave_thompson_085 Le client peut-il prétendre qu'il reçoit le certificat (utiliser un certificat pré-stocké) et remplir la poignée de main de toute façon? – judian

+0

@judian: peu probable. Si le FAI ou autre MitM épissaient le message CERT hors de TCP mais laissaient tout le reste, y compris la numérotation de séquence ajustée, et que vous pouviez simuler le message CERT (pas seulement le CERT unique), en principe la poignée de main pourrait continuer. Notez qu'il doit s'agir uniquement du message CERT et non du vol complet; vous avez toujours besoin de serverhello et souvent de serverkx. Mais en réalité, le MitM bloquera complètement la connexion, à moins que vous n'obteniez le serveur pour ne pas envoyer le ou les CERT (s), et cela n'arrivera qu'avec un serveur que vous utilisez (ou un ami). _Et vous désactivez SNI. –