ssh公钥分析器
sshpubkeys的Python项目详细描述
版本2和版本3之间的主要更改
- 放弃了对Python2.6和3.3的支持
- 即使在宽松模式下,dsa密钥也必须是10242048或3072位(之前这是宽松的)
- 接口(api)完全相同
用法
用于验证openssh公钥的本机实现。
目前支持带有nist曲线的ssh rsa、ssh dss(dsa)、ssh-ed25519和ecdsa密钥。
安装:
pip install sshpubkeys
或者克隆repository并使用
python setup.py install
用法:
import sys from sshpubkeys import SSHKey ssh = SSHKey("ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAYQCxO38tKAJXIs9ivPxt7AY" "dfybgtAR1ow3Qkb9GPQ6wkFHQqcFDe6faKCxH6iDRteo4D8L8B" "xwzN42uZSB0nfmjkIxFTcEU3mFSXEbWByg78aoddMrAAjatyrh" "H1pON6P0= ojarva@ojar-laptop", strict=True) try: ssh.parse() except InvalidKeyError as err: print("Invalid key:", err) sys.exit(1) except NotImplementedError as err: print("Invalid key type:", err) sys.exit(1) print(ssh.bits) # 768 print(ssh.hash_md5()) # 56:84:1e:90:08:3b:60:c7:29:70:5f:5e:25:a6:3b:86 print(ssh.hash_sha256()) # SHA256:xk3IEJIdIoR9MmSRXTP98rjDdZocmXJje/28ohMQEwM print(ssh.hash_sha512()) # SHA512:1C3lNBhjpDVQe39hnyy+xvlZYU3IPwzqK1rVneGavy6O3/ebjEQSFvmeWoyMTplIanmUK1hmr9nA8Skmj516HA print(ssh.comment) # ojar@ojar-laptop print(ssh.options_raw) # None (string of optional options at the beginning of public key) print(ssh.options) # None (options as a dictionary, parsed and validated)
解析授权密钥文件:
from sshpubkeys import AuthorizedKeysFile key_file = AuthorizedKeysFile("""ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEGODBKRjsFB/1v3pDRGpA6xR+QpOJg9vat0brlbUNDD\n""" """#This is a comment\n\n""" """ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBAF9QpvUneTvt8""" """lu0ePSuzr7iLE9ZMPu2DFTmqh7BVn89IHuQ5dfg9pArxfHZWgu9lMdlOykVx0I6OXkE35A/mFqwwApyiPmiwno""" """jmRnN//pApl6QQFINHzV/PGOSi599F1Y2tHQwcdb44CPOhkUmHtC9wKazSvw/ivbxNjcMzhhHsWGnA==""" strict=True, disallow_options=True) for key in key_file.keys: print(key.key_type, key.bits, key.hash_512())
选项
将构造函数中的选项设置为关键字(即sshkey(none,strict=false))
- 严格:默认为true。不允许密钥openssh的ssh keygen拒绝创建。例如,这包括dsa密钥长度!=1024位,RSA密钥小于1024位。如果设置为false,则尝试允许openssh接受的所有密钥,包括高度不安全的1位dsa密钥。
- skip_option_parsing:如果设置为true,则不分析选项字符串(ssh.options_raw已填充,但ssh.options未填充)。
- 不允许选项:如果设置为true,则不允许选项,它将引发 无效选项错误。
例外情况
- 如果遇到无效的ecdsa曲线或未知的密钥类型,则为notimplementederror。
- 如果遇到任何其他错误,则无效键错误:
- 如果密钥太短(rsa为768位,<;1024 dsa为1024位,<;256 ed25519为256位)
- toolongkeyerror如果密钥太长(rsa为16384,dsa为1024,ed25519为256)
- 如果密钥类型(上例中的“ssh rsa”)与base64编码数据中包含的内容不匹配,则为invalidtypeerror。
- 如果解码和提取数据失败,则返回格式错误的ddataerror。
- 如果选项字符串无效,则无效选项错误。
- 如果选项名称包含无效字符,则返回invalidoptionnameerror。
- 如果无法识别选项名,则返回UnknownOptions名称错误。
- MissingMandatoryOptionValueerror如果选项需要参数,但它不存在。
测试
有关单元测试,请参见“tests/”文件夹。使用
python setup.py test
或
python3 setup.py test
运行测试套件。如果您有未正确解析的密钥,或者格式不正确的密钥导致不正确的异常,请将您的public key发送到olli@jarva.fi,我将包含它。或者,create a new issue或在github中生成a pull request。