TLS 1.2 ECDHE_RSA Signatur

Ich arbeite zurzeit an einem Java TLS-Server. Ich versuche, die folgende CipherSuite zum Laufen zu bringen: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA

Wenn ich es mit openssl s_client teste, wird nach der ServerKeyExchange-Meldung der folgende Fehler angezeigt:

140735242416208: Fehler: 1414D172: SSL-Routinen: tls12_check_peer_sigalg: falscher Signaturtyp: t1_lib.c: 1130:

Hier ist die TLS-Nachricht aus Wireshark

Der Handshake schlägt aufgrund eines schwerwiegenden decode_error-Fehlers fehl.

So ich schätze der Client mag den gewählten Signaturalgorithmus nicht.

Aber ich verwende derzeit nur den Standard-SignatureAndHashAlgorithm gemäßRFC 5246 Abschnitt-7.4.1.4.1

Wenn der ausgehandelte Schlüsselaustauschalgorithmus einer der folgenden ist (RSA, DHE_RSA, DH_RSA, RSA_PSK, ECDH_RSA, ECDHE_RSA), verhalten Sie sich so, als hätte der Client den Wert {sha1, rsa} gesendet.

(Ich überprüfe immer noch, ob der Client diese Standardwerte anbietet.)

Seit ich ECDHE_RSA mache, glaube ich, sollte ich den serverECDHparams gemäß RFC 4492 Abschnitt 5.4 hacken und signieren (Erster Beitrag hier, also nur 2 Links, sorry :))

ServerKeyExchange.signed_params.sha_hash
        SHA(ClientHello.random + ServerHello.random +
                                          ServerKeyExchange.params);
struct {
    select (KeyExchangeAlgorithm) {
        case ec_diffie_hellman:
            ServerECDHParams params;
            Signature signed_params;
    };
} ServerKeyExchange;

Und ich sollte dies gemäß RFC 2246, Abschnitt 7.4.3 tun.

select (SignatureAlgorithm) {   
    case rsa:
        digitally-signed struct {
            opaque md5_hash[16];
            opaque sha_hash[20];
        };
} Signature;


md5_hash
MD5(ClientHello.random + ServerHello.random + ServerParams);

sha_hash
SHA(ClientHello.random + ServerHello.random + ServerParams);

Mein Java-Code zum Signieren der serverParams:

private byte[] getSignedParams(ChannelBuffer params)
        throws NoSuchAlgorithmException, DigestException, 
        SignatureException, InvalidKeyException {
    byte[] signedParams = null;
    ChannelBuffer signAlg = ChannelBuffers.buffer(2);
    MessageDigest md5 = MessageDigest.getInstance("MD5");
    MessageDigest sha = MessageDigest.getInstance("SHA-1");
    switch (session.cipherSuite.sign) {
        case rsa:
            signAlg.writeByte(2); // 2 for SHA1
            sha.update(clientRandom);
            sha.update(serverRandom);
            sha.update(params.toByteBuffer());
            md5.update(clientRandom);
            md5.update(serverRandom);
            md5.update(params.toByteBuffer());
            signedParams = concat(md5.digest(), sha.digest());
        break;
    }
    signAlg.writeByte(session.cipherSuite.sign.value); // for RSA he byte is one
    ChannelBuffer signLength = ChannelBuffers.buffer(2);
    signLength.writeShort(signedParams.length);
    return concat(signAlg.array(),concat(signLength.array(),signedParams));
}

Also meine Frage ist im Grunde: irre ich mich über all das? und wenn ja, was mache ich falsch?

Vielen Dank für Ihre Zeit ! :)

Antworten auf die Frage(2)

Ihre Antwort auf die Frage