def _get_keys(self):
data_folder = self.get_plugin_data_folder()
key_filename = os.path.join(data_folder, 'p3d_key')
self._logger.debug('key_filename: {}'.format(key_filename))
if not os.path.isfile(key_filename):
self._logger.debug('Generating key pair')
key = crypto.PKey()
key.generate_key(crypto.TYPE_RSA, 2048)
with open(key_filename, 'w') as f:
f.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, key))
if sys.platform != 'win32':
os.chmod(key_filename, stat.S_IRUSR | stat.S_IWUSR)
try:
with open(key_filename) as f:
key = f.read()
self._key = crypto.load_privatekey(crypto.FILETYPE_PEM, key)
except:
self._key = None
self._logger.error("Unable to generate or access key.")
return
if hasattr(self._key, 'dump_publickey'):
self._public_key = crypto.dump_publickey(crypto.FILETYPE_PEM, self._key)
else:
pubkey_filename = key_filename + ".pub"
if not os.path.isfile(pubkey_filename) or os.path.getsize(pubkey_filename) == 0:
if sys.platform != 'win32':
os.chmod(key_filename, stat.S_IRUSR | stat.S_IWUSR)
command_line = "ssh-keygen -e -m PEM -f {key_filename} > {pubkey_filename}".format(key_filename=key_filename, pubkey_filename=pubkey_filename)
returncode, stderr_text = self._system(command_line)
if returncode != 0:
self._logger.error("Unable to generate public key (may need to manually upgrade pyOpenSSL, see README) {}: {}".format(returncode, stderr_text))
self._key = None
try:
os.remove(pubkey_filename)
except OSError:
pass
return
with open(pubkey_filename) as f:
self._public_key = f.read()
评论列表
文章目录