存储库

时间:2016-03-24 14:41:11

标签: ssl gradle jvm android-gradle http-authentication

问题

我有一个Android Gradle项目应该从我公司的sonatype nexus服务器中提取lib。 nexus服务器使用证书身份验证。这意味着客户端有一个私有证书,可以对nexus服务器进行身份验证和授权。

问题是如何配置gradle来使用我的证书(在osx密钥库中)。

/app/build.gradle

repositories {
   // some other repositorys...
   ...
   maven {
      credentials {
         username = NEXUS_USERNAME
         password = NEXUS_PASSWORD
      }
      url 'https://prefix.server.com/nexus/content/repositories/artifactid'
   }
}

在没有提供证书的情况下,nexus服务器响应:

错误:无法抬头'https://prefix.server.com/nexus/content/repositories/artifactid/de/komoot/android/kmt-material-showcase/0.0.1/kmt-material-showcase-0.0.1.pom'。从服务器收到状态码400:错误请求

我的第一个解决方案是尝试配置jvm以使用osx keychain作为证书。同样的方法帮助我在nexus服务器上推送和发布libs / artifacts。

/app/gradle.properties

org.gradle.jvmargs=-Djavax.net.ssl.keyStore=NONE -Djavax.net.ssl.keyStoreType=KeychainStore -Djavax.net.ssl.keyStorePassword=-

这不适用于gradle同步失败: 错误:无(无此文件或目录)

看起来好像是参数'-Djavax.net.ssl.keyStore'的'无'。我尝试了几个uper和小写的解决方案,但都失败了。

第二种方法是尝试

org.gradle.jvmargs=-Djavax.net.ssl.keyStoreType=KeychainStore

但服务器再次响应400。看起来没有使用JVM args。

此主题的任何想法或文章? 希望有人可以帮助我。

2 个答案:

答案 0 :(得分:14)

问题是Java进程没有身份验证证书。

在我的第一种方法中,我非常接近,但我忘了添加公司的根CA证书。我公司的私有证书属于根CA,因此两者都必须提供给java。

解决方案:

首先将您的私人公司证书提供给gradle流程。

编辑用户gradle.properties并添加

org.gradle.jvmargs=-Djavax.net.ssl.keyStore="/Users/myusername/certificates/my_private_company_cert.p12" -Djavax.net.ssl.keyStoreType=KeychainStore -Djavax.net.ssl.keyStorePassword=changeit

然后将公司的root ca证书导出到java密钥库。

sudo keytool -import -trustcacerts -alias root -file ./certificates/company_root_ca.crt -keystore $JAVA_HOME/jre/lib/security/cacerts

现在证书认证应该可以正常工作。

这用于制作自己的android libary项目并将它们推送到工件服务器。 https://medium.com/android-news/the-complete-guide-to-creating-an-android-library-46628b7fc879#.naboz7yng

答案 1 :(得分:0)

我的解决方案是更新ubuntu / debian系统上的ca证书。

update-ca-certificates -f