Skip to content
This repository was archived by the owner on Sep 29, 2023. It is now read-only.

Commit b99c5b4

Browse files
authored
Merge pull request #176 from AzureAD/release-1.2.0
Release 1.2.0
2 parents bef928d + 60c0ba9 commit b99c5b4

File tree

7 files changed

+85
-55
lines changed

7 files changed

+85
-55
lines changed

adal/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727

2828
# pylint: disable=wrong-import-position
2929

30-
__version__ = '1.1.0'
30+
__version__ = '1.2.0'
3131

3232
import logging
3333

adal/authentication_context.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -235,19 +235,22 @@ def token_func(self):
235235
return self._acquire_token(token_func)
236236

237237
def acquire_token_with_client_certificate(self, resource, client_id,
238-
certificate, thumbprint):
238+
certificate, thumbprint, public_certificate=None):
239239
'''Gets a token for a given resource via certificate credentials
240240
241241
:param str resource: A URI that identifies the resource for which the
242242
token is valid.
243243
:param str client_id: The OAuth client id of the calling application.
244244
:param str certificate: A PEM encoded certificate private key.
245-
:param str thumbprint: hex encoded thumbprint of the certificate.
245+
:param str thumbprint: hex encoded thumbprint of the certificate.
246+
:param public_certificate(optional): if not None, it will be sent to the service for subject name
247+
and issuer based authentication, which is to support cert auto rolls. The value must match the
248+
certificate private key parameter.
246249
:returns: dict with several keys, include "accessToken".
247250
'''
248251
def token_func(self):
249252
token_request = TokenRequest(self._call_context, self, client_id, resource)
250-
return token_request.get_token_with_certificate(certificate, thumbprint)
253+
return token_request.get_token_with_certificate(certificate, thumbprint, public_certificate)
251254

252255
return self._acquire_token(token_func)
253256

adal/mex.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ def _select_username_password_polices(self, xpath):
144144
policy_id = self._check_policy(policy_node)
145145
if policy_id:
146146
id_ref = '#' + policy_id
147-
policies[id_ref] = {id:id_ref}
147+
policies[id_ref] = {policy_id:id_ref}
148148

149149
return policies if policies else None
150150

adal/self_signed_jwt.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,13 @@ def __init__(self, call_context, authority, client_id):
7878
self._token_endpoint = authority.token_endpoint
7979
self._client_id = client_id
8080

81-
def _create_header(self, thumbprint):
81+
def _create_header(self, thumbprint, public_certificate):
8282
x5t = _create_x5t_value(thumbprint)
8383
header = {'typ':'JWT', 'alg':'RS256', 'x5t':x5t}
84-
85-
self._log.debug("Creating self signed JWT header. x5t: %(x5t)s",
86-
{"x5t": x5t})
84+
if public_certificate:
85+
header['x5c'] = public_certificate
86+
self._log.debug("Creating self signed JWT header. x5t: %(x5t)s, x5c: %(x5c)s",
87+
{"x5t": x5t, "x5c": public_certificate})
8788

8889
return header
8990

@@ -117,8 +118,9 @@ def _reduce_thumbprint(self, thumbprint):
117118
self._raise_on_invalid_thumbprint(canonical)
118119
return canonical
119120

120-
def create(self, certificate, thumbprint):
121+
def create(self, certificate, thumbprint, public_certificate):
121122
thumbprint = self._reduce_thumbprint(thumbprint)
122-
header = self._create_header(thumbprint)
123+
124+
header = self._create_header(thumbprint, public_certificate)
123125
payload = self._create_payload()
124126
return _sign_jwt(header, payload, certificate)

adal/token_request.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -351,20 +351,20 @@ def get_token_from_cache_with_refresh(self, user_id):
351351
self._user_id = user_id
352352
return self._find_token_from_cache()
353353

354-
def _create_jwt(self, certificate, thumbprint):
354+
def _create_jwt(self, certificate, thumbprint, public_certificate):
355355

356356
ssj = self._create_self_signed_jwt()
357-
jwt = ssj.create(certificate, thumbprint)
357+
jwt = ssj.create(certificate, thumbprint, public_certificate)
358358

359359
if not jwt:
360360
raise AdalError("Failed to create JWT.")
361361
return jwt
362362

363-
def get_token_with_certificate(self, certificate, thumbprint):
363+
def get_token_with_certificate(self, certificate, thumbprint, public_certificate):
364364

365365
self._log.info("Getting a token via certificate.")
366366

367-
jwt = self._create_jwt(certificate, thumbprint)
367+
jwt = self._create_jwt(certificate, thumbprint, public_certificate)
368368

369369
oauth_parameters = self._create_oauth_parameters(OAUTH2_GRANT_TYPE.CLIENT_CREDENTIALS)
370370
oauth_parameters[OAUTH2_PARAMETERS.CLIENT_ASSERTION_TYPE] = OAUTH2_GRANT_TYPE.JWT_BEARER

tests/test_self_signed_jwt.py

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,16 @@
5252
class TestSelfSignedJwt(unittest.TestCase):
5353
testNowDate = cp['nowDate']
5454
testJwtId = cp['jwtId']
55-
expectedJwt = cp['expectedJwt']
55+
expectedJwtWithThumbprint = cp['expectedJwtWithThumbprint']
56+
expectedJwtWithPublicCert = cp['expectedJwtWithPublicCert']
57+
5658
unexpectedJwt = 'unexpectedJwt'
5759
testAuthority = Authority('https://login.windows.net/naturalcauses.com', False)
5860
testClientId = 'd6835713-b745-48d1-bb62-7a8248477d35'
5961
testCert = cp['cert']
62+
testPublicCert=cp['publicCert']
6063

61-
def _create_jwt(self, cert, thumbprint, encodeError = None):
64+
def _create_jwt(self, cert, thumbprint, public_certificate = None, encodeError = None):
6265
ssjwt = SelfSignedJwt(cp['callContext'], self.testAuthority, self.testClientId)
6366

6467
self_signed_jwt._get_date_now = mock.MagicMock(return_value = self.testNowDate)
@@ -67,19 +70,24 @@ def _create_jwt(self, cert, thumbprint, encodeError = None):
6770
if encodeError:
6871
self_signed_jwt._encode_jwt = mock.MagicMock(return_value = self.unexpectedJwt)
6972
else:
70-
self_signed_jwt._encode_jwt = mock.MagicMock(return_value = self.expectedJwt)
73+
expected = self.expectedJwtWithPublicCert if public_certificate else self.expectedJwtWithThumbprint
74+
self_signed_jwt._encode_jwt = mock.MagicMock(return_value = expected)
7175

72-
jwt = ssjwt.create(cert, thumbprint)
76+
jwt = ssjwt.create(cert, thumbprint, public_certificate=public_certificate)
7377
return jwt
7478

7579
def _create_jwt_and_match_expected_err(self, testCert, thumbprint, encodeError = None):
7680
with self.assertRaises(Exception):
77-
self._create_jwt(testCert, thumbprint, encodeError)
81+
self._create_jwt(testCert, thumbprint, encodeError = encodeError)
7882

7983
def _create_jwt_and_match_expected_jwt(self, cert, thumbprint):
8084
jwt = self._create_jwt(cert, thumbprint)
8185
self.assertTrue(jwt, 'No JWT generated')
82-
self.assertTrue(jwt == self.expectedJwt, 'Generated JWT does not match expected:{}'.format(jwt))
86+
self.assertTrue(jwt == self.expectedJwtWithThumbprint, 'Generated JWT does not match expected:{}'.format(jwt))
87+
88+
def test_jwt_hash_with_public_cert(self):
89+
jwt = self._create_jwt(self.testCert, cp['certHash'], public_certificate = self.testPublicCert)
90+
self.assertTrue(jwt == self.expectedJwtWithPublicCert, 'Generated JWT does not match expected:{}'.format(jwt))
8391

8492
def test_create_jwt_hash_colons(self):
8593
self._create_jwt_and_match_expected_jwt(self.testCert, cp['certHash'])
@@ -93,7 +101,7 @@ def test_create_jwt_hash_straight_hex(self):
93101
self._create_jwt_and_match_expected_jwt(self.testCert, thumbprint)
94102

95103
def test_create_jwt_invalid_cert(self):
96-
self._create_jwt_and_match_expected_err('foobar', cp['certHash'], True)
104+
self._create_jwt_and_match_expected_err('foobar', cp['certHash'], encodeError = True)
97105

98106
def test_create_jwt_invalid_thumbprint_1(self):
99107
self._create_jwt_and_match_expected_err(self.testCert, 'zzzz')

tests/util.py

Lines changed: 50 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -176,41 +176,58 @@
176176
# This is a dummy RSA private cert used for testing purpose.It does not represent valid credential.
177177
# privatePem variable is a fake certificate in the form of a string.
178178
def get_self_signed_cert():
179-
private_pem = ("-----BEGIN RSA PRIVATE KEY-----"
180-
"MIIEpAIBAAKCAQEAoMGZTZi0vU/ICYVgV4vcTwzvZCNXdJ9EgGBBFu1E0/j4FF0Y"
181-
"Fd2sP7IwmWVZLlWJ5VbwAtdMiRdrogX/QnWPfsNfsPzDdRRJD+Erh9tmBzJm08h7"
182-
"1RggS1/VehZ9WNdTDlQM3P+zNg0IG274VIr+ZSBzIbYxV6ecPdRU/EsZ5Wa5SCwG"
183-
"Fu1qPJW8KY8yvse9PHdFiHjrmcZSKTbBCp/2grdBrk/N1jwtH6Yj100l7G69HPE/"
184-
"4kXYRX9f/LjpzF77VMCj7UJtmb1yR3fRHpppbm7GkqvJFM2Kg3UG5fsp8nQBDRc+"
185-
"R3kjm+DU05MoFdsfo3DkzpNJjDcLUPdANe+mWwIDAQABAoIBACdb/1r+XpJTbFjY"
186-
"bSRCPCimtB5CgPEu5ajA6G7inQ2BUcw6luETq07VJA0KwXEUxHSAerdXW4fdUh8T"
187-
"dNIi0oVo9I7y9DBATTs0GGJlF2//qSmFVrxv8chCqJQB2aLc5ZsGfTfG62v6eNeu"
188-
"reKVPYApF8dTQnWBtkF1MXGsOaTuxEecrM6KbES97kElC0QsJ89sDnTUjKuihfc9"
189-
"Q9IfWDbX/5WY6JL7XMbQtKRIzd+y/E9dpU3Hu+UErKWyb5pQiud81/Q/xQThSrVt"
190-
"zpmXwlsEFCrSzDML+aOTDqrsRwypRc5sTNAMadkeRrrlo+5OzoUG1aTxco8tZ1MD"
191-
"ch7RTJECgYEA1fqn93X6S1sA8R4lYOJUDd5JmEskKwLl5Vg2VSinSD1YyMdtPnQa"
192-
"ZWCEbJGXN60tEd7ZjOM4wA0mIrwEkkApFWEiGpMe4aGTD11455rA5IfrZUGPXlcw"
193-
"lkmt4wPytKx/xDLBfa8oAu33dFDe/nhRqQqAMTi7DAnttqjUxPg/N8UCgYEAwFNG"
194-
"qLG+5+J4sq5xoXgDj0Zggi5hx2IEfN68BmyYHvfL8VSDkQMsiYXNAhTWByCkjW9D"
195-
"j/hdouGlDwMCLWq0XPgO/XsSlU7jJExsrRch63kf72PTZP/qapSkOonCe9TViNTQ"
196-
"KiRXu/v9OfJYSRPnpKz0/5goFSq7E12mBWZJJ58CgYEAvmmKNLSAobP+t5H68ycU"
197-
"Yy7u0J31Nm0ixR7lYoyFp8wniKumdA//OT1VOgOoy/vIAoILl8rPQl+xEvG7I6YC"
198-
"qSrBnWJT9bbBVcf5Aih9BCBLgdSATxRJgUNZgI2P2eUy4RXFhyFp+olmTdR1S38o"
199-
"M8PLZYG1OTZQmd3NUOYT430CgYBzU7yEPgnPPTPJWefTvobL7JTEm5GQoQs14c54"
200-
"P7g8obUO4vH+DBwx3yUfAWWSYpWqJjUqaPGlUY/L3673kwvS0AEVKS7sj6CPTLDC"
201-
"XqO9cyWeRIsn/noQLVAJtkAER41AfvTQwHhHxoSDsfoU4DXAvuIvPouSncwOgdKj"
202-
"XEGz2wKBgQDQmB/u4oGaPRf5DdasiAcqofYDEoo/OcpdRPeW2t5z7WDZcjeN4ajR"
203-
"GDoQssBpy1fpsPnghksMhYZL2l9xiSInkFw87ax5EYBS43Mt5HfJPgwpEnA5yV3W"
204-
"WGt3TBp7BgYOKhIID6803lBYfDmtQzdD+xMjlJKSQ9wfZYCuXrYwSg=="
205-
"-----END RSA PRIVATE KEY-----")
206-
207-
return private_pem
208-
209-
parameters['certHash'] = 'C1:5D:EA:86:56:AD:DF:67:BE:80:31:D8:5E:BD:DC:5A:D6:C4:36:E1'
179+
private_pem = ("-----BEGIN PRIVATE KEY-----\n"
180+
"MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDLTKKMn3WJiDnc"
181+
"8VuJPDr1kj9VYr9zdobMUSJ9YgRb6Rz05YiUOlSeNiMA6Y7yrpVbSxewIAkVC/gI"
182+
"W/Ywp4FtR9j/SzQ91HIHvmKBrOAorpPDS0ZQ6nfeaBtZ14UIF16H/OvgyMkweBBd"
183+
"7pIbF4i7ty3gdhFzpN2xd+qXTeDVMtxaQOM8RTAVp1RUpuNpPSIQxo9dLyOotcAe"
184+
"Fj8uc0mMa0o6DbdxD26RiBIOgzcsYr5WUCMihmE3h1EIbXtQC5YwFnU9Q8OgupWz"
185+
"i31QE1fbFgWzpjx1/KU9Yb8doWs1jwXSo4UGYecxiOKBrFuj0I6Kyelv9dfiayZF"
186+
"GpwR+FmXAgMBAAECggEABmSxk/SL0LhtAWrBsy4muIRR45CIbswibxh6GjFT68QH"
187+
"+heh1O+Eq7kOHsA5k54z6jwRUaOgRX4r3a9urZcG9fXVeCnYSb19nIq7NFLIdd8P"
188+
"nIuoeXD2NhNWENw7PcbmXSZyEI6f7RtJgHq5M4ro7OZU1gNAhz9/DU61HO8BDBNP"
189+
"9TT9h2Kf5cAHC79lrRs7Cj9yLK/JFFPFSyTEqxo9O6xHQfRv6X25rZeYo9JzGaqP"
190+
"mwTvmheEqW7a75apBEpbzqD0f0jT4anaOSab0D10LyD9qEiCpzgDKG8Q31c0y9zS"
191+
"Utk0suVR35abo22LdtvXMSyQMDfOOx3hqbUZ9c34uQKBgQD+oJUtfUYT9DBg/+jR"
192+
"t/u+Tq/VnpolciQiIpIvUArhIFmOzLkt/hjH8ozOJlRrFADUWAE+pSWuAMdPjAsi"
193+
"NGRYueAPQ29bqRF+5i0cJHXlxVNsqhF1SD5z/qaKU/MVL358v++g5shazQm45gUg"
194+
"BeXyeRc++aFBTUAjUyoDOCh+bQKBgQDMZTacfAcGORL8TVvjq+0IJ6IppICmwRVU"
195+
"FlZ/7HSJ+F1itggp0Kn9xzEk7SPgU8w0koysN+2189wn77PhQAAp1oGH2xvubXIz"
196+
"nnAFpS9XbmzrG3JhHEVJqMe2qZ/pFOSqZxnNAekyWcE3BLamBBrMIx4wJBpmxVkf"
197+
"EWUGSvolkwKBgDqQ8P8Pi2jXh7En64MhUFQLgUIfQtFOGaWIUhtzy6zQZgkEaat8"
198+
"gHKtBVn9Uvl2FmLBAzhHgA0vvKg9S+pIJrSJvFGGbzyj/JQ1mTaZ5Ew/QNsDmxRg"
199+
"04yWi/PRL142GF/VPebCbl8EPjI7Jf6hnKxS0df4TvDYNeJqJIWtCxNZAoGBAI04"
200+
"rUfnhe7txklepcujgW1t/OQqzdzpcXQczv0qAcdGPDe0r+U8UAeQ9kqeMniPTXtR"
201+
"ejKPngVmjUlmm/FZCAPgOrUEVcMiCZLSuHGeFRyipky3NQsVvmXLYNm7T0p67hcy"
202+
"jygPVvE8BHygHBaOpXlAFl6Kw1cYqaAGo7d6XGVTAoGBAL0FucFmEAZOH7Bcnl30"
203+
"JMXMcoedCAMMZG235cL2xBz6z+MzWVMkiZxblOVqAHRExGDoT01fymVte1OoKx7Q"
204+
"SKiGNXCVBatkk7PlRUVnL0ziSwgYVxNX9eGNXZRBXUH3BuoYPlfdUMH36vgmukbT"
205+
"Ui28YpkjQ5RY1UwUY6tk+Bka\n"
206+
"-----END PRIVATE KEY-----")
207+
public_pem = ("MIICoTCCAYkCAgPoMA0GCSqGSIb3DQEBBQUAMBQxEjAQBgNVBAMMCUNMSS1Mb2dp"
208+
"bjAiGA8yMDE4MTAxNzE2MTAxN1oYDzIwMTkxMDE3MTYxMDE5WjAUMRIwEAYDVQQD"
209+
"DAlDTEktTG9naW4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDLTKKM"
210+
"n3WJiDnc8VuJPDr1kj9VYr9zdobMUSJ9YgRb6Rz05YiUOlSeNiMA6Y7yrpVbSxew"
211+
"IAkVC/gIW/Ywp4FtR9j/SzQ91HIHvmKBrOAorpPDS0ZQ6nfeaBtZ14UIF16H/Ovg"
212+
"yMkweBBd7pIbF4i7ty3gdhFzpN2xd+qXTeDVMtxaQOM8RTAVp1RUpuNpPSIQxo9d"
213+
"LyOotcAeFj8uc0mMa0o6DbdxD26RiBIOgzcsYr5WUCMihmE3h1EIbXtQC5YwFnU9"
214+
"Q8OgupWzi31QE1fbFgWzpjx1/KU9Yb8doWs1jwXSo4UGYecxiOKBrFuj0I6Kyelv"
215+
"9dfiayZFGpwR+FmXAgMBAAEwDQYJKoZIhvcNAQEFBQADggEBADfEqXzcI/fs82T0"
216+
"9B3H3lGWQL1JlcxOxD2TeMPtubDNllhZBT5GaYiw1LWAq+xJZZh+QPNxvZVw5Q/p"
217+
"wgXo32maLNwjuhlDl/5bNNOMsxszRz60C2QQXzIaBxd6T2EUcnMQozu5y/33HT8k"
218+
"k/ipBKbfmLP7Hgvs2xdhjHQcG61a2QP6qxD0UjVpXlgsL8wwc28ZSk1RqhxnHG0s"
219+
"HRrRuwNhqWRe7JCGNkOwUghlemrqSuL3i6iAaeqipBqS0vVFGN8KS12jKYirEV5T"
220+
"YkJ2HRrzSWEWbGhk+LnVis47nYRFzQB/sec/m+rpCpX6Spmiez6Yge2u874Oks/A"
221+
"OGQyeYk=")
222+
223+
return private_pem, public_pem
224+
225+
parameters['certHash'] = 'B8:D3:FC:F1:51:50:63:7F:B0:ED:EE:32:C5:A2:4B:A2:28:D8:93:91'
210226
parameters['nowDate'] = datetime.fromtimestamp(1418433646.179)
211227
parameters['jwtId'] = '09841beb-a2c2-4777-a347-34ef055238a8'
212-
parameters['expectedJwt'] = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6IndWM3FobGF0MzJlLWdESFlYcjNjV3RiRU51RSJ9.eyJhdWQiOiJodHRwczovL2xvZ2luLndpbmRvd3MubmV0L3JyYW5kYWxsYWFkMS5vbm1pY3Jvc29mdC5jb20vb2F1dGgyL3Rva2VuIiwiaXNzIjoiY2xpZW4mJj8_P3RJZCIsInN1YiI6ImNsaWVuJiY_Pz90SWQiLCJuYmYiOjE0MTg0MzM2NDYsImV4cCI6MTQxODQzNDI0NiwianRpIjoiMDk4NDFiZWItYTJjMi00Nzc3LWEzNDctMzRlZjA1NTIzOGE4In0.dgF0TRlcASgTMp_1dlm8vd7tudr6n40VeuOQGFnz566s3n76WR_jJDBBBKlYeqc9gwCPFOzrLVAJehVYZ3N7YPzVdulf47rLoQdAp8R_p4Q4hdBZuIzfgDWwXjnP9x_NlfzezEYE4r8KTS2g5BBzPmx538AfIdNM93hWIxQySZGWY5UAhTkT1qE1ce1Yjo1M2HqzEJhTg5TTyfrnDtNxFxmzYhSyA9B41lB5kBuJTXUWXPrr-6eG8cEUOS-iiH7YB1Tf4J7_9JQloevTiOrfv4pSp6xLLXm2ntNBg3gaKsGKdYd-3tsCG0mHn7BzL0b-QCLalkUr8KtgtLqkxuAiLQ'
213-
parameters['cert'] = get_self_signed_cert()
228+
parameters['expectedJwtWithThumbprint'] = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6InVOUDg4VkZRWTMtdzdlNHl4YUpMb2lqWWs1RT0ifQ.eyJleHAiOjE0MTg0MzQyNDYsImF1ZCI6bnVsbCwiaXNzIjoiZDY4MzU3MTMtYjc0NS00OGQxLWJiNjItN2E4MjQ4NDc3ZDM1IiwianRpIjoiMDk4NDFiZWItYTJjMi00Nzc3LWEzNDctMzRlZjA1NTIzOGE4IiwibmJmIjoxNDE4NDMzNjQ2LCJzdWIiOiJkNjgzNTcxMy1iNzQ1LTQ4ZDEtYmI2Mi03YTgyNDg0NzdkMzUifQ.sV5CPEQjYqlnGXhv2f8ozCpAD281is1aOjOHZRKQlPe8zuRhEC4DnAv66QcrxA9HkPs3OAR1GWHnlgVL88uCcAbdEgFo7cAVaQQeRr90zlDMOMoZqULXnorbO90q91BrnJdbcygzsba4Z_FPzKAsJ7J8NXWfWcbkFGrisjuyi97Nm-nCCpjH1zM6gi3paGg_53GFb2S7xMv1lvB7LfPQMI8QvOC64kmVia-cr2NQoT9XLz2U_1ahCKidN2ozyCv09shRjfBu2QSeIctbv0BKVfQQCUnLuMQ-O4_NKY3THZn5hl5PvFDPjlI3X_Om58gPhwISkgtndGTMJ9W-H5z71Q'
229+
parameters['expectedJwtWithPublicCert'] = 'eyJ4NWMiOiJNSUlDb1RDQ0FZa0NBZ1BvTUEwR0NTcUdTSWIzRFFFQkJRVUFNQlF4RWpBUUJnTlZCQU1NQ1VOTVNTMU1iMmRwYmpBaUdBOHlNREU0TVRBeE56RTJNVEF4TjFvWUR6SXdNVGt4TURFM01UWXhNREU1V2pBVU1SSXdFQVlEVlFRRERBbERURWt0VEc5bmFXNHdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFETFRLS01uM1dKaURuYzhWdUpQRHIxa2o5VllyOXpkb2JNVVNKOVlnUmI2UnowNVlpVU9sU2VOaU1BNlk3eXJwVmJTeGV3SUFrVkMvZ0lXL1l3cDRGdFI5ai9TelE5MUhJSHZtS0JyT0FvcnBQRFMwWlE2bmZlYUJ0WjE0VUlGMTZIL092Z3lNa3dlQkJkN3BJYkY0aTd0eTNnZGhGenBOMnhkK3FYVGVEVk10eGFRT004UlRBVnAxUlVwdU5wUFNJUXhvOWRMeU9vdGNBZUZqOHVjMG1NYTBvNkRiZHhEMjZSaUJJT2d6Y3NZcjVXVUNNaWhtRTNoMUVJYlh0UUM1WXdGblU5UThPZ3VwV3ppMzFRRTFmYkZnV3pwangxL0tVOVliOGRvV3MxandYU280VUdZZWN4aU9LQnJGdWowSTZLeWVsdjlkZmlheVpGR3B3UitGbVhBZ01CQUFFd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFEZkVxWHpjSS9mczgyVDA5QjNIM2xHV1FMMUpsY3hPeEQyVGVNUHR1YkRObGxoWkJUNUdhWWl3MUxXQXEreEpaWmgrUVBOeHZaVnc1US9wd2dYbzMybWFMTndqdWhsRGwvNWJOTk9Nc3hzelJ6NjBDMlFRWHpJYUJ4ZDZUMkVVY25NUW96dTV5LzMzSFQ4a2svaXBCS2JmbUxQN0hndnMyeGRoakhRY0c2MWEyUVA2cXhEMFVqVnBYbGdzTDh3d2MyOFpTazFScWh4bkhHMHNIUnJSdXdOaHFXUmU3SkNHTmtPd1VnaGxlbXJxU3VMM2k2aUFhZXFpcEJxUzB2VkZHTjhLUzEyaktZaXJFVjVUWWtKMkhScnpTV0VXYkdoaytMblZpczQ3bllSRnpRQi9zZWMvbStycENwWDZTcG1pZXo2WWdlMnU4NzRPa3MvQU9HUXllWWs9IiwieDV0IjoidU5QODhWRlFZMy13N2U0eXhhSkxvaWpZazVFPSIsImFsZyI6IlJTMjU2IiwidHlwIjoiSldUIn0.eyJqdGkiOiIwOTg0MWJlYi1hMmMyLTQ3NzctYTM0Ny0zNGVmMDU1MjM4YTgiLCJleHAiOjE0MTg0MzQyNDYsImF1ZCI6bnVsbCwic3ViIjoiZDY4MzU3MTMtYjc0NS00OGQxLWJiNjItN2E4MjQ4NDc3ZDM1IiwibmJmIjoxNDE4NDMzNjQ2LCJpc3MiOiJkNjgzNTcxMy1iNzQ1LTQ4ZDEtYmI2Mi03YTgyNDg0NzdkMzUifQ.ROcEKjjuKN0-iK4seRCYftvEh8F5Esj1Y3NJF0MbUGWZQYTRnjibJAnVkvmCqFSGT_mDFhasTM67pwAWtfYNP875UM87HG4aUyZG48pFojnWxnMMf9gBardPmpaDNi3U_iIGoTGVLR60JV30WjsOCkEJY79l68EMc5i6XqYtOSyJDlI0rn8ZTqoyVHQYqCwkTLDF0cqTrqK6HV9iWuiT0rq3LMP2lShwAhKaTYIeAAek5Bw5LwRR2mo9ybreq_02vCDxIQg0C3kBDGMU8GxQ2tAWMYSqnxNfrjgUhARDQYdZTjCyuq1kOb8QrHly29mPT7xdS7Xnc0IF6JZb1PXj0Q'
230+
parameters['cert'], parameters['publicCert'] = get_self_signed_cert()
214231

215232
correlation_id_regex = re.compile("[^\s]+")
216233

0 commit comments

Comments
 (0)