2016-03-24 4 views
7

ПроблемаGradle аутентификация использование сертификата для хранилища

У меня есть проект Android Gradle который должен вытащить экспромты из моего Companys Sonatype сервера связующего. Сервер nexus использует аутентификацию сертификата. Это означает, что у клиента есть закрытый сертификат, который аутентифицирует и авторизует его против сервера nexus.

Проблема заключается в том, как настроить град, чтобы использовать мой сертификат (который находится в хранилище ключей 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' 
    } 
} 

Не давая сертификат на respont сервера нексуса с:

Ошибка: Не удалось ГОЛОВА '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 для сертификатов. Тот же метод помог мне нажимать и публиковать libs/артефакты на сервере nexus.

/app/gradle.properties

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

Это не работает Gradle синхронизация не удалась: Ошибка: NONE (Нет такого файла или каталога)

Это выглядит как Gradle ожидается, будет 'NONE' параметра '-Djavax.net.ssl.keyStore'. Я попробовал несколько решений с более высоким и низким разрешением, но все не удалось.

Второй подход был попробовать с

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

Но сервер снова реагирует с 400. Похоже, что аргументы JVM не использовались.

Любые идеи или статьи по этой теме? Надеюсь, кто-то может мне помочь.

ответ

7

Проблема заключалась в том, что процесс 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 

Затем экспортировать корень ч серт вашей компании на Java хранилище ключей.

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

Именно эта аутентификация сертификата теперь должна работать.

Это используется, например, для создания собственных андроидных проектов и подталкивания их к серверу артефактов. https://medium.com/android-news/the-complete-guide-to-creating-an-android-library-46628b7fc879#.naboz7yng

+1

"KeychainStore" не является допустимым типом хранилища ключей. Для этого примера это должно быть «PKCS12». В противном случае, отличный ответ - спасибо! – Mark

1

Моим решением было обновление сертификатов ca на системе ubuntu/debian.

update-ca-certificates -f