python - 在python中准确提取PEM格式的公钥为 "Decimal"

标签 python encoding openssl public-key pem

我正在尝试达到 PEM 公钥的十进制格式的精确点。不在 Pem。

首先我使用 PEM 证书

from socket import socket

import ssl
from OpenSSL import SSL
import string
import traceback
import json
import re

for i in file_content:
    final_list.append(i.strip())


file = open("SSL_out_put.json","w")
Temp_Priv_Key_list = [] 

counter = 1
for i in final_list[:4047]:
    print counter
    print i
    counter = counter + 1
    try:
        x = ssl.get_server_certificate((i, 443))
        Temp_Priv_Key_list.append({
            'counter' : counter,
            'i' : i,
            'x' : x
            })
        content = json.dumps(Temp_Priv_Key_list, indent=3)
        file.write(content)
        Temp_Priv_Key_list=[]
    except Exception , err:
        pass
        print Exception , err
file.close()

之后我使用了“from pyasn1_modules import pem, rfc2459” 提取公钥。这将为公钥提供二进制表示。转换十进制后,我意识到这不是我想使用的。 请注意,根据我的经验,pyasc1 无法正常工作。

经过大量研究,我在这里找到了这段代码来提取公钥,但仍然是 PEM 格式。

from cryptography import x509
from cryptography.hazmat.backends import default_backend

with open("cert.pem", "rb") as f:
    cert = f.read()

cert = str(cert)

x509 = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, cert)
key_data = (OpenSSL.crypto.dump_publickey(OpenSSL.crypto.FILETYPE_PEM,x509.get_pubkey()))
print key_data

现在我的公钥仍然是 Pem 格式。经过一些其他研究后,我发现了这一点,但只给出了这个输出。仍然无法提取十进制或二进制格式的公钥。

from Crypto.PublicKey import RSA
from base64 import b64decode
from Crypto.Util import asn1

with open("public_key.pem", "rb") as f:
   cert = f.read()

#print cert

keyDER = b64decode(cert)
keyPub = RSA.importKey(keyDER)

print keyPub}

这段代码会给你输出 <_RSAobj @0x7f65559da320 n(2048),e>

这是我的第一个问题。抱歉,如果我问得不恰当。我的大脑充满了各种现在无法理解的垃圾编码。有人可以帮我解决这个问题吗?

我发现http://lapo.it/asn1js/我确实需要它,但我不能在 python 中使用它。我可以使用 selenium 或 scrapy 来提取我想要的数据。但这真的会杀了我。我尝试过的那些模块应该有一种方法:

我在这个主题上尝试过的那些模块:

from pyasn1_modules import pem, rfc2459
from pyasn1.codec.der import decoder
from cryptography import x509
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import rsa
#import pem
import socket, ssl
import OpenSSL

顺便说一句,谁和我一起遇到这个问题。 pycrypto 在 Windows 上无法正常工作(尽管我安装了 VCPython2.7.msi“如果你尝试一下你就会知道我的意思”)我将其切换到虚拟 ubuntu。谢谢。

最佳答案

Python ssl lib 对于这个问题并不强大。所以我在 Linux 终端上将整个内容更改为 OPENSSL。

timeout 3s openssl s_client -servername (site_name) -connect (site_name):443 -no_alt_chains

这将为您提供浏览器将提供的 PEM,因为 s_client 支持 SNI。

openssl x509 -in outer.pem -text

通过这个,您将获得 PEM 文件的所有对等体。如果你想要准确地获得公钥模数,它将以十六进制形式提供给你。

openssl x509 -in outer.pem -modulus -noout

一点点子进程,您可以轻松地从终端输出获取输出文件,并且使用一点点正则表达式,您将获得您想要的所有内容。 Ty openssl。我希望我可以帮助阅读本文的人。

关于python - 在python中准确提取PEM格式的公钥为 "Decimal",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47675696/

相关文章:

python - SerializerMethodField 的函数 get_fieldname 未被调用

java - 阿拉伯文件名转换为问号

java - 使用 OpenSSL 验证 Java 签名类签名

c - HMAC_Init_ex 损坏堆栈空间

node.js - 允许 node.js HTTPS 请求的所有 SSL 协议(protocol)

python - 单 GPU 上的 Tensorflow 2.0 训练模型

python - Django-Registration & Django-Profile,使用你自己的自定义表单

python - Pandas 时间戳到 datetime.datetime()

python - 如何将正确的编码参数传递给markdown_py?

javascript - 在 URL 中使用 Crockford 的基数 32 作为 ID?