我正在尝试达到 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/