在使用常春藤和私人公司存储库时,我在哪里放置凭据?

时间:2011-09-21 16:55:22

标签: java ant ivy nexus

我正在使用Ant + Ivy,我公司最近为我们自己的私人图书馆设置了一台Nexus服务器。 Ivy可以通过使用ibilio解析器和m2compatible = true从Nexus服务器获取依赖关系,但我必须将我的凭据放在ivysettings.xml文件中。

不同的开发者应该如何存储他们的凭据?

是不是应该在vcs中提交ivysettings.xml文件?

我真的不想以纯文本格式存储我的密码。

4 个答案:

答案 0 :(得分:12)

使用包含控制Nexus凭据的属性的设置文件:

<ivysettings>
    <property name="repo.host" value="default.mycompany.com" override="false"/>
    <property name="repo.realm" value="Sonatype Nexus Repository Manager" override="false"/>
    <property name="repo.user" value="deployment"  override="false"/>
    <property name="repo.pass" value="deployment123"  override="false"/>          

    <credentials host="${repo.host}" realm="${repo.realm}" username="${repo.user}" passwd="${repo.pass}"/>

    ..
    ..
</ivysettings>

运行构建时,您可以指定真实的用户名和密码:

ant -Drepo.user=mark -Drepo.pass=s3Cret

更新/增强

将密码存储为文件系统上的属性需要加密。

Jasypt有一个可以生成加密字符串的命令行程序:

$ encrypt.sh verbose=0 password=123 input=s3Cret
hXiMYkpsPY7j3aIh/2/vfQ==

这可以保存在构建的属性文件中:

username=bill
password=ENC(hXiMYkpsPY7j3aIh/2/vfQ==)

以下ANT目标将解密任何加密的ANT属性:

<target name="decrypt">
    <taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy" classpathref="build.path"/>

    <groovy>
    import org.jasypt.properties.EncryptableProperties
    import org.jasypt.encryption.pbe.StandardPBEStringEncryptor

    StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor()
    encryptor.setPassword(properties["master.pass"])

    Properties props = new EncryptableProperties((Properties)properties, encryptor);

    props.propertyNames().each {
        properties[it] = props.getProperty(it)
    }
    </groovy>
</target>

当然为了使这项工作,需要将用于加密属性的密码指定为构建的一部分。

ant -Dmaster.pass=123

这意味着该解决方案仅适用于隐藏静态数据。

答案 1 :(得分:8)

就我的目的而言,命令行凭据不是一个选项,因为我正在运行Jenkins并且它们会被明确地粘贴在构建输出上,所以这是我的解决方案,通过合理安全来达到平衡。 / p>

  • 在主目录中创建一个包含敏感信息的属性文件(我们称之为“maven.repo.properties”)

    repo.username=admin
    repo.password=password
    
  • 在构建文件的顶部附近,导入属性文件

    <property file="${user.home}/maven.repo.properties"/>
    
  • 在build.xml下的发布目标中,设置常春藤设置文件位置(确实已签入代码控制)但嵌入了凭据属性

    <target name="publish">
        <ivy:settings file="ivysettings.xml">
            <credentials host="repohostname" realm="Artifactory Realm" username="${repo.username}" passwd="${repo.password}"/>
        </ivy:settings>
        <!-- ivy:makepom and ivy:publish targets go here -->
    </target>
    
  • 像以前一样创建你的ivysettings.xml,但删除用户名和passwd属性

然后,您可以利用操作系统的权限来确保除了您(或您的自动构建实现)之外的所有人都正确隐藏了maven.repo.properties文件。

答案 2 :(得分:2)

Mark O'Connor答案中的ivysettings.xml示例实际上应该如下:

<ivysettings>
  <property name="repo.host" value="default.mycompany.com" override="false"/>
  <property name="repo.realm" value="Sonatype Nexus Repository Manager" override="false"/>
  <property name="repo.user" value="deployment"  override="false"/>
  <property name="repo.pass" value="deployment123"  override="false"/>          

  <credentials host="${repo.host}" realm="${repo.realm}" username="${repo.user}" passwd="${repo.pass}"/>

  ..
</ivysettings>

意思是,属性名称应该被$ {...}包围(我花了很长时间才找出失败的原因 - 但现在我知道如何调试常春藤访问 - 使用commons-httpclient-3.0,将所有内容设置为详细等。)

答案 3 :(得分:0)

除了Mark O'Connor的答案之外,您可以将这些属性隐藏到antrc启动文件或environment variables使用的{{3}}中,从而隐藏日常工作中的密码和工作人员的窥探密码通过蚂蚁。请注意,它们在任何一个地方都不是很安全。