我已经接手了这个项目,在该项目中,很多Jenkins凭证都有我需要知道的密码或密码字符串才能继续进行该项目,但是不幸的是,这些文件并没有记录在任何地方。

我已经检查了存储这些凭据的credentials.xml文件,但它们不是纯文本格式,例如:

<passphrase>{AAAAAAAAAAAANzxft/rDzyt8mhxpn3O72dxvVqZksL5vBJ4jNKvAjAA=}</passphrase>


注意:出于隐私原因,我对其进行了略微更改。

如何根据以上字符串解密其原始密码?

评论

建议的答案出现错误:println(hudson.util.Secret.decrypt(“ {{xxx / wwww + yyyy / zzzz =}}”))+符号破坏了脚本。有什么建议吗?

@JayBau尝试使用单括号:“ {...}”,再删除一次。

这实际上是一个SO问题的副本:stackoverflow.com/questions/37683143(尽管从技术上讲,只有在DevOps上询问链接的问题时,它才有资格作为副本)。

#1 楼

幸运的是,有一个hudson.util.Secret.decrypt()函数可用于此功能,因此:


在Jenkins中,请转至/script页面。 br />
println(hudson.util.Secret.decrypt("{XXX=}"))


或:

println(hudson.util.Secret.fromString("{XXX=}").getPlainText())


其中{XXX=}是您的加密密码。

相反,运行:

println(hudson.util.Secret.fromString("some_text").getEncryptedValue())



来源:gist at tuxfight3r/jenkins-decrypt.groovy


或者另外检查以下脚本:tweksteen/jenkins-decrypt
menski/jenkins-decrypt.py。 >

评论


+1,对于使用SecretBytes类的秘密文件,您可以看到我的答案。

–akostadinov
20-2-19在11:13

尝试println(hudson.util.Secret.fromString(“ {XXX =}”)。getPlainText())时无输出

– QkiZ
20-10-15在10:00

#2 楼

这是一个简短的代码段,您可以从jenkins脚本控制台运行,以将所有凭据转储为纯文本。

 com.cloudbees.plugins.credentials.SystemCredentialsProvider.getInstance().getCredentials().forEach{
  it.properties.each { prop, val ->
    if (prop == "secretBytes") {
      println(prop + "=>\n" + new String(com.cloudbees.plugins.credentials.SecretBytes.fromString("${val}").getPlainData()) + "\n")
    } else {
      println(prop + ' = "' + val + '"')
    }
  }
  println("-----------------------")
}
  

为非系统凭据提供程序列出的更复杂的版本:

 import com.cloudbees.plugins.credentials.CredentialsProvider
import com.cloudbees.plugins.credentials.Credentials
import com.cloudbees.plugins.credentials.domains.Domain
import jenkins.model.Jenkins
def indent = { String text, int indentationCount ->
  def replacement = "\t" * indentationCount
  text.replaceAll("(?m)^", replacement)
}

Jenkins.get().allItems().collectMany{ CredentialsProvider.lookupStores(it).toList()}.unique().forEach { store ->
  Map<Domain, List<Credentials>> domainCreds = [:]
  store.domains.each { domainCreds.put(it, store.getCredentials(it))}
  if (domainCreds.collectMany{ it.value}.empty) {
    return
  }
  def shortenedClassName = store.getClass().name.substring(store.getClass().name.lastIndexOf(".") + 1)
  println "Credentials for store context: ${store.contextDisplayName}, of type $shortenedClassName"
  domainCreds.forEach { domain , creds ->
    println indent("Domain: ${domain.name}", 1)
    creds.each { cred ->
      cred.properties.each { prop, val ->
        println indent("$prop = \"$val\"", 2)
      }
      println indent("-----------------------", 2)
    }
  }
}
 


评论


如何修改它以从所有域,所有文件夹中获取凭据?

– jmary
19年8月14日在9:47

@jmary我添加了另一个示例

–马格努斯
19年8月15日在0:58

万分感谢 :-)

– jmary
19年8月16日在9:00

如果您想要更简单的oneliner:com.cloudbees.plugins.credentials.SystemCredentialsProvider.getInstance()。getCredentials()。forEach {println it.dump()。replace('','\ n')}

– ymajoros
20 Jan 17 '20在10:36

#3 楼

基于Magnus的回答,但作为简单的单行代码,仍具有可读的输出:


评论


简短而好看!

–akostadinov
20-2-19在11:03

#4 楼

记录下来,将以下代码片段粘贴到控制台中也可以完成该工作:

#5 楼

带有hudson.util.Secret的@kenorb示例很好。列出所有凭据的答案也非常有用(感谢@ymajoros提供一线支持)。

尽管使用了secretBytes,但仍显示加密的字符串,但这些文件不处理机密文件。在这种情况下,需要使用SecretBytes类。假设文件为UTF-8,则可以执行以下操作:

 secret = "{....}"
new String(com.cloudbees.plugins.credentials.SecretBytes.fromString(secret).getPlainData())
 


HTH