📅  最后修改于: 2023-12-03 15:27:56.215000             🧑  作者: Mango
詹金斯凭据(Jenkins Credentials)是Jenkins中用于存储敏感信息,例如密码和API密钥等的方式之一。然而,这些凭据存储为加密形式。在某些情况下,需要解密它们(例如进行数据迁移或备份)。
首先,需要使用Jenkins的API以编程方式访问凭据。可以使用以下代码片段获取所有凭据:
import requests
response = requests.get('http://jenkins-url:port/credentials/store/system/domain/_/api/json')
credentials = response.json()['credentials']
使用上面的代码片段,可以获取所有系统凭据。如果想要获取单个凭据,可以使用类似以下的代码片段:
response = requests.get('http://jenkins-url:port/credentials/store/system/domain/_/credential/credentialId/api/json')
credential = response.json()
不幸的是,Jenkins不提供任何程序化方法来解密凭据。因此,需要直接访问Jenkins的加密密钥并使用它们手动解密凭据。
Jenkins使用两个密钥来加密凭据:主密钥和项密钥。主密钥是Jenkins的私钥并存储在Jenkins的磁盘上。项密钥是每个凭据独有的,并存储在Jenkins的内存中。
以下代码片段可以读取主密钥并解密项密钥:
import base64
import os
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
# Read the master key from disk
with open('/var/lib/jenkins/secrets/master.key', 'rb') as f:
master_key = base64.b64decode(f.read())
# Decrypt the credential using its own encrypted key
def decrypt(encrypted):
iv = encrypted[:16]
tag = encrypted[-16:]
ciphertext = encrypted[16:-16]
decryptor = Cipher(algorithms.AES(master_key), modes.GCM(iv, tag), backend=default_backend()).decryptor()
return decryptor.update(ciphertext) + decryptor.finalize()
现在你可以使用decrypt
函数来解密凭据了:
import json
credential = credentials[0] # Choose a credential to decrypt
encrypted_key = base64.b64decode(credential['data']['encipheredKey'])
encrypted_password = base64.b64decode(credential['data']['secretBytes'])
key = decrypt(encrypted_key)
password = decrypt(encrypted_password).decode('utf-8')
print(json.dumps({'name': credential['displayName'], 'username': credential['data']['username'], 'password': password}))
虽然Jenkins不直接支持解密凭据,但仍然可以使用Jenkins的私钥手动解密它们。这里提供的代码片段是一个起点,你可以使用它们来构建自己的解密工具。