mirror of https://github.com/ansible/ansible.git
openssl_publickey: add cryptography backend (#60387)
* Add cryptography backend. * Add changelog. * Make sure requirements are satisfied. * Use more compatible elliptic curve. * Decrease required version numbers. * PyOpenSSL >= 16.0.0 is really needed. * Update lib/ansible/modules/crypto/openssl_publickey.py Co-Authored-By: MarkusTeufelberger <mteufelberger@mgit.at>pull/60736/head
parent
13996aaff6
commit
6a786d0d93
@ -0,0 +1,2 @@
|
||||
minor_changes:
|
||||
- "openssl_publickey - now works with both PyOpenSSL and cryptography Python libraries. Autodetection can be overridden with ``select_crypto_backend`` option."
|
@ -0,0 +1,166 @@
|
||||
---
|
||||
- name: Generate privatekey
|
||||
openssl_privatekey:
|
||||
path: '{{ output_dir }}/privatekey.pem'
|
||||
|
||||
- name: Generate publickey - PEM format
|
||||
openssl_publickey:
|
||||
path: '{{ output_dir }}/publickey.pub'
|
||||
privatekey_path: '{{ output_dir }}/privatekey.pem'
|
||||
select_crypto_backend: '{{ select_crypto_backend }}'
|
||||
|
||||
- name: Generate publickey - OpenSSH format
|
||||
openssl_publickey:
|
||||
path: '{{ output_dir }}/publickey-ssh.pub'
|
||||
privatekey_path: '{{ output_dir }}/privatekey.pem'
|
||||
format: OpenSSH
|
||||
select_crypto_backend: '{{ select_crypto_backend }}'
|
||||
when: select_crypto_backend == 'cryptography' and cryptography_version.stdout is version('1.4.0', '>=')
|
||||
|
||||
- name: Generate publickey - OpenSSH format - test idempotence (issue 33256)
|
||||
openssl_publickey:
|
||||
path: '{{ output_dir }}/publickey-ssh.pub'
|
||||
privatekey_path: '{{ output_dir }}/privatekey.pem'
|
||||
format: OpenSSH
|
||||
select_crypto_backend: '{{ select_crypto_backend }}'
|
||||
when: select_crypto_backend == 'cryptography' and cryptography_version.stdout is version('1.4.0', '>=')
|
||||
register: publickey_ssh_idempotence
|
||||
|
||||
- name: Generate publickey2 - standard
|
||||
openssl_publickey:
|
||||
path: '{{ output_dir }}/publickey2.pub'
|
||||
privatekey_path: '{{ output_dir }}/privatekey.pem'
|
||||
select_crypto_backend: '{{ select_crypto_backend }}'
|
||||
|
||||
- name: Delete publickey2 - standard
|
||||
openssl_publickey:
|
||||
state: absent
|
||||
path: '{{ output_dir }}/publickey2.pub'
|
||||
privatekey_path: '{{ output_dir }}/privatekey.pem'
|
||||
select_crypto_backend: '{{ select_crypto_backend }}'
|
||||
|
||||
- name: Generate privatekey3 - with passphrase
|
||||
openssl_privatekey:
|
||||
path: '{{ output_dir }}/privatekey3.pem'
|
||||
passphrase: ansible
|
||||
cipher: aes256
|
||||
|
||||
- name: Generate publickey3 - with passphrase protected privatekey
|
||||
openssl_publickey:
|
||||
path: '{{ output_dir }}/publickey3.pub'
|
||||
privatekey_path: '{{ output_dir }}/privatekey3.pem'
|
||||
privatekey_passphrase: ansible
|
||||
select_crypto_backend: '{{ select_crypto_backend }}'
|
||||
|
||||
- name: Generate publickey3 - with passphrase protected privatekey - idempotence
|
||||
openssl_publickey:
|
||||
path: '{{ output_dir }}/publickey3.pub'
|
||||
privatekey_path: '{{ output_dir }}/privatekey3.pem'
|
||||
privatekey_passphrase: ansible
|
||||
select_crypto_backend: '{{ select_crypto_backend }}'
|
||||
register: publickey3_idempotence
|
||||
|
||||
- name: Generate empty file that will hold a public key (issue 33072)
|
||||
file:
|
||||
path: '{{ output_dir }}/publickey4.pub'
|
||||
state: touch
|
||||
|
||||
- name: Generate publickey in empty existing file (issue 33072)
|
||||
openssl_publickey:
|
||||
path: '{{ output_dir }}/publickey4.pub'
|
||||
privatekey_path: '{{ output_dir }}/privatekey.pem'
|
||||
select_crypto_backend: '{{ select_crypto_backend }}'
|
||||
|
||||
- name: Generate privatekey 5 (ECC)
|
||||
openssl_privatekey:
|
||||
path: '{{ output_dir }}/privatekey5.pem'
|
||||
type: ECC
|
||||
curve: secp256r1
|
||||
|
||||
- name: Generate publickey 5 - PEM format
|
||||
openssl_publickey:
|
||||
path: '{{ output_dir }}/publickey5.pub'
|
||||
privatekey_path: '{{ output_dir }}/privatekey.pem'
|
||||
backup: yes
|
||||
select_crypto_backend: '{{ select_crypto_backend }}'
|
||||
register: privatekey5_1
|
||||
- name: Generate publickey 5 - PEM format (idempotent)
|
||||
openssl_publickey:
|
||||
path: '{{ output_dir }}/publickey5.pub'
|
||||
privatekey_path: '{{ output_dir }}/privatekey.pem'
|
||||
backup: yes
|
||||
select_crypto_backend: '{{ select_crypto_backend }}'
|
||||
register: privatekey5_2
|
||||
- name: Generate publickey 5 - PEM format (different private key)
|
||||
openssl_publickey:
|
||||
path: '{{ output_dir }}/publickey5.pub'
|
||||
privatekey_path: '{{ output_dir }}/privatekey5.pem'
|
||||
backup: yes
|
||||
select_crypto_backend: '{{ select_crypto_backend }}'
|
||||
register: privatekey5_3
|
||||
|
||||
- name: Generate privatekey with password
|
||||
openssl_privatekey:
|
||||
path: '{{ output_dir }}/privatekeypw.pem'
|
||||
passphrase: hunter2
|
||||
cipher: auto
|
||||
select_crypto_backend: cryptography
|
||||
|
||||
- name: Generate publickey - PEM format (failed passphrase 1)
|
||||
openssl_publickey:
|
||||
path: '{{ output_dir }}/publickey_pw1.pub'
|
||||
privatekey_path: '{{ output_dir }}/privatekey.pem'
|
||||
privatekey_passphrase: hunter2
|
||||
select_crypto_backend: '{{ select_crypto_backend }}'
|
||||
ignore_errors: yes
|
||||
register: passphrase_error_1
|
||||
|
||||
- name: Generate publickey - PEM format (failed passphrase 2)
|
||||
openssl_publickey:
|
||||
path: '{{ output_dir }}/publickey_pw2.pub'
|
||||
privatekey_path: '{{ output_dir }}/privatekeypw.pem'
|
||||
privatekey_passphrase: wrong_password
|
||||
select_crypto_backend: '{{ select_crypto_backend }}'
|
||||
ignore_errors: yes
|
||||
register: passphrase_error_2
|
||||
|
||||
- name: Generate publickey - PEM format (failed passphrase 3)
|
||||
openssl_publickey:
|
||||
path: '{{ output_dir }}/publickey_pw3.pub'
|
||||
privatekey_path: '{{ output_dir }}/privatekeypw.pem'
|
||||
select_crypto_backend: '{{ select_crypto_backend }}'
|
||||
ignore_errors: yes
|
||||
register: passphrase_error_3
|
||||
|
||||
- name: Create broken key
|
||||
copy:
|
||||
dest: "{{ output_dir }}/publickeybroken.pub"
|
||||
content: "broken"
|
||||
- name: Regenerate broken key
|
||||
openssl_publickey:
|
||||
path: '{{ output_dir }}/publickeybroken.pub'
|
||||
privatekey_path: '{{ output_dir }}/privatekey5.pem'
|
||||
select_crypto_backend: '{{ select_crypto_backend }}'
|
||||
register: output_broken
|
||||
|
||||
- name: Generate publickey - PEM format (for removal)
|
||||
openssl_publickey:
|
||||
path: '{{ output_dir }}/publickey_removal.pub'
|
||||
privatekey_path: '{{ output_dir }}/privatekey.pem'
|
||||
select_crypto_backend: '{{ select_crypto_backend }}'
|
||||
- name: Generate publickey - PEM format (removal)
|
||||
openssl_publickey:
|
||||
state: absent
|
||||
path: '{{ output_dir }}/publickey_removal.pub'
|
||||
privatekey_path: '{{ output_dir }}/privatekey.pem'
|
||||
backup: yes
|
||||
select_crypto_backend: '{{ select_crypto_backend }}'
|
||||
register: remove_1
|
||||
- name: Generate publickey - PEM format (removal, idempotent)
|
||||
openssl_publickey:
|
||||
state: absent
|
||||
path: '{{ output_dir }}/publickey_removal.pub'
|
||||
privatekey_path: '{{ output_dir }}/privatekey.pem'
|
||||
backup: yes
|
||||
select_crypto_backend: '{{ select_crypto_backend }}'
|
||||
register: remove_2
|
@ -1,156 +1,48 @@
|
||||
---
|
||||
- block:
|
||||
- name: Generate privatekey
|
||||
- name: Generate privatekey1 - standard
|
||||
openssl_privatekey:
|
||||
path: '{{ output_dir }}/privatekey.pem'
|
||||
path: '{{ output_dir }}/privatekey_autodetect.pem'
|
||||
|
||||
- name: Generate publickey - PEM format
|
||||
- name: Run module with backend autodetection
|
||||
openssl_publickey:
|
||||
path: '{{ output_dir }}/publickey.pub'
|
||||
privatekey_path: '{{ output_dir }}/privatekey.pem'
|
||||
path: '{{ output_dir }}/privatekey_autodetect_public.pem'
|
||||
privatekey_path: '{{ output_dir }}/privatekey_autodetect.pem'
|
||||
|
||||
- name: Generate publickey - OpenSSH format
|
||||
openssl_publickey:
|
||||
path: '{{ output_dir }}/publickey-ssh.pub'
|
||||
privatekey_path: '{{ output_dir }}/privatekey.pem'
|
||||
format: OpenSSH
|
||||
# cryptography.hazmat.primitives import serialization.Encoding.OpenSSH and
|
||||
# cryptography.hazmat.primitives import serialization.PublicFormat.OpenSSH constants
|
||||
# appeared in version 1.4 of cryptography
|
||||
when: cryptography_version.stdout is version('1.4.0', '>=')
|
||||
|
||||
- name: Generate publickey - OpenSSH format - test idempotence (issue 33256)
|
||||
openssl_publickey:
|
||||
path: '{{ output_dir }}/publickey-ssh.pub'
|
||||
privatekey_path: '{{ output_dir }}/privatekey.pem'
|
||||
format: OpenSSH
|
||||
when: cryptography_version.stdout is version('1.4.0', '>=')
|
||||
register: publickey_ssh_idempotence
|
||||
when: |
|
||||
pyopenssl_version.stdout is version('16.0.0', '>=') or
|
||||
cryptography_version.stdout is version('1.2.3', '>=')
|
||||
|
||||
- name: Generate publickey2 - standard
|
||||
openssl_publickey:
|
||||
path: '{{ output_dir }}/publickey2.pub'
|
||||
privatekey_path: '{{ output_dir }}/privatekey.pem'
|
||||
|
||||
- name: Delete publickey2 - standard
|
||||
openssl_publickey:
|
||||
state: absent
|
||||
path: '{{ output_dir }}/publickey2.pub'
|
||||
privatekey_path: '{{ output_dir }}/privatekey.pem'
|
||||
|
||||
- name: Generate privatekey3 - with passphrase
|
||||
openssl_privatekey:
|
||||
path: '{{ output_dir }}/privatekey3.pem'
|
||||
passphrase: ansible
|
||||
cipher: aes256
|
||||
- block:
|
||||
- name: Running tests with pyOpenSSL backend
|
||||
include_tasks: impl.yml
|
||||
vars:
|
||||
select_crypto_backend: pyopenssl
|
||||
|
||||
- name: Generate publickey3 - with passphrase protected privatekey
|
||||
openssl_publickey:
|
||||
path: '{{ output_dir }}/publickey3.pub'
|
||||
privatekey_path: '{{ output_dir }}/privatekey3.pem'
|
||||
privatekey_passphrase: ansible
|
||||
- import_tasks: ../tests/validate.yml
|
||||
vars:
|
||||
select_crypto_backend: pyopenssl
|
||||
|
||||
- name: Generate publickey3 - with passphrase protected privatekey - idempotence
|
||||
openssl_publickey:
|
||||
path: '{{ output_dir }}/publickey3.pub'
|
||||
privatekey_path: '{{ output_dir }}/privatekey3.pem'
|
||||
privatekey_passphrase: ansible
|
||||
register: publickey3_idempotence
|
||||
when: pyopenssl_version.stdout is version('16.0.0', '>=')
|
||||
|
||||
- name: Generate empty file that will hold a public key (issue 33072)
|
||||
- name: Remove output directory
|
||||
file:
|
||||
path: '{{ output_dir }}/publickey4.pub'
|
||||
state: touch
|
||||
|
||||
- name: Generate publickey in empty existing file (issue 33072)
|
||||
openssl_publickey:
|
||||
path: '{{ output_dir }}/publickey4.pub'
|
||||
privatekey_path: '{{ output_dir }}/privatekey.pem'
|
||||
|
||||
- name: Generate privatekey 5 (ECC)
|
||||
openssl_privatekey:
|
||||
path: '{{ output_dir }}/privatekey5.pem'
|
||||
type: ECC
|
||||
curve: secp256k1
|
||||
path: "{{ output_dir }}"
|
||||
state: absent
|
||||
|
||||
- name: Generate publickey 5 - PEM format
|
||||
openssl_publickey:
|
||||
path: '{{ output_dir }}/publickey5.pub'
|
||||
privatekey_path: '{{ output_dir }}/privatekey.pem'
|
||||
backup: yes
|
||||
register: privatekey5_1
|
||||
- name: Generate publickey 5 - PEM format (idempotent)
|
||||
openssl_publickey:
|
||||
path: '{{ output_dir }}/publickey5.pub'
|
||||
privatekey_path: '{{ output_dir }}/privatekey.pem'
|
||||
backup: yes
|
||||
register: privatekey5_2
|
||||
- name: Generate publickey 5 - PEM format (different private key)
|
||||
openssl_publickey:
|
||||
path: '{{ output_dir }}/publickey5.pub'
|
||||
privatekey_path: '{{ output_dir }}/privatekey5.pem'
|
||||
backup: yes
|
||||
register: privatekey5_3
|
||||
- name: Re-create output directory
|
||||
file:
|
||||
path: "{{ output_dir }}"
|
||||
state: directory
|
||||
|
||||
- name: Generate privatekey with password
|
||||
openssl_privatekey:
|
||||
path: '{{ output_dir }}/privatekeypw.pem'
|
||||
passphrase: hunter2
|
||||
cipher: auto
|
||||
- block:
|
||||
- name: Running tests with cryptography backend
|
||||
include_tasks: impl.yml
|
||||
vars:
|
||||
select_crypto_backend: cryptography
|
||||
|
||||
- name: Generate publickey - PEM format (failed passphrase 1)
|
||||
openssl_publickey:
|
||||
path: '{{ output_dir }}/publickey_pw1.pub'
|
||||
privatekey_path: '{{ output_dir }}/privatekey.pem'
|
||||
privatekey_passphrase: hunter2
|
||||
ignore_errors: yes
|
||||
register: passphrase_error_1
|
||||
|
||||
- name: Generate publickey - PEM format (failed passphrase 2)
|
||||
openssl_publickey:
|
||||
path: '{{ output_dir }}/publickey_pw2.pub'
|
||||
privatekey_path: '{{ output_dir }}/privatekeypw.pem'
|
||||
privatekey_passphrase: wrong_password
|
||||
ignore_errors: yes
|
||||
register: passphrase_error_2
|
||||
|
||||
- name: Generate publickey - PEM format (failed passphrase 3)
|
||||
openssl_publickey:
|
||||
path: '{{ output_dir }}/publickey_pw3.pub'
|
||||
privatekey_path: '{{ output_dir }}/privatekeypw.pem'
|
||||
ignore_errors: yes
|
||||
register: passphrase_error_3
|
||||
|
||||
- name: Create broken key
|
||||
copy:
|
||||
dest: "{{ output_dir }}/publickeybroken.pub"
|
||||
content: "broken"
|
||||
- name: Regenerate broken key
|
||||
openssl_publickey:
|
||||
path: '{{ output_dir }}/publickeybroken.pub'
|
||||
privatekey_path: '{{ output_dir }}/privatekey5.pem'
|
||||
register: output_broken
|
||||
|
||||
- name: Generate publickey - PEM format (for removal)
|
||||
openssl_publickey:
|
||||
path: '{{ output_dir }}/publickey_removal.pub'
|
||||
privatekey_path: '{{ output_dir }}/privatekey.pem'
|
||||
- name: Generate publickey - PEM format (removal)
|
||||
openssl_publickey:
|
||||
state: absent
|
||||
path: '{{ output_dir }}/publickey_removal.pub'
|
||||
privatekey_path: '{{ output_dir }}/privatekey.pem'
|
||||
backup: yes
|
||||
register: remove_1
|
||||
- name: Generate publickey - PEM format (removal, idempotent)
|
||||
openssl_publickey:
|
||||
state: absent
|
||||
path: '{{ output_dir }}/publickey_removal.pub'
|
||||
privatekey_path: '{{ output_dir }}/privatekey.pem'
|
||||
backup: yes
|
||||
register: remove_2
|
||||
|
||||
- import_tasks: ../tests/validate.yml
|
||||
vars:
|
||||
select_crypto_backend: cryptography
|
||||
|
||||
when: pyopenssl_version.stdout is version('16.0.0', '>=')
|
||||
when: cryptography_version.stdout is version('1.2.3', '>=')
|
||||
|
Loading…
Reference in New Issue