How to generate SSH key pairs with Python

m2crypto, python, ssh, ssh-keys

Solution

Use `cryptography`! `pycrypto` is not in active development anymore and if possible you should be using cryptography. Since June it's possible to generate SSH public keys as well:

from cryptography.hazmat.primitives import serialization as crypto_serialization
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.backends import default_backend as crypto_default_backend

key = rsa.generate_private_key(
    backend=crypto_default_backend(),
    public_exponent=65537,
    key_size=2048
)

private_key = key.private_bytes(
    crypto_serialization.Encoding.PEM,
    crypto_serialization.PrivateFormat.PKCS8,
    crypto_serialization.NoEncryption()
)

public_key = key.public_key().public_bytes(
    crypto_serialization.Encoding.OpenSSH,
    crypto_serialization.PublicFormat.OpenSSH
)

Note: You need at least version `1.4.0`.

Note: If your SSH client does not understand this private key format, replace `PKCS8` with `TraditionalOpenSSL`.

Problem

I'm attempting to write a script to generate SSH Identity key pairs for me. ``` from M2Crypto import RSA key = RSA.gen_key(1024, 65337) key.save_key("/tmp/my.key", cipher=None) ``` The file `/tmp/my.key` looks great now. By running `ssh-keygen -y -f /tmp/my.key > /tmp/my.key.pub` I can extract the public key. My question is how can I extract the public key from python? Using `key.save_pub_key("/tmp/my.key.pub")` saves something like: ``` -----BEGIN PUBLIC KEY----- MFwwDQYJKoZIhvcNAQEBBQADASDASDASDASDBarYRsmMazM1hd7a+u3QeMP ... FZQ7Ic+BmmeWHvvVP4Yjyu1t6vAut7mKkaDeKbT3yiGVUgAEUaWMXqECAwEAAQ== -----END PUBLIC KEY----- ``` When I'm looking for something like: ``` ssh-rsa AAAABCASDDBM$%3WEAv/3%$F ..... OSDFKJSL43$%^DFg== ```

Original source