Skip to content

Commit 518847a

Browse files
authored
CI: DSA SSH keys are no longer supported with OpenSSH 9.8p1 (#776)
* DSA SSH keys are no longer supported with OpenSSH 9.8p1. * Add more compatibility tests.
1 parent aa30b4c commit 518847a

File tree

5 files changed

+115
-78
lines changed

5 files changed

+115
-78
lines changed

tests/integration/targets/openssh_keypair/meta/main.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
# SPDX-License-Identifier: GPL-3.0-or-later
55

66
dependencies:
7+
- prepare_jinja2_compat
78
- setup_ssh_keygen
89
- setup_openssl
910
- setup_bcrypt

tests/integration/targets/openssh_keypair/tests/options.yml

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@
99
####################################################################
1010

1111
- set_fact:
12-
key_types:
12+
key_types: "{{ key_types_src | reject('equalto', '') | list }}"
13+
vars:
14+
key_types_src:
1315
- rsa
14-
- dsa
16+
- "{{ 'dsa' if openssh_supports_dsa else '' }}"
1517
- ecdsa
1618

1719
- name: "({{ backend }}) Generate keys with default size - size"
@@ -29,9 +31,9 @@
2931
- name: "({{ backend }}) Assert key sizes match default size - size"
3032
assert:
3133
that:
32-
- key_size_output.results[0].stdout == '4096'
33-
- key_size_output.results[1].stdout == '1024'
34-
- key_size_output.results[2].stdout == '256'
34+
- (key_size_output.results | selectattr('item', 'equalto', 'rsa') | first).stdout == '4096'
35+
- not openssh_supports_dsa or (key_size_output.results | selectattr('item', 'equalto', 'dsa') | first).stdout == '1024'
36+
- (key_size_output.results | selectattr('item', 'equalto', 'ecdsa') | first).stdout == '256'
3537

3638
- name: "({{ backend }}) Remove keys - size"
3739
openssh_keypair:

tests/integration/targets/openssh_keypair/tests/regenerate.yml

Lines changed: 78 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -264,90 +264,95 @@
264264
- [ '', '.pub' ]
265265
when: "item.0 != 'always'"
266266

267-
- name: "({{ backend }}) Regenerate - adjust key type (check mode)"
268-
openssh_keypair:
269-
path: '{{ remote_tmp_dir }}/regenerate-a-{{ item }}'
270-
type: dsa
271-
size: 1024
272-
regenerate: '{{ item }}'
273-
backend: "{{ backend }}"
274-
check_mode: true
275-
loop: "{{ regenerate_values }}"
276-
ignore_errors: true
277-
register: result
278-
- assert:
279-
that:
280-
- result.results[0] is success and result.results[0] is not changed
281-
- result.results[1] is failed
282-
- "'Key has wrong type and/or size. Will not proceed.' in result.results[1].msg"
283-
- result.results[2] is changed
284-
- result.results[3] is changed
285-
- result.results[4] is changed
267+
- vars:
268+
ssh_type: '{{ "dsa" if openssh_supports_dsa else "ecdsa" }}'
269+
ssh_size: '{{ 1024 if openssh_supports_dsa else omit }}'
286270

287-
- name: "({{ backend }}) Regenerate - adjust key type"
288-
openssh_keypair:
289-
path: '{{ remote_tmp_dir }}/regenerate-a-{{ item }}'
290-
type: dsa
291-
size: 1024
292-
regenerate: '{{ item }}'
293-
backend: "{{ backend }}"
294-
loop: "{{ regenerate_values }}"
295-
ignore_errors: true
296-
register: result
297-
- assert:
298-
that:
299-
- result.results[0] is success and result.results[0] is not changed
300-
- result.results[1] is failed
301-
- "'Key has wrong type and/or size. Will not proceed.' in result.results[1].msg"
302-
- result.results[2] is changed
303-
- result.results[3] is changed
304-
- result.results[4] is changed
271+
block:
272+
- name: "({{ backend }}) Regenerate - adjust key type (check mode)"
273+
openssh_keypair:
274+
path: '{{ remote_tmp_dir }}/regenerate-a-{{ item }}'
275+
type: '{{ ssh_type }}'
276+
size: '{{ ssh_size }}'
277+
regenerate: '{{ item }}'
278+
backend: "{{ backend }}"
279+
check_mode: true
280+
loop: "{{ regenerate_values }}"
281+
ignore_errors: true
282+
register: result
283+
- assert:
284+
that:
285+
- result.results[0] is success and result.results[0] is not changed
286+
- result.results[1] is failed
287+
- "'Key has wrong type and/or size. Will not proceed.' in result.results[1].msg"
288+
- result.results[2] is changed
289+
- result.results[3] is changed
290+
- result.results[4] is changed
305291

306-
- name: "({{ backend }}) Regenerate - redistribute keys"
307-
copy:
308-
src: '{{ remote_tmp_dir }}/regenerate-a-always{{ item.1 }}'
309-
dest: '{{ remote_tmp_dir }}/regenerate-a-{{ item.0 }}{{ item.1 }}'
310-
remote_src: true
311-
with_nested:
312-
- "{{ regenerate_values }}"
313-
- [ '', '.pub' ]
314-
when: "item.0 != 'always'"
292+
- name: "({{ backend }}) Regenerate - adjust key type"
293+
openssh_keypair:
294+
path: '{{ remote_tmp_dir }}/regenerate-a-{{ item }}'
295+
type: '{{ ssh_type }}'
296+
size: '{{ ssh_size }}'
297+
regenerate: '{{ item }}'
298+
backend: "{{ backend }}"
299+
loop: "{{ regenerate_values }}"
300+
ignore_errors: true
301+
register: result
302+
- assert:
303+
that:
304+
- result.results[0] is success and result.results[0] is not changed
305+
- result.results[1] is failed
306+
- "'Key has wrong type and/or size. Will not proceed.' in result.results[1].msg"
307+
- result.results[2] is changed
308+
- result.results[3] is changed
309+
- result.results[4] is changed
315310

316-
- name: "({{ backend }}) Regenerate - adjust comment (check mode)"
317-
openssh_keypair:
318-
path: '{{ remote_tmp_dir }}/regenerate-a-{{ item }}'
319-
type: dsa
320-
size: 1024
321-
comment: test comment
322-
regenerate: '{{ item }}'
323-
backend: "{{ backend }}"
324-
check_mode: true
325-
loop: "{{ regenerate_values }}"
326-
ignore_errors: true
327-
register: result
328-
- assert:
329-
that:
330-
- result is changed
311+
- name: "({{ backend }}) Regenerate - redistribute keys"
312+
copy:
313+
src: '{{ remote_tmp_dir }}/regenerate-a-always{{ item.1 }}'
314+
dest: '{{ remote_tmp_dir }}/regenerate-a-{{ item.0 }}{{ item.1 }}'
315+
remote_src: true
316+
with_nested:
317+
- "{{ regenerate_values }}"
318+
- [ '', '.pub' ]
319+
when: "item.0 != 'always'"
331320

332-
# Support for updating comments for key types other than rsa1 was added in OpenSSH 7.2
333-
- when: not (backend == 'opensshbin' and openssh_version is version('7.2', '<'))
334-
block:
335-
- name: "({{ backend }}) Regenerate - adjust comment"
321+
- name: "({{ backend }}) Regenerate - adjust comment (check mode)"
336322
openssh_keypair:
337323
path: '{{ remote_tmp_dir }}/regenerate-a-{{ item }}'
338-
type: dsa
339-
size: 1024
324+
type: '{{ ssh_type }}'
325+
size: '{{ ssh_size }}'
340326
comment: test comment
341327
regenerate: '{{ item }}'
342328
backend: "{{ backend }}"
329+
check_mode: true
343330
loop: "{{ regenerate_values }}"
331+
ignore_errors: true
344332
register: result
345333
- assert:
346334
that:
347335
- result is changed
348-
# for all values but 'always', the key should not be regenerated.
349-
# verify this by comparing fingerprints:
350-
- result.results[0].fingerprint == result.results[1].fingerprint
351-
- result.results[0].fingerprint == result.results[2].fingerprint
352-
- result.results[0].fingerprint == result.results[3].fingerprint
353-
- result.results[0].fingerprint != result.results[4].fingerprint
336+
337+
# Support for updating comments for key types other than rsa1 was added in OpenSSH 7.2
338+
- when: not (backend == 'opensshbin' and openssh_version is version('7.2', '<'))
339+
block:
340+
- name: "({{ backend }}) Regenerate - adjust comment"
341+
openssh_keypair:
342+
path: '{{ remote_tmp_dir }}/regenerate-a-{{ item }}'
343+
type: '{{ ssh_type }}'
344+
size: '{{ ssh_size }}'
345+
comment: test comment
346+
regenerate: '{{ item }}'
347+
backend: "{{ backend }}"
348+
loop: "{{ regenerate_values }}"
349+
register: result
350+
- assert:
351+
that:
352+
- result is changed
353+
# for all values but 'always', the key should not be regenerated.
354+
# verify this by comparing fingerprints:
355+
- result.results[0].fingerprint == result.results[1].fingerprint
356+
- result.results[0].fingerprint == result.results[2].fingerprint
357+
- result.results[0].fingerprint == result.results[3].fingerprint
358+
- result.results[0].fingerprint != result.results[4].fingerprint

tests/integration/targets/prepare_jinja2_compat/filter_plugins/jinja_compatibility.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,20 @@ def call_filter(environment, name, value, args=None, kwargs=None,
8585
return func(value, *args, **(kwargs or {}))
8686

8787

88+
@contextfilter
89+
def compatibility_select_filter(context, sequence, test_name, *args, **kwargs):
90+
for item in sequence:
91+
if call_test(context.environment, test_name, item, args, kwargs):
92+
yield item
93+
94+
95+
@contextfilter
96+
def compatibility_reject_filter(context, sequence, test_name, *args, **kwargs):
97+
for item in sequence:
98+
if not call_test(context.environment, test_name, item, args, kwargs):
99+
yield item
100+
101+
88102
def make_attrgetter(environment, attribute_str, default=None):
89103
attributes = [int(attribute) if attribute.isdigit() else attribute for attribute in attribute_str.split(".")]
90104

@@ -106,6 +120,14 @@ def compatibility_selectattr_filter(context, sequence, attribute_str, test_name,
106120
yield item
107121

108122

123+
@contextfilter
124+
def compatibility_rejectattr_filter(context, sequence, attribute_str, test_name, *args, **kwargs):
125+
f = make_attrgetter(context.environment, attribute_str)
126+
for item in sequence:
127+
if not call_test(context.environment, test_name, f(item), args, kwargs):
128+
yield item
129+
130+
109131
def prepare_map(context, args, kwargs):
110132
if len(args) == 0 and "attribute" in kwargs:
111133
attribute = kwargs.pop("attribute")
@@ -139,6 +161,9 @@ class FilterModule:
139161

140162
def filters(self):
141163
return {
164+
'select': compatibility_select_filter,
142165
'selectattr': compatibility_selectattr_filter,
166+
'reject': compatibility_reject_filter,
167+
'rejectattr': compatibility_rejectattr_filter,
143168
'map': compatibility_map_filter,
144169
}

tests/integration/targets/setup_ssh_keygen/tasks/main.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,7 @@
2525
- name: Set ssh version facts
2626
set_fact:
2727
openssh_version: "{{ rc_openssh_version_output.stdout.strip() }}"
28+
29+
- name: Set ssh support facts
30+
set_fact:
31+
openssh_supports_dsa: "{{ openssh_version is version('9.8', '<') }}"

0 commit comments

Comments
 (0)