ssl - qué - protocolo de intercambio de claves
El secreto premaster se empañó cuando se implementó el intercambio de claves Diffie-Hellman (1)
El intercambio de claves del cliente contendrá:
length (2 bytes) --> Y_C (in plain text)
Implementé TLS en Java y sigo la misma estructura y funciona bien para mí.
¿Debo firmar el Yc devuelto?
No, no es necesario firmar el valor público DH del cliente , se transfiere en texto sin formato.
Puede tomar un pcap y verificar si se están transfiriendo los mismos valores en el paquete. Además, si GNU TLS tiene un registrador para imprimir el Y_C
recibido, entonces puede verificar si se están recibiendo los datos correctos.
Si en caso de que sigas recibiendo un secreto de Pre-Master diferente, entonces parece haber algún problema con la lógica de generación de secretos.
Estoy tratando de implementar DHE_DSS en el paquete de crypto / tls de go. Desafortunadamente, parece que no puedo hacer que PreMasterSecret (Z) sea el mismo, mi flujo de trabajo básico es:
Recibir mensaje de intercambio de clave de servidor
- Extracto P, G, Ys
- Verificar utilizando la firma digital provista
Preparar mensaje de intercambio de clave de cliente
- Crear Xc del cliente
- Generar Yc (Yc = G ^ Xc% P)
- Generar Z (Z = Ys ^ Xc% P)
- Envíe de vuelta a Yc, empacado así:
ckx := make([]byte, len(yC)+2)
ckx[0] = byte(len(Yc)>>8)
ckx[1] = byte(len(Yc))
copy(ckx[2:], yBytes)
Sin embargo, cuando estoy depurando esto con gnutls-serv, los dos PreMasterSecrets (Z) son diferentes. ¿Debo firmar el Yc devuelto, o quizás empacarlo de otra manera? No puedo ver nada en RFC 5246 para sugerir esto.
<- EDITAR ->
Aquí hay un parche de mis cambios: