【问题标题】:pyOpenSSL creating a pem filepyOpenSSL 创建一个 pem 文件
【发布时间】:2013-10-29 06:54:21
【问题描述】:

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

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

【问题讨论】:

    标签: python pyopenssl


    【解决方案1】:

    我知道这是一个老问题 - 但我刚刚发现它,我想我会添加一个答案。

    使用 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
    ...
    

    【讨论】:

      【解决方案2】:

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

      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
      

      【讨论】:

        【解决方案3】:

        您可以按照以下教程创建 .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 连接守护进程一起工作。

        【讨论】:

        • 这是 OpenSSL,我们必须在 python 中使用命令提示符调用。这里提供的大部分功能和操作在pyOpenSSL中是不可用的...
        • pyOpenssl 是 python 的 openssl 接口,所以继续:openssl.org/source 下载包并安装 Openssl
        • 或者你可以简单地输入命令:sudo apt-get install openssl
        • pyOpenSSL 包含实现我的数字签名所需的加密模块。所以我认为我不需要再次安装 OpenSSL。我有一个创建证书的教程。只是不知道这里如何处理创建的密钥对。 (公钥加密)
        • 我在 windows 中使用 python。
        猜你喜欢
        • 2012-04-05
        • 2010-12-18
        • 1970-01-01
        • 2021-03-12
        • 1970-01-01
        • 2016-01-21
        • 1970-01-01
        • 1970-01-01
        • 2022-12-11
        相关资源
        最近更新 更多