我的目标是开发一个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()
我似乎无法找到显示密钥长度属性的方法。有什么想法吗?
答案 0 :(得分:2)
一般方法是:
print key.size()
PKey
的{{3}}表示,这是 bytes 中的大小,而不是位。所以,你想得到“2048”,你需要乘以8。
如果你知道它是RSA,并且已经调用get_rsa()
,你可以这样做:
print len(rsa)
the docs不说这是什么,但它以位为单位返回长度。
与M2Crypto一样,您真正需要关注的是libssl / libcrypto文档(而不是openssl命令行工具)。而且,如果您无法猜测调用哪些C函数,则源通常非常简单。
例如,您可以看到The docs是:
def size(self):
"""
Return the size of the key in bytes.
"""
return m2.pkey_size(self.pkey)
def __len__(self):
return m2.rsa_size(self.rsa) << 3
根据M2Crypto中的标准编码约定,m2.rsa_size
是围绕RSA.__len__
的SWIG包装。
答案 1 :(得分:1)
根据@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