我正在使用 Ansible 脚本生成 SSH 密钥,该脚本在 Java 17 上运行良好,但是在使用 Java 8 时不起作用。问题似乎与私钥中使用的加密算法有关。
当我使用
putty-gen
生成密钥时,它适用于两个版本,但是 ansible 生成的密钥仅适用于较新的版本,但不适用于旧版本。
puttygen 的 DES-EDE3
加密(三重 DES)适用于 Java 8 和 17,而 Ansible 脚本生成的 AES-256
加密仅适用于 Java 17。
Ansible 脚本
---
- name: Generate SSH key with passphrase and set permissions
hosts: localhost
connection: local
vars:
ssh_private_key_filepath: "{{ ssh_private_key_filepath }}"
ssh_public_key_filepath: "{{ ssh_public_key_filepath }}"
ssh_passphrase: "{{ ssh_passphrase }}"
tasks:
- name: Generate private key
community.crypto.openssl_privatekey:
path: "{{ ssh_private_key_filepath }}"
type: RSA
size: 4096
passphrase: "{{ ssh_passphrase }}"
cipher: auto
state: present
force: false
register: private_key
- name: Generate public key
community.crypto.openssl_publickey:
path: "{{ ssh_public_key_filepath }}"
privatekey_path: "{{ ssh_private_key_filepath }}"
privatekey_passphrase: "{{ ssh_passphrase }}"
state: present
force: false
format: "OpenSSH"
when: private_key.changed
- name: Set permissions for private key
file:
path: "{{ ssh_private_key_filepath }}"
mode: '400'
- name: Set permissions for public key
file:
path: "{{ ssh_public_key_filepath }}"
mode: '600'
如何修改 Ansible 脚本或密钥生成过程,以使生成的密钥与 Java 8 和 Java 17 版本兼容。
community.crypto.openssl_publickey
的
cipher
的唯一选择是“auto”,这意味着您需要的内容尚未实现。
您需要使用 shell 模块和 openssl
。
ansible.builtin.shell:
cmd: "openssl genrsa -des3 -passout pass:{{ lookup('env','MY_PASS') }} 4096 > {{ ssh_private_key_filepath }}"
creates: "{{ ssh_private_key_filepath }}"
register: private_key
no_log: true