以位为单位提取公钥长度

时间:2013-03-22 18:00:46

标签: python m2crypto

我的目标是开发一个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 个答案:

答案 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)

PKey.size()是:

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