Nerd-sniped on rsa_pkcs1_sha1 Server Key Exchange signature algorithm.

Ralph Corderoy ralph at inputplus.co.uk
Mon Oct 30 15:02:09 UTC 2023


Hi,

An nginx serving TLS on both www.example.com and plain example.com
uses different signature algorithms in the TLSv1.2 server key exchange.
I'd really like to understand why.

It's the one nginx server configured with multiple ‘server {...}’
blocks.  Both blocks have the same TLS configuration by including the
same file with the ssl_...  statements.  The one Let's Encrypt
certificate chain is used by both.  When retrieved with

    openssl s_client -connect     example.com:https -showcerts </dev/null
    openssl s_client -connect www.example.com:https -showcerts </dev/null

the same chain is received.  The chain's first certificate has the plain
example.com as its CN with the www domain in the X509v3 SAN.

        Subject: CN = example.com
    ...
            X509v3 Subject Alternative Name:
                DNS:example.com, DNS:www.example.com

Those openssl commands above say the plain uses SHA256 whilst the www
uses SHA1.

     No client certificate CA names sent
    -Peer signing digest: SHA256
    +Peer signing digest: SHA1
     Peer signature type: RSA
     Server Temp Key: ECDH, P-256, 256 bits

Using tshark(1), I can see more detail when comparing other TLS
connections to the two domains.  Left is plain, right is www.

      TLSv1.2 Record Layer: Handshake Protocol: Server Key Exchange
          Content Type: Handshake (22)
          Version: TLS 1.2 (0x0303)
          Length: 333
          Handshake Protocol: Server Key Exchange
              Handshake Type: Server Key Exchange (12)
              Length: 329
              EC Diffie-Hellman Server Params
                  Curve Type: named_curve (0x03)
                  Named Curve: secp256r1 (0x0017)
                  Pubkey Length: 65
                  Pubkey: 04547a26…                                |   Pubkey: 04f37c7c…
                  Signature Algorithm: rsa_pkcs1_sha256 (0x0401)   |   Signature Algorithm: rsa_pkcs1_sha1 (0x0201)
                      Signature Hash Algorithm Hash: SHA256 (4)    |       Signature Hash Algorithm Hash: SHA1 (2)
                      Signature Hash Algorithm Signature: RSA (1)

Both connections have the same cipher suites in the Client Hello.

    TLS_AES_256_GCM_SHA384 (0x1302)                               
    TLS_CHACHA20_POLY1305_SHA256 (0x1303)                         
    TLS_AES_128_GCM_SHA256 (0x1301)                               
    TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 (0xc02c)              
    TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (0xc030)                
    TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 (0x009f)                  
    TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 (0xcca9)        
    TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (0xcca8)          
    TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (0xccaa)            
    TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 (0xc02b)              
    TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)                
    TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 (0x009e)                  
    TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 (0xc024)              
    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 (0xc028)                
    TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 (0x006b)                  
    TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 (0xc023)              
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 (0xc027)                
    TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 (0x0067)                  
    TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA (0xc00a)                 
    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (0xc014)                   
    TLS_DHE_RSA_WITH_AES_256_CBC_SHA (0x0039)                     
    TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA (0xc009)                 
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (0xc013)                   
    TLS_DHE_RSA_WITH_AES_128_CBC_SHA (0x0033)                     
    TLS_RSA_WITH_AES_256_GCM_SHA384 (0x009d)                      
    TLS_RSA_WITH_AES_128_GCM_SHA256 (0x009c)                      
    TLS_RSA_WITH_AES_256_CBC_SHA256 (0x003d)                      
    TLS_RSA_WITH_AES_128_CBC_SHA256 (0x003c)                      
    TLS_RSA_WITH_AES_256_CBC_SHA (0x0035)                         
    TLS_RSA_WITH_AES_128_CBC_SHA (0x002f)                         
    TLS_EMPTY_RENEGOTIATION_INFO_SCSV (0x00ff)                    

And the same signature hash algorithms in the Client Hello's
signature_algorithms extension.

    ecdsa_secp256r1_sha256 (0x0403)                
    ecdsa_secp384r1_sha384 (0x0503)                
    ecdsa_secp521r1_sha512 (0x0603)                
    ed25519 (0x0807)                               
    ed448 (0x0808)                                 
    rsa_pss_pss_sha256 (0x0809)                    
    rsa_pss_pss_sha384 (0x080a)                    
    rsa_pss_pss_sha512 (0x080b)                    
    rsa_pss_rsae_sha256 (0x0804)                   
    rsa_pss_rsae_sha384 (0x0805)                   
    rsa_pss_rsae_sha512 (0x0806)                   
    rsa_pkcs1_sha256 (0x0401)                      
    rsa_pkcs1_sha384 (0x0501)                      
    rsa_pkcs1_sha512 (0x0601)                      
    SHA224 ECDSA (0x0303)                          
    SHA224 RSA (0x0301)                            
    SHA224 DSA (0x0302)                            
    SHA256 DSA (0x0402)                            
    SHA384 DSA (0x0502)                            
    SHA512 DSA (0x0602)                            

This is an ancient Ubuntu with an old openssl-1.0.1f.  I realise the fix
is ‘upgrade’ but I want to understand what's happening and learn from
it...

I think ssl3_send_server_key_exchange() is getting ‘md’
with

    pkey=ssl_get_sign_pkey(s,s->s3->tmp.new_cipher,&md)

which is later used to

    tls12_get_sigandhash(p, pkey, md)

That function searches through table tls12_md[].  If I'm right so far,
I'm puzzled why it searches for NID_sha256 for the plain domain but
NID_sha1 for the www.

Odds are, I'm wrong and that's why I'm a bit stuck.

-- 
Cheers, Ralph.


More information about the openssl-users mailing list