首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将PEM文件转换为DER

将PEM文件转换为DER
EN

Stack Overflow用户
提问于 2016-03-14 09:39:50
回答 4查看 12K关注 0票数 3

我目前正在尝试编写一个脚本,该脚本允许我从隐藏服务的私钥文件中计算Tor HS地址。为此,需要将文件转换为DER格式。

使用OpenSSL可以通过以下方式完成此操作:

代码语言:javascript
复制
openssl rsa -in private_key -pubout -outform DER

使用以下命令将其通过管道传输到python:

代码语言:javascript
复制
base64.b32encode(hashlib.sha1(sys.stdin.read()[22:]).digest()[:10]).lower()'

将正确返回地址。

然而,我想只使用python来执行相同的操作。我的问题是,使用pycrypto模块,DER的输出是不同的,因此地址是不正确的。

代码语言:javascript
复制
key = RSA.importKey(keyfile.read()).publickey()
print(key.exportKey(format='DER'))

将导致与openssl调用不同的输出。这仅仅是一个允许不同结果的实现问题吗?还是我在什么地方搞错了?

任何帮助都将不胜感激

EN

回答 4

Stack Overflow用户

发布于 2016-07-22 13:13:23

使用python将证书转换为der

首先,我们加载文件

代码语言:javascript
复制
cert_file = keyfile.read()

然后我们将其转换为pem格式。

代码语言:javascript
复制
from OpenSSL import crypto
cert_pem = crypto.load_certificate(crypto.FILETYPE_PEM, cert_file)

现在我们正在生成der-output

即:output equals to openssl x509 -outform der -in certificate.pem -out certificate.der.

代码语言:javascript
复制
cert_der = crypto.dump_certificate(crypto.FILETYPE_ASN1, cert_pem)
票数 7
EN

Stack Overflow用户

发布于 2019-03-01 21:29:29

我一直在寻找类似的东西,到2019年3月,OpenSSL建议使用pyca/cryptography而不是crypto模块。(source)

下面是您想要做的:将PEM转换为DER

代码语言:javascript
复制
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization

with open("id_rsa", "rb") as keyfile:
    # Load the PEM format key
    pemkey = serialization.load_pem_private_key(
        keyfile.read(),
        None,
        default_backend()
    )
    # Serialize it to DER format
    derkey = pemkey.private_bytes(
        serialization.Encoding.DER,
        serialization.PrivateFormat.TraditionalOpenSSL,
        serialization.NoEncryption()
    )
    # And write the DER format to a file
    with open("key.der", "wb") as outfile:
        outfile.write(derkey)
票数 4
EN

Stack Overflow用户

发布于 2020-06-02 19:20:19

我想转换证书文件,而不是从DER到PEM的密钥文件,但谷歌把我带到这里。感谢@alleen1的回答,我可以将证书或密钥从DER转换为PEM,反之亦然。

第一步,加载文件。

Step two,将其保存为您想要的格式。

我省略了获取"pem_data“和"der_data”的过程,您可以从文件或其他任何地方获取它。它们应该是字节而不是字符串,需要时使用方法.encode()。

代码语言:javascript
复制
from cryptography import x509
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.backends import default_backend

# Step one, load the file. 

# Load key file
# PEM 
key = serialization.load_pem_private_key(pem_data, None, default_backend())
# DER
key = serialization.load_pem_private_key(der_data, None, default_backend())

# Load cert file
# PEM
cert = x509.load_pem_x509_certificate(pem_data, default_backend())
# DER
cert = x509.load_der_x509_certificate(der_data, default_backend())

# Step two,save it to the format you want.
# PEM key
key_val = key.private_bytes(
              serialization.Encoding.PEM,
              serialization.PrivateFormat.TraditionalOpenSSL,
              serialization.NoEncryption()
          )
# DER key
key_val = key.private_bytes(
              serialization.Encoding.DER,
              serialization.PrivateFormat.TraditionalOpenSSL,
              serialization.NoEncryption()
          )

# PEM cert
cert_val = cert.public_bytes(serialization.Encoding.PEM)
# DER cert
cert_val = cert.public_bytes(serialization.Encoding.DER)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35978211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档