← Back to team overview

yahoo-eng-team team mailing list archive

[Bug 2009600] [NEW] Client authentication fails with cryptography 3.4.8

 

Public bug reported:

It seems the following commit may have introduced a hard dependency on
cryptography 38.0.2. This poses a problem for downstream distributions
where openstack is backported to older LTS releases. For example, in
Ubuntu we are backporting antelope to jammy, where python3-cryptography
is at 3.4.8. Having to backport cryptography 38.0.2 is very complicated
and error prone as it depends on many (25+) rust libraries that would
also need to be backported.


commit f6a0cce4409232d8ade69b7773dbabcf4c53ec0f
Author: sunyonggen <sunyonggen@xxxxxxxxxxx>
Date:   Fri Oct 7 11:00:05 2022 +0900

    OAuth 2.0 Mutual-TLS Support
    
    The OAuth2.0 Access Token API is modified, support to get an OAuth2.0
    certificate-bound access token from the keystone identity server with
    OAuth 2.0 credentials and Mutual-TLS certificates.
    
    Co-Authored-By: Hiromu Asahina <hiromu.asahina.az@xxxxxxxxxxxxx>
    Change-Id: I885527bec61429b1437a046097a16491848b5a0a
    Implements: blueprint support-oauth2-mtls


To reproduce:
1) clone the upstream keystone source
2) run 'tox -e py3' (I'm running py311 fwiw)
3) align dependencies for cryptography and openssl with Ubuntu Jammy:
.tox/py311/bin/pip3 install cryptography==3.4.8
.tox/py311/bin/pip3 install pyOpenSSL==21.0.0
4) run tests again and see failures


Here is an example of a failure:

keystone.tests.unit.test_v3_oauth2.OAuth2CertificateTests.test_get_access_token_ignore_email                                                                   
--------------------------------------------------------------------------------------------                                                                   
                                                                                                                                                               
