提取公钥长度(位数)
我的目标是写一个Python脚本,连接到一个主机上,然后像使用openssl那样,确定服务器公钥的长度(以位为单位)。
(openssl s_client -connect 10.18.254.29:443)
yada yada yada
Server certificate
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
Server public key is 2048 bit
我已经开始写这个基本的脚本:
from M2Crypto import SSL, RSA
SSL.Connection.clientPostConnectionCheck = None
ctx = SSL.Context()
conn = SSL.Connection(ctx)
conn.connect(('1.1.1.1', 443))
cert = conn.get_peer_cert()
print cert.get_issuer().as_text()
print cert.get_subject().as_text()
print cert.get_fingerprint()
print cert.get_pubkey().get_rsa().as_pem()
但是我找不到办法来显示这个密钥的长度属性。有没有什么想法?
2 个回答
2
根据@abarnert的帮助,我把我的代码改成了下面这样:
from M2Crypto import SSL, RSA
SSL.Connection.clientPostConnectionCheck = None
ctx = SSL.Context()
conn = SSL.Connection(ctx)
conn.connect(('10.18.254.29', 443))
cert = conn.get_peer_cert()
print cert.get_issuer().as_text()
print cert.get_subject().as_text()
print cert.get_fingerprint()
**def size(self):
"""
Return the size of the key in bytes.
"""
return m2.pkey_size(self.pkey)**
打印 cert.get_pubkey().size()*8
2
一般来说,方法是这样的:
print key.size()
根据文档,PKey
的大小是以字节为单位,而不是位。所以,如果你想得到“2048”,你需要把它乘以8。
如果你知道这是RSA,并且已经调用了get_rsa()
,你可以这样做:
print len(rsa)
文档没有说明这个做了什么,但它返回的是以位为单位的长度。
像往常一样,使用M2Crypto时,你真正需要关注的是libssl/libcrypto的文档(而不是openssl命令行工具)。如果你无法猜测调用了哪些C函数,源代码通常是非常简单的。
例如,你可以看到PKey.size()
是:
def size(self):
"""
Return the size of the key in bytes.
"""
return m2.pkey_size(self.pkey)
而RSA.__len__
是:
def __len__(self):
return m2.rsa_size(self.rsa) << 3
根据M2Crypto的标准编码约定,m2.rsa_size
是对RSA_size
的SWIG封装。