3

我的目标是开发一个 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()

我似乎找不到显示密钥长度属性的方法。有任何想法吗?

4

2 回答 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

于 2013-03-22T19:15:28.323 回答
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是一个 SWIG 包装器RSA_size

于 2013-03-22T18:13:47.297 回答