Skip to content

Commit 97e67af

Browse files
committed
paramiko_ssh_runner: add pubkey certificates
1 parent ea35b8c commit 97e67af

File tree

3 files changed

+16
-3
lines changed

3 files changed

+16
-3
lines changed

st2common/st2common/runners/parallel_ssh.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ def __init__(
4646
password=None,
4747
pkey_file=None,
4848
pkey_material=None,
49+
pkey_certificate=None,
4950
port=22,
5051
bastion_host=None,
5152
concurrency=10,
@@ -68,6 +69,7 @@ def __init__(
6869
self._ssh_user = user
6970
self._ssh_key_file = pkey_file
7071
self._ssh_key_material = pkey_material
72+
self._ssh_key_certificate = pkey_certificate
7173
self._ssh_password = password
7274
self._hosts = hosts
7375
self._successful_connects = 0
@@ -270,6 +272,7 @@ def _connect(self, host, results, raise_on_any_error=False):
270272
bastion_host=self._bastion_host,
271273
key_files=self._ssh_key_file,
272274
key_material=self._ssh_key_material,
275+
key_certificate=self._ssh_key_certificate,
273276
passphrase=self._passphrase,
274277
handle_stdout_line_func=self._handle_stdout_line_func,
275278
handle_stderr_line_func=self._handle_stderr_line_func,

st2common/st2common/runners/paramiko_ssh.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ def __init__(
102102
bastion_host=None,
103103
key_files=None,
104104
key_material=None,
105+
key_certificate=None,
105106
timeout=None,
106107
passphrase=None,
107108
handle_stdout_line_func=None,
@@ -125,6 +126,7 @@ def __init__(
125126
self.key_files = key_files
126127
self.timeout = timeout
127128
self.key_material = key_material
129+
self.key_certificate = key_certificate
128130
self.bastion_host = bastion_host
129131
self.passphrase = passphrase
130132
self.ssh_connect_timeout = cfg.CONF.ssh_runner.ssh_connect_timeout
@@ -628,14 +630,16 @@ def _get_decoded_data(self, data):
628630
self.logger.exception("Non UTF-8 character found in data: %s", data)
629631
raise
630632

631-
def _get_pkey_object(self, key_material, passphrase):
633+
def _get_pkey_object(self, key_material, passphrase, key_certificate=None):
632634
"""
633635
Try to detect private key type and return paramiko.PKey object.
634636
"""
635637

636638
for cls in [paramiko.RSAKey, paramiko.DSSKey, paramiko.ECDSAKey]:
637639
try:
638640
key = cls.from_private_key(StringIO(key_material), password=passphrase)
641+
if key_certificate is not None:
642+
key.load_certificate(key_certificate)
639643
except paramiko.ssh_exception.SSHException:
640644
# Invalid key, try other key type
641645
pass
@@ -758,8 +762,8 @@ def _connect(self, host, socket=None):
758762

759763
if self.key_material:
760764
conninfo["pkey"] = self._get_pkey_object(
761-
key_material=self.key_material, passphrase=self.passphrase
762-
)
765+
key_material=self.key_material, passphrase=self.passphrase,
766+
key_certificate=self.key_certificate)
763767

764768
if not self.password and not (self.key_files or self.key_material):
765769
conninfo["allow_agent"] = True

st2common/st2common/runners/paramiko_ssh_runner.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
RUNNER_USERNAME = "username"
3939
RUNNER_PASSWORD = "password"
4040
RUNNER_PRIVATE_KEY = "private_key"
41+
RUNNER_CERTIFICATE = "certificate"
4142
RUNNER_PARALLEL = "parallel"
4243
RUNNER_SUDO = "sudo"
4344
RUNNER_SUDO_PASSWORD = "sudo_password"
@@ -64,6 +65,7 @@ def __init__(self, runner_id):
6465
self._username = None
6566
self._password = None
6667
self._private_key = None
68+
self._certificate = None
6769
self._passphrase = None
6870
self._kwarg_op = "--"
6971
self._cwd = None
@@ -93,6 +95,7 @@ def pre_run(self):
9395
self._username = self.runner_parameters.get(RUNNER_USERNAME, None)
9496
self._password = self.runner_parameters.get(RUNNER_PASSWORD, None)
9597
self._private_key = self.runner_parameters.get(RUNNER_PRIVATE_KEY, None)
98+
self._certificate = self.runner_parameters.get(RUNNER_CERTIFICATE, None)
9699
self._passphrase = self.runner_parameters.get(RUNNER_PASSPHRASE, None)
97100

98101
self._ssh_port = self.runner_parameters.get(RUNNER_SSH_PORT, None)
@@ -200,6 +203,9 @@ def store_stderr_line(line):
200203
# Default to stanley key file specified in the config
201204
client_kwargs["pkey_file"] = self._ssh_key_file
202205

206+
if self._certificate:
207+
client_kwargs["pkey_certificate"] = self._certificate
208+
203209
if self._sudo_password:
204210
client_kwargs["sudo_password"] = True
205211

0 commit comments

Comments
 (0)