2016-03-24 38 views
7

Il problemaGradle l'autenticazione dei certificati per l'uso repository

Ho un progetto Gradle Android che dovrebbe tirare un lib dal mio server nexus Companys Sonatype. Il server nexus utilizza un'autenticazione del certificato. Ciò significa che il client ha un certificato privato che lo autentica e lo autorizza contro il server nexus.

Il problema è come configurare gradle per utilizzare il mio certificato (che si trova nel keystore 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' 
    } 
} 

Senza dare un certificato del server di respont nesso con:

errore: Impossibile HEAD 'https://prefix.server.com/nexus/content/repositories/artifactid/de/komoot/android/kmt-material-showcase/0.0.1/kmt-material-showcase-0.0.1.pom'. Ricevuto il codice di stato 400 dal server: Richiesta errata

La mia prima soluzione era provare a configurare jvm per utilizzare il portachiavi osx per i certificati. Lo stesso metodo mi ha aiutato a spingere e pubblicare lib/artefatti sul server nexus.

/app/gradle.properties

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

Questo non funziona la sincronizzazione Gradle riuscita: errore: nessuno (Nessun file o directory)

Sembra che il Gradle dovrebbe essere 'NONE' del parametro '-Djavax.net.ssl.keyStore'. Ho provato diverse soluzioni di uper e minuscolo ma tutte sono fallite.

Il secondo approccio è stato quello di provare con

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

Ma il server rispondono con 400 di nuovo. Sembra che gli argomenti JVM non siano stati usati.

Eventuali idee o articoli per questo argomento? Spero che qualcuno possa aiutarmi.

risposta

7

Il problema era che il processo Java non aveva il certificato per l'autenticazione.

Nel mio primo approccio sono arrivato molto vicino ma ho dimenticato di aggiungere il certificato CA della radice della società. Il certificato privato della mia azienda appartiene alla CA radice, quindi entrambi devono essere forniti a java.

Soluzione:

Prima di fornire il certificato società privata al processo Gradle.

Modifica i tuoi gradle.properties utente e aggiungere

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 

quindi esportare la vostra azienda di root CA cert al chiavi Java.

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

Ora l'autenticazione del certificato dovrebbe funzionare.

Viene utilizzato ad esempio per creare propri progetti di librerie Android e inviarli a un server di risorse. https://medium.com/android-news/the-complete-guide-to-creating-an-android-library-46628b7fc879#.naboz7yng

+1

"KeychainStore" non è un tipo di archivio chiavi valido. Per questo esempio, dovrebbe essere "PKCS12". Altrimenti, ottima risposta - grazie! – Mark

1

La mia soluzione era aggiornando i certificati ca sul sistema ubuntu/debian.

update-ca-certificates -f