Captured traceback:                                                                                                                                            
~~~~~~~~~~~~~~~~~~~                                                                                                                                            
    Traceback (most recent call last):                                                                                                                         
                                                                                                                                                               
      File "/home/corey/pkg/antelope/upstream/keystone/keystone/tests/unit/test_v3_oauth2.py", line 1379, in test_get_access_token_ignore_email                
    resp = self._get_access_token(                                                                                                                             
           ^^^^^^^^^^^^^^^^^^^^^^^                                                                                                                             
                                                                                                                                                               
      File "/home/corey/pkg/antelope/upstream/keystone/keystone/tests/unit/test_v3_oauth2.py", line 871, in _get_access_token                                  
    resp = self.post(                                                                                                                                          
           ^^^^^^^^^^                                                          

      File "/home/corey/pkg/antelope/upstream/keystone/keystone/tests/unit/test_v3.py", line 484, in post                                                      
    return self.v3_request(path, method='POST',                                
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                                

      File "/home/corey/pkg/antelope/upstream/keystone/keystone/tests/unit/test_v3.py", line 458, in v3_request                                                
    return self.v3_noauth_request(path, **kwargs)                              
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                              

      File "/home/corey/pkg/antelope/upstream/keystone/keystone/tests/unit/test_v3.py", line 453, in v3_noauth_request                                         
    return self.admin_request(path=path, **kwargs)                             
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                             

      File "/home/corey/pkg/antelope/upstream/keystone/keystone/tests/unit/rest.py", line 211, in admin_request                                                
    return self._request(app=self.public_app, **kwargs)                        
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                        

      File "/home/corey/pkg/antelope/upstream/keystone/keystone/tests/unit/rest.py", line 202, in _request                                                     
    response = self.request(**kwargs)                                          
               ^^^^^^^^^^^^^^^^^^^^^^                                          

      File "/home/corey/pkg/antelope/upstream/keystone/keystone/tests/unit/rest.py", line 87, in request                                                       
    response = app.request(path, headers=headers,                                                        
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                                                        

      File "/home/corey/pkg/antelope/upstream/keystone/.tox/py311/lib/python3.11/site-packages/webtest/app.py", line 579, in request                                                                                                                         
    return self.do_request(req,                                
           ^^^^^^^^^^^^^^^^^^^^                                

      File "/home/corey/pkg/antelope/upstream/keystone/.tox/py311/lib/python3.11/site-packages/webtest/app.py", line 646, in do_request                                                                                                                      
    self._check_status(status, res)                                                                                            

      File "/home/corey/pkg/antelope/upstream/keystone/.tox/py311/lib/python3.11/site-packages/webtest/app.py", line 680, in _check_status                                                                                                                    
    raise AppError(                                                                                                            

    webtest.app.AppError: Bad response: 401 Unauthorized (not 200)                                                             
b'{"error":"invalid_client","error_description":"Client authentication failed."}\n'                                            


Captured pythonlogging:                                                                                                        
~~~~~~~~~~~~~~~~~~~~~~~                                                                                                        
    No value present for key: 'keystone.resource.core:get_domain|a4e9718804df4c33b42a3741e719890f'                             
NeedRegenerationException                                                                                                      
no value, waiting for create lock                                                                                              
value creation lock <dogpile.cache.region.CacheRegion._LockWrapper object at 0x7f8683910090> acquired                          
No value present for key: 'keystone.resource.core:get_domain|a4e9718804df4c33b42a3741e719890f'                                 
Calling creation function for not-yet-present value                                                                            
Cache value generated in 0.008 seconds for key(s): 'keystone.resource.core:get_domain|a4e9718804df4c33b42a3741e719890f'                                                                                                                                       
Released creation lock                                                                                                         
Truncating password to algorithm specific maximum length 54 characters.                                                        
No value present for key: 'keystone.resource.core:get_domain|ff0b39fd7d554f558fed56cea91e12d8'                                 
NeedRegenerationException                                                                                                      
no value, waiting for create lock                                                                                              
value creation lock <dogpile.cache.region.CacheRegion._LockWrapper object at 0x7f8684b9f790> acquired                          
No value present for key: 'keystone.resource.core:get_domain|ff0b39fd7d554f558fed56cea91e12d8'                                 
Calling creation function for not-yet-present value                                                                            
Cache value generated in 0.025 seconds for key(s): 'keystone.resource.core:get_domain|ff0b39fd7d554f558fed56cea91e12d8'                                                                                                                                       
Released creation lock                                                                                                         
Truncating password to algorithm specific maximum length 54 characters.                                                        
REQUEST_METHOD: `POST`                                                                                                         
SCRIPT_NAME: ``                                                                                                                
PATH_INFO: `/v3/OS-OAUTH2/token`                                                                                               
NameAttribute.rfc4514_string() got an unexpected keyword argument 'attr_name_overrides'                                        
Traceback (most recent call last):                                                                                             
  File "/home/corey/pkg/antelope/upstream/keystone/keystone/common/utils.py", line 482, in get_certificate_subject_dn                                                                                                                                         
    name, value = item.rfc4514_string(                                                                                         
                  ^^^^^^^^^^^^^^^^^^^^                                                                                         
TypeError: NameAttribute.rfc4514_string() got an unexpected keyword argument 'attr_name_overrides'                             
Get OAuth2.0 Access Token API: failed to get the subject DN from the certificate.

** Affects: keystone
     Importance: Undecided
         Status: New

-- 
You received this bug notification because you are a member of Yahoo!
Engineering Team, which is subscribed to OpenStack Identity (keystone).
https://bugs.launchpad.net/bugs/2009600

Title:
  Client authentication fails with cryptography 3.4.8

Status in OpenStack Identity (keystone):
  New

Bug description:
  It seems the following commit may have introduced a hard dependency on
  cryptography 38.0.2. This poses a problem for downstream distributions
  where openstack is backported to older LTS releases. For example, in
  Ubuntu we are backporting antelope to jammy, where
  python3-cryptography is at 3.4.8. Having to backport cryptography
  38.0.2 is very complicated and error prone as it depends on many (25+)
  rust libraries that would also need to be backported.

  
  commit f6a0cce4409232d8ade69b7773dbabcf4c53ec0f
  Author: sunyonggen <sunyonggen@xxxxxxxxxxx>
  Date:   Fri Oct 7 11:00:05 2022 +0900

      OAuth 2.0 Mutual-TLS Support
      
      The OAuth2.0 Access Token API is modified, support to get an OAuth2.0
      certificate-bound access token from the keystone identity server with
      OAuth 2.0 credentials and Mutual-TLS certificates.
      
      Co-Authored-By: Hiromu Asahina <hiromu.asahina.az@xxxxxxxxxxxxx>
      Change-Id: I885527bec61429b1437a046097a16491848b5a0a
      Implements: blueprint support-oauth2-mtls


  To reproduce:
  1) clone the upstream keystone source
  2) run 'tox -e py3' (I'm running py311 fwiw)
  3) align dependencies for cryptography and openssl with Ubuntu Jammy:
  .tox/py311/bin/pip3 install cryptography==3.4.8
  .tox/py311/bin/pip3 install pyOpenSSL==21.0.0
  4) run tests again and see failures


  Here is an example of a failure:

  keystone.tests.unit.test_v3_oauth2.OAuth2CertificateTests.test_get_access_token_ignore_email                                                                   
  --------------------------------------------------------------------------------------------                                                                   
                                                                                                                                                                 
  Captured traceback:                                                                                                                                            
  ~~~~~~~~~~~~~~~~~~~                                                                                                                                            
      Traceback (most recent call last):                                                                                                                         
                                                                                                                                                                 
        File "/home/corey/pkg/antelope/upstream/keystone/keystone/tests/unit/test_v3_oauth2.py", line 1379, in test_get_access_token_ignore_email                
      resp = self._get_access_token(                                                                                                                             
             ^^^^^^^^^^^^^^^^^^^^^^^                                                                                                                             
                                                                                                                                                                 
        File "/home/corey/pkg/antelope/upstream/keystone/keystone/tests/unit/test_v3_oauth2.py", line 871, in _get_access_token                                  
      resp = self.post(                                                                                                                                          
             ^^^^^^^^^^                                                          

        File "/home/corey/pkg/antelope/upstream/keystone/keystone/tests/unit/test_v3.py", line 484, in post                                                      
      return self.v3_request(path, method='POST',                                
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                                

        File "/home/corey/pkg/antelope/upstream/keystone/keystone/tests/unit/test_v3.py", line 458, in v3_request                                                
      return self.v3_noauth_request(path, **kwargs)                              
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                              

        File "/home/corey/pkg/antelope/upstream/keystone/keystone/tests/unit/test_v3.py", line 453, in v3_noauth_request                                         
      return self.admin_request(path=path, **kwargs)                             
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                             

        File "/home/corey/pkg/antelope/upstream/keystone/keystone/tests/unit/rest.py", line 211, in admin_request                                                
      return self._request(app=self.public_app, **kwargs)                        
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                        

        File "/home/corey/pkg/antelope/upstream/keystone/keystone/tests/unit/rest.py", line 202, in _request                                                     
      response = self.request(**kwargs)                                          
                 ^^^^^^^^^^^^^^^^^^^^^^                                          

        File "/home/corey/pkg/antelope/upstream/keystone/keystone/tests/unit/rest.py", line 87, in request                                                       
      response = app.request(path, headers=headers,                                                        
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                                                        

        File "/home/corey/pkg/antelope/upstream/keystone/.tox/py311/lib/python3.11/site-packages/webtest/app.py", line 579, in request                                                                                                                         
      return self.do_request(req,                                
             ^^^^^^^^^^^^^^^^^^^^                                

        File "/home/corey/pkg/antelope/upstream/keystone/.tox/py311/lib/python3.11/site-packages/webtest/app.py", line 646, in do_request                                                                                                                      
      self._check_status(status, res)                                                                                            

        File "/home/corey/pkg/antelope/upstream/keystone/.tox/py311/lib/python3.11/site-packages/webtest/app.py", line 680, in _check_status                                                                                                                    
      raise AppError(                                                                                                            

      webtest.app.AppError: Bad response: 401 Unauthorized (not 200)                                                             
  b'{"error":"invalid_client","error_description":"Client authentication failed."}\n'                                            

  
  Captured pythonlogging:                                                                                                        
  ~~~~~~~~~~~~~~~~~~~~~~~                                                                                                        
      No value present for key: 'keystone.resource.core:get_domain|a4e9718804df4c33b42a3741e719890f'                             
  NeedRegenerationException                                                                                                      
  no value, waiting for create lock                                                                                              
  value creation lock <dogpile.cache.region.CacheRegion._LockWrapper object at 0x7f8683910090> acquired                          
  No value present for key: 'keystone.resource.core:get_domain|a4e9718804df4c33b42a3741e719890f'                                 
  Calling creation function for not-yet-present value                                                                            
  Cache value generated in 0.008 seconds for key(s): 'keystone.resource.core:get_domain|a4e9718804df4c33b42a3741e719890f'                                                                                                                                       
  Released creation lock                                                                                                         
  Truncating password to algorithm specific maximum length 54 characters.                                                        
  No value present for key: 'keystone.resource.core:get_domain|ff0b39fd7d554f558fed56cea91e12d8'                                 
  NeedRegenerationException                                                                                                      
  no value, waiting for create lock                                                                                              
  value creation lock <dogpile.cache.region.CacheRegion._LockWrapper object at 0x7f8684b9f790> acquired                          
  No value present for key: 'keystone.resource.core:get_domain|ff0b39fd7d554f558fed56cea91e12d8'                                 
  Calling creation function for not-yet-present value                                                                            
  Cache value generated in 0.025 seconds for key(s): 'keystone.resource.core:get_domain|ff0b39fd7d554f558fed56cea91e12d8'                                                                                                                                       
  Released creation lock                                                                                                         
  Truncating password to algorithm specific maximum length 54 characters.                                                        
  REQUEST_METHOD: `POST`                                                                                                         
  SCRIPT_NAME: ``                                                                                                                
  PATH_INFO: `/v3/OS-OAUTH2/token`                                                                                               
  NameAttribute.rfc4514_string() got an unexpected keyword argument 'attr_name_overrides'                                        
  Traceback (most recent call last):                                                                                             
    File "/home/corey/pkg/antelope/upstream/keystone/keystone/common/utils.py", line 482, in get_certificate_subject_dn                                                                                                                                         
      name, value = item.rfc4514_string(                                                                                         
                    ^^^^^^^^^^^^^^^^^^^^                                                                                         
  TypeError: NameAttribute.rfc4514_string() got an unexpected keyword argument 'attr_name_overrides'                             
  Get OAuth2.0 Access Token API: failed to get the subject DN from the certificate.

To manage notifications about this bug go to:
https://bugs.launchpad.net/keystone/+bug/2009600/+subscriptions



Follow ups