Skip to content

Instantly share code, notes, and snippets.

@Vidimensional
Created January 18, 2016 18:27
Show Gist options
  • Save Vidimensional/c66665d7803bf23901b6 to your computer and use it in GitHub Desktop.
Save Vidimensional/c66665d7803bf23901b6 to your computer and use it in GitHub Desktop.
Ansible module for self-signed https cert
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import os.path
import subprocess
from OpenSSL import crypto, SSL
from ansible.module_utils.basic import *
def generate_ssl_cert(params):
# create a key pair
k = crypto.PKey()
k.generate_key(crypto.TYPE_RSA, 1024)
# create a self-signed cert
cert = crypto.X509()
cert.get_subject().C = params['s_country']
cert.get_subject().ST = params['s_state']
cert.get_subject().L = params['s_city']
cert.get_subject().O = params['s_organization']
cert.get_subject().OU = params['s_ou']
cert.get_subject().CN = params['s_common_name']
cert.set_serial_number(1000)
cert.gmtime_adj_notBefore(0)
cert.gmtime_adj_notAfter(10*365*24*60*60)
cert.set_issuer(cert.get_subject())
cert.set_pubkey(k)
cert.sign(k, 'sha1')
with open(os.path.join(params['cert_dir'], params['cert_name']), "wt") as cert_file:
cert_file.write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert))
with open(os.path.join(params['cert_dir'], params['key_name']), "wt") as key_file:
key_file.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, k))
def main():
module = AnsibleModule(
argument_spec = dict(
cert_dir = dict(required=False, default='/etc/nginx/ssl/', type='str'),
cert_name = dict(required=False, default='server.crt', type='str'),
key_dir = dict(required=False, default='/etc/nginx/ssl/', type='str'),
key_name = dict(required=False, default='server.key', type='str'),
s_country = dict(required=False, default='ES', type='str'),
s_state = dict(required=False, default='Barcelona', type='str'),
s_city = dict(required=False, default='Barcelona', type='str'),
s_organization = dict(required=False, default='Typeform', type='str'),
s_ou = dict(required=False, default='IT', type='str'),
s_common_name = dict(required=True, type='str')
),
supports_check_mode = True
)
p = module.params
if not os.path.exists(p['cert_dir']):
module.fail_json(msg="Cert directory "+p['cert_dir']+" does not exist.")
if not os.path.exists(p['key_dir']):
module.fail_json(msg="Key directory "+p['key_dir']+" does not exist.")
if not os.path.exists(os.path.join(p['cert_dir'], p['cert_name'])):
generate_ssl_cert(p)
module.exit_json(changed=True)
else:
module.exit_json(changed=False)
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment