从 Jenkins 的 credentials.xml 中提取密码短语

我给 Jenkins 加了一个 SSH 凭证。

不幸的是,我忘记了 SSH 密码,现在想从位于 ${JENKINS_HOME}/credentials.xml的 Jenkins 凭证归档中获取它。

该 XML 文档似乎有加密在 XML 标记 <passphrase><password>中的凭据。

如何检索明文密码短语?

84358 次浏览

是的,你可以拿回来。它是 AES 加密的,在搜索密码之前您必须做一些事情。看看 秘密类。

但是你看,现在已经有一些剧本了:

Https://github.com/tweksteen/jenkins-decrypt
Https://gist.github.com/menski/8f9980999ed43246b9b2

更多的信息和使用 java 的方法,你可以在这里找到:

詹金斯用的是什么密码加密?

通过访问 http(s)://${JENKINS_ADDRESS}/script打开 Jenkins 安装的脚本控制台。

在那里,执行以下 Groovy 脚本:

println( hudson.util.Secret.decrypt("${ENCRYPTED_PASSPHRASE_OR_PASSWORD}") )

其中 ${ENCRYPTED_PASSPHRASE_OR_PASSWORD}是要查找的 <password><passphrase>XML 元素的加密内容。

如果您正在使用 Jenkins 凭证绑定插件,您可以让它将您的密码写入一个文件。你不能只是输出到控制台,因为插件会把它输出出去。

Credential Binding Plugin configuration to get password text on Windows

我知道这很古老,但是... 对于管道来说非常简单。下面是一个将凭据打印到控制台的示例管道:

node {
def creds


stage('Sandbox') {
withCredentials([usernamePassword(credentialsId: 'my-creds', passwordVariable: 'C_PASS', usernameVariable: 'C_USER')]) {
creds = "\nUser: ${C_USER}\nPassword: ${C_PASS}\n"
}


println creds
}
}

执行此管道将在控制台中产生以下内容:

Started by user First Last (username)
Running in Durability level: MAX_SURVIVABILITY
[Pipeline] node
Running on Jenkins in /jenkins/workspace/sandbox
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Sandbox)
[Pipeline] withCredentials
[Pipeline] {
[Pipeline] }
[Pipeline] // withCredentials
[Pipeline] echo


User: testuser
Password: Ab37%ahc*z


[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

这里的技巧是凭证只在 withCredentials块内被掩盖。如果将它们分配给块外定义的变量,然后在块外打印该变量,则不会应用屏蔽。这被报告为一个 bug,但是没有对它进行任何操作。

首先,您需要获得加密的值,该值可以方便地放置在您感兴趣的凭据项的 password 字段的 value属性中。导航到 Jenkins UI 中的凭据项,单击 password 字段上的 InspectElement,并复制其 value属性(类似于 {AQAABAAAa6VBbyzg5AWMW2RnfaBaj46})

然后,转到 JENKINS_URL/script并执行 println( hudson.util.Secret.decrypt("{AQAABAAAa6VBbyzg5AWMW2RnfaBaj46}") ); 解密的密码出现在输入字段下面

转到 管理 Jenkins-> 脚本控制台并运行以下代码:

import java.nio.charset.StandardCharsets;
def creds = com.cloudbees.plugins.credentials.CredentialsProvider.lookupCredentials(
com.cloudbees.plugins.credentials.Credentials.class
)


for (c in creds) {
println(c.id)
if (c.properties.description) {
println("   description: " + c.description)
}
if (c.properties.username) {
println("   username: " + c.username)
}
if (c.properties.password) {
println("   password: " + c.password)
}
if (c.properties.passphrase) {
println("   passphrase: " + c.passphrase)
}
if (c.properties.secret) {
println("   secret: " + c.secret)
}
if (c.properties.secretBytes) {
println("    secretBytes: ")
println("\n" + new String(c.secretBytes.getPlainData(), StandardCharsets.UTF_8))
println("")
}
if (c.properties.privateKeySource) {
println("   privateKey: " + c.getPrivateKey())
}
if (c.properties.apiToken) {
println("   apiToken: " + c.apiToken)
}
if (c.properties.token) {
println("   token: " + c.token)
}
println("")
}