/ examples / acme_client.py
acme_client.py
 1  """Example script showing how to use acme client API."""
 2  import logging
 3  import os
 4  import pkg_resources
 5  
 6  from cryptography.hazmat.backends import default_backend
 7  from cryptography.hazmat.primitives.asymmetric import rsa
 8  import OpenSSL
 9  
10  from acme import client
11  from acme import messages
12  from acme import jose
13  
14  
15  logging.basicConfig(level=logging.DEBUG)
16  
17  
18  NEW_REG_URL = 'https://www.letsencrypt-demo.org/acme/new-reg'
19  BITS = 2048  # minimum for Boulder
20  DOMAIN = 'example1.com'  # example.com is ignored by Boulder
21  
22  # generate_private_key requires cryptography>=0.5
23  key = jose.JWKRSA(key=rsa.generate_private_key(
24      public_exponent=65537,
25      key_size=2048,
26      backend=default_backend()))
27  acme = client.Client(NEW_REG_URL, key)
28  
29  regr = acme.register()
30  logging.info('Auto-accepting TOS: %s', regr.terms_of_service)
31  acme.update_registration(regr.update(
32      body=regr.body.update(agreement=regr.terms_of_service)))
33  logging.debug(regr)
34  
35  authzr = acme.request_challenges(
36      identifier=messages.Identifier(typ=messages.IDENTIFIER_FQDN, value=DOMAIN),
37      new_authzr_uri=regr.new_authzr_uri)
38  logging.debug(authzr)
39  
40  authzr, authzr_response = acme.poll(authzr)
41  
42  csr = OpenSSL.crypto.load_certificate_request(
43      OpenSSL.crypto.FILETYPE_ASN1, pkg_resources.resource_string(
44          'acme', os.path.join('testdata', 'csr.der')))
45  try:
46      acme.request_issuance(csr, (authzr,))
47  except messages.Error as error:
48      print ("This script is doomed to fail as no authorization "
49             "challenges are ever solved. Error from server: {0}".format(error))