5

我在 python 中使用以下代码和 pyOpenSSL 创建了一个密钥对:

from OpenSSL import crypto
k = crypto.PKey()
k.generate_key(crypto.TYPE_RSA, 2048)
  1. 现在如何从密钥对象创建私钥和公钥 .pem 文件?
  2. 如果有任何可用的教程,请告诉我。我没有找到。从手册中很难知道,因为我是 OpenSSL 的新手。
  3. 如果 RSA 中没有使用特定的唯一密钥,相同的代码创建两个相同的密钥对的可能性有多大?
4

3 回答 3

10

我知道这是一个老问题 - 但正如我刚刚发现的那样,我想我会添加一个答案。

使用 Python 3.x 执行此操作的最简单方法是使用PyCryptodome

在 Python 中(对于 2048 位密钥):

from Cryptodome.PublicKey import RSA
key = RSA.generate(2048)
pv_key_string = key.exportKey()
with open ("private.pem", "w") as prv_file:
    print("{}".format(pv_key_string.decode()), file=prv_file)

pb_key_string = key.publickey().exportKey()
 with open ("public.pem", "w") as pub_file:
    print("{}".format(pb_key_string.decode()), file=pub_file)

如果要在 (Linux) 命令行上检查私钥,请使用:

$ openssl rsa -check -inform pem -noout -in private.pem 
RSA key ok
...
于 2017-08-25T13:41:19.193 回答
4

我希望这对将来的人们有所帮助,因为我有同样的需求并且找不到答案,所以我自己做了。以为我会和你分享。

1. 创建 PEM 文件

bio_pub = _new_mem_buf()  # Memory buffers to write to
bio_priv = _new_mem_buf()

helper = OpenSSL.crypto._PassphraseHelper(OpenSSL.crypto.FILETYPE_PEM, None)

pk = OpenSSL.crypto.PKey()
pk.generate_key(OpenSSL.crypto.TYPE_RSA, n)

# Convert from EVP_PKEY type to RSA type
rsa_pkey = _lib.EVP_PKEY_get1_RSA(pk._pkey)


result_code = _lib.PEM_write_bio_RSAPublicKey(bio_pub, rsa_pkey)
result_code = _lib.PEM_write_bio_RSAPrivateKey(
    bio_priv, rsa_pkey, _ffi.NULL, _ffi.NULL, 0,
    helper.callback, helper.callback_args)

在这部分之后,您将在缓冲区中拥有公钥和私钥。要将其作为字符串获取,您可以调用以下函数:

_bio_to_string(bio_pub), _bio_to_string(bio_priv)

我将这些导入用于 OpenSSL.crypto 的特殊“私有”功能:

import OpenSSL
from OpenSSL._util import lib as _lib, ffi as _ffi
from OpenSSL.crypto import _new_mem_buf, _bio_to_string
于 2015-05-12T18:06:57.737 回答
1

您可以按照以下教程创建 .pem 密钥:

https://help.ubuntu.com/community/OpenSSL

假设您要创建一个 CA(证书颁发机构)证书,这并不复杂,因为您已经必须从某个地方获取 CA,因为它不是免费的。

如果您只想为您的 ssl 连接测试创建一个密钥,最好创建一个自签名证书。

然后确保您首先安装了 openssl 并在您的服务器上解析了 CN(通用名称)。否则,您将无法使用创建的证书。

对于自签名证书,请使用以下命令行:

$ openssl genrsa -des3 -passout pass:x -out server.pass.key 2048
$ openssl rsa -passin pass:x -in server.pass.key -out server.key
$ rm server.pass.key
$ openssl req -new -key server.key -out server.csr (list of question to answer)
$ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt 

获得证书创建后,您必须激活服务器 mod-ssl 并添加找到证书的行。稍后您必须将该证书插入到您的 IE 证书列表中,以使其与您的 apache ssl 连接守护进程一起使用。

于 2013-10-29T07:23:18.870 回答