Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在使用常春藤和私人公司存储库时,我应该将凭据放在哪里?_Java_Ant_Ivy_Nexus - Fatal编程技术网

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

Java 在使用常春藤和私人公司存储库时,我应该将凭据放在哪里?,java,ant,ivy,nexus,Java,Ant,Ivy,Nexus,我使用的是Ant+Ivy,我的公司最近为我们自己的私人图书馆安装了Nexus服务器。Ivy可以通过使用ibilio解析器和m2compatible=true从Nexus服务器获取依赖项,但我必须将我的凭据放入ivysettings.xml文件中 不同的开发人员应该如何存储他们的凭据 是否不应在vcs中提交ivysettings.xml文件 我真的不想以纯文本形式存储密码。使用属性控制Nexus凭据的设置文件: <ivysettings> <property name="

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

不同的开发人员应该如何存储他们的凭据

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


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

使用属性控制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>
更新/增强 将密码作为属性存储在文件系统上需要加密

具有可生成加密字符串的命令行程序:

$ 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>

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

除了Mark O'Connor的回答之外,您还可以通过将这些属性放入启动文件或ant使用的文件中,在日常工作中以及同事的窥探下隐藏密码。请注意,它们在这两个地方都不是很安全。

就我而言,命令行凭据不是一个选项,因为我正在运行Jenkins,它们会清晰地粘贴到构建输出上,因此我的解决方案通过合理的安全性达到了平衡

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

  • 在构建文件顶部附近,导入属性文件

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

    repo.username=admin
    repo.password=password
    
    <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,但去掉username和passwd属性


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

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>

..

也就是说,属性名不应该被${…}包围(我花了很长时间才找到失败的原因-但现在我知道如何调试ivy access-使用commons-httpclient-3.0,将所有内容设置为verbose等)

如果我真的怀疑密码是否保存在明文中,我将编写一个ANT任务,从属性文件读取加密副本。只看一张便条,你仍然可以在~/.bash_历史中挖掘出一条敏感信息file@om-是的,解决方案还远远不够完美。
<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>
  <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>