2016-03-24 9 views
7

Das ProblemGradle Verwendung Zertifikatsauthentifizierung für Repository

Ich habe ein Android Gradle Projekt, das eine lib von meinem Unternehmen Sonatype Nexus Server ziehen sollte. Der Nexus-Server verwendet eine Zertifikatauthentifizierung. Das bedeutet, dass der Client ein privates Zertifikat besitzt, das ihn authentifiziert und gegen den Nexus-Server autorisiert.

Das Problem ist, wie Gradle zu verwenden, um mein Zertifikat zu verwenden (das ist in der OSX Keystore).

/app/build.gradle

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

ohne Zertifikat des Nexus Server respont zu geben mit:

Fehler: Kann nicht 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'. Statuscode 400 vom Server empfangen: Ungültige Anforderung

Meine erste Lösung bestand darin, zu versuchen, den jvm so zu konfigurieren, dass der osx-Schlüsselbund für Zertifikate verwendet wird. Die gleiche Methode hat mir geholfen, libs/artifacts auf dem nexus Server zu pushen und zu veröffentlichen.

/app/gradle.properties

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

Dies funktioniert nicht, die gradle Sync fehlgeschlagen: Fehler: NONE (Keine solche Datei oder das Verzeichnis)

es das gradle sieht aus wie zu erwarten 'NONE' des Parameters '-Djavax.net.ssl.keyStore'. Ich habe versucht, mehrere Groß-und Kleinbuchstaben Lösungen, aber alle fehlgeschlagen.

Der zweite Ansatz war es mit

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

Aber der Server reagiert mit 400 erneut zu versuchen. Es sieht so aus, als ob die JVM-Argumente nicht verwendet wurden.

Irgendwelche Ideen oder Artikel zu diesem Thema? Hoffe jemand kann mir helfen.

Antwort

7

Das Problem war, dass der Java-Prozess das Zertifikat für die Authentifizierung nicht hatte.

In meinem ersten Ansatz kam ich sehr nah, aber ich habe vergessen, das Stamm-CA-Zertifikat des Unternehmens hinzuzufügen. Das private Zertifikat meines Unternehmens gehört zur Stammzertifizierungsstelle, daher müssen beide für Java bereitgestellt werden.

Lösung:

erste private Unternehmen Zertifikat an den gradle Prozess.

Bearbeiten Sie Ihre Benutzer gradle.properties und fügen

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 

Dann Root-CA-Zertifikat auf die Java-Schlüsselspeicher Ihres Unternehmens exportieren.

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

Das ist es Zertifikat-Authentifizierung sollte nun funktionieren.

Dies wird zum Beispiel verwendet, um eigene Android-Bibliotheksprojekte zu erstellen und sie an einen Artefaktserver zu senden. https://medium.com/android-news/the-complete-guide-to-creating-an-android-library-46628b7fc879#.naboz7yng

+1

"KeychainStore" ist kein gültiger Keystore-Typ. In diesem Beispiel sollte es "PKCS12" sein. Ansonsten, tolle Antwort - danke! – Mark

1

Meine Lösung bestand darin, die CA-Zertifikate auf dem Ubuntu/Debian-System zu aktualisieren.

update-ca-certificates -f 
Verwandte Themen