45

SSH ID キー ペアを生成するスクリプトを作成しようとしています。

from M2Crypto import RSA
key = RSA.gen_key(1024, 65337)
key.save_key("/tmp/my.key", cipher=None)

ファイル/tmp/my.keyは見栄えが良くなりました。

実行ssh-keygen -y -f /tmp/my.key > /tmp/my.key.pubすると、公開鍵を抽出できます。

私の質問は、Python から公開鍵を抽出するにはどうすればよいですか? を使用key.save_pub_key("/tmp/my.key.pub")すると、次のように保存されます。

-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADASDASDASDASDBarYRsmMazM1hd7a+u3QeMP
...
FZQ7Ic+BmmeWHvvVP4Yjyu1t6vAut7mKkaDeKbT3yiGVUgAEUaWMXqECAwEAAQ==
-----END PUBLIC KEY-----

次のようなものを探しているとき:

ssh-rsa AAAABCASDDBM$%3WEAv/3%$F ..... OSDFKJSL43$%^DFg==
4

11 に答える 11

77

使用してくださいcryptographypycryptoは活発に開発されていないため、可能であれば暗号化を使用する必要があります。6 月以降、SSH 公開鍵も生成できるようになりました。

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
)

注: 少なくとも version が必要です1.4.0

注: SSH クライアントがこの秘密鍵の形式を認識 PKCS8しない場合は、 TraditionalOpenSSL.

于 2016-08-24T14:55:21.897 に答える
42

これを行うことを検討している将来の旅行者がいる場合に備えて。RSA モジュールは現在、OpenSSH 形式での公開鍵の書き出しをサポートしています (以前の投稿の時点ではサポートしていなかった可能性があります)。だから私はあなたが必要なことをすることができると思います:

from os import chmod
from Crypto.PublicKey import RSA

key = RSA.generate(2048)
with open("/tmp/private.key", 'wb') as content_file:
    chmod("/tmp/private.key", 0600)
    content_file.write(key.exportKey('PEM'))
pubkey = key.publickey()
with open("/tmp/public.key", 'wb') as content_file:
    content_file.write(pubkey.exportKey('OpenSSH'))

キーはバイナリ モードで書き込む必要があるため、ファイルは「wb」で開かれます。明らかに、秘密鍵を /tmp に保存しないでください...

于 2014-03-17T08:15:30.640 に答える
6

2012 年 5 月 9 日編集:

pycrypto にはすでにこれがあることに気付きました:

import os
from Crypto.PublicKey import RSA

key = RSA.generate(2048, os.urandom)
print key.exportKey('OpenSSH')

このコードは私のために働きます:

import os
from Crypto.PublicKey import RSA

key = RSA.generate(2048, os.urandom)

# Create public key.                                                                                                                                               
ssh_rsa = '00000007' + base64.b16encode('ssh-rsa')

# Exponent.                                                                                                                                                        
exponent = '%x' % (key.e, )
if len(exponent) % 2:
    exponent = '0' + exponent

ssh_rsa += '%08x' % (len(exponent) / 2, )
ssh_rsa += exponent

modulus = '%x' % (key.n, )
if len(modulus) % 2:
    modulus = '0' + modulus

if modulus[0] in '89abcdef':
    modulus = '00' + modulus

ssh_rsa += '%08x' % (len(modulus) / 2, )
ssh_rsa += modulus

public_key = 'ssh-rsa %s' % (
    base64.b64encode(base64.b16decode(ssh_rsa.upper())), )
于 2011-03-28T03:10:13.553 に答える
5

ssh で使用されるキーは base64 でエンコードされているだけで、M2Crypto についてはよくわかりませんが、簡単に概要を見てみると、次の方法でやりたいことができるようです。

import os
from base64 import b64encode
from M2Crypto import RSA            

key = RSA.gen_key(1024, 65537)
raw_key = key.pub()[1]
b64key = b64encode(raw_key)

username = os.getlogin()
hostname = os.uname()[1]
keystring = 'ssh-rsa %s %s@%s' % (b64key, username, hostname)

with open(os.getenv('HOME')+'/.ssh/id_rsa.pub') as keyfile:
    keyfile.write(keystring)

生成されたキーを SSH でテストしていないので、機能するかどうか教えてください (そう思うべきです)。

于 2010-03-18T01:06:09.997 に答える
2

key.pub() のコンテンツに出力される ssh-keygen の base64 でデコードされたバージョンは、キーファイルの形式は次のとおりです。

b64encode('\x00\x00\x00\x07ssh-rsa%s%s' % (key.pub()[0], key.pub()[1]))
于 2010-10-15T04:19:02.967 に答える
2

必要に応じて、それ自体を使用することもできssh-keygenます。これを拡張してファイルを作成し、open後でコンテンツを読み取るために使用することもできますが、ここでは既存のキーから .pub キーを作成することに焦点を当てました。

from subprocess import Popen, PIPE
import os

home = f'{os.path.expanduser("~")}'
cert_pos = f'{home}/.ssh/my_key'
your_key_pw = ''

cmd = ['ssh-keygen', '-y', '-f', cert_pos]
if your_key_pw:
    cmd.append('-P')
    cmd.append(your_key_pw)

p = Popen(cmd, stdout=PIPE)
p.wait()
res, err = p.communicate()

cert_content = res.decode('utf-8')
于 2019-12-18T12:14:21.867 に答える
1

これは、内部で PyCrypto を活用する Twisted Conch ライブラリを使用した例です。API ドキュメントはhttp://twistedmatrix.com/documents/current/api/twisted.conch.ssh.keys.htmlにあります。

from twisted.conch.ssh import keys

# one-time use key
k="""-----BEGIN RSA PRIVATE KEY-----
PRIVATE KEY STUFF
-----END RSA PRIVATE KEY-----"""

# create pycrypto RSA object
rsa = keys.RSA.importKey(k)

# create `twisted.conch.ssh.keys.Key` instance which has some nice helpers
key = keys.Key(rsa)

# pull the public part of the key and export an openssh version
ssh_public = key.public().toString("openssh")
print ssh_public
于 2012-02-26T23:58:40.243 に答える
1

ドキュメントpycryptodomeで説明されているように使用できます:

from Crypto.PublicKey import RSA

key = RSA.generate(2048)
private_key = key.export_key()
file_out = open("private.pem", "wb")
file_out.write(private_key)

public_key = key.publickey().export_key()
file_out = open("receiver.pem", "wb")
file_out.write(public_key)
于 2018-12-06T11:24:57.103 に答える
0

Python に標準で付属しているようなライブラリは知りません。

サードパーティのライブラリに注目したい場合は、paramikoライブラリが役立つかもしれません ( PyPI からも入手できます)。SSH プロトコルを実装し、既存のキーを処理する機能を備えていますが、それらを生成することはありません。

キーの生成は、そのライブラリへの追加に役立つ可能性があり (開発者と協力して Paramiko ライブラリに組み込むことができます)、最初から行うよりも簡単に開始できます。

于 2010-03-17T23:01:58.890 に答える
0

オブジェクトである間に AAAA...Dfg== 文字列を取得できますか? その場合、組み込みの save_pub_key 関数を使用する代わりに、自分でファイルを開いて保存することができます。

于 2010-03-17T22:53:11.717 に答える
0

推測ですが...次のようなことを試しましたか?:

print "ssh-rsa " + "".join([ l.strip() for l in open('/tmp/my.key.pub') if not l.startswith('-----')])
于 2010-03-17T22:53:51.507 に答える