Sebelumnya saya sudah menunjukkan langkah-langkah deploy container Nexus pada tutorial “Deploy Nexus Container menggunakan Docker“ namun aksesnya masih menggunakan plain HTTP connector yang tidak secure. Sekarang saya akan menunjukkan cara untuk aktivasi HTTPS di container Nexus. Kalian sebenarnya juga bisa mengikuti tutorial aktivasi HTTPS pada aplikasi Nexus yang di install langsung diatas bare metal Linux “Aktivasi Akses HTTPS Nexus (SSL)“, namun incase kalian bingung jika diterapkan pada Nexus berbasis Container Docker (Karena saya sempat beberapa kali gagal melakukan aktivasi HTTPS ini di Container Docker), berikut adalah langkah-langkah untuk melakukan aktivasi akses HTTPS pada webui Nexus Repository Manager berbasis Container Docker:
Sebelum melakukan proses aktivasi, pastikan sudah mengikuti tutorial deploy container Nexus pada blog ini dan sudah bisa diakses webuinya. Selain itu, aktivasi HTTPS ini membutuhkan SSL certificate sehingga pastikan ada SSL certificate yang masih aktif, lalu bisa disiapkan file-file berikut dari provider SSL dan salin ke server Nexus:
- Certificate file (.crt), nama file yang digunakan pada tutorial ini adalah commercial.crt
- Private key file (.key), nama file yang digunakan pada tutorial ini adalah commercial.key
- Root CA + intermediate certificate file, nama file yang digunakan pada tutorial ini adalah ca_bundle.crt
Jika tidak ada SSL certificate yang bersifat commercial atau berbayar, kalian juga bisa menggunakan self signed SSL yang di generate menggunakan tools seperti openssl dan sejenisnya. Cara generate self signed SSL bisa dilihat pada banyak tutorial yang ada di Google.
SSL certificate yang digunakan disini mencakup nama “nexus.raihan519.net“, sehingga supaya benar-benar secure webui Nexus Repository Manager harus diakses menggunakan nama tersebut. Sebelum melangkah lebih lanjut, sebaiknya tambahkan nama yang digunakan pada SSL kalian ke server DNS yang digunakan oleh komputer klien Nexus:
Langkah 1: Convert SSL Certificate ke Format Java
- Pastikan package openssl sudah terinstal
- File pendukung SSL certificate sudah disalin ke direktori /tmp
- Generate SSL certificate dengan ekstensi p12 dan masukan password baru untuk mengakses certificate:
# cd /tmp # openssl pkcs12 -export -in commercial.crt -inkey commercial.key -certfile ca_bundle.crt -out commercial.p12 Enter Export Password: (Masukan password) Verifying - Enter Export Password: (Masukan password) # ls -1 ca_bundle.crt commercial.crt commercial.key commercial.p12
- Generate SSL certificate untuk Java dari file p12 dan masukan passwordnya:
# keytool -importkeystore -srckeystore commercial.p12 -srcstoretype pkcs12 -destkeystore keystore.jks -deststoretype JKS Importing keystore commercial.p12 to keystore.jks... Enter destination keystore password: (Masukan password untuk file SSL certificate java) Re-enter new password: (Masukan password) Enter source keystore password: (Masukan password) Entry for alias 1 successfully imported. Import command completed: 1 entries successfully imported, 0 entries failed or cancelled # ls -1 ca_bundle.crt commercial.crt commercial.key commercial.p12 keystore.jks
Langkah 2: Recreate Nexus Container
- Hapus running container Nexus, namun pastikan kalian sudah pakai persitent volume (-v) pada container tersebut:
# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES afaa1d16c037 sonatype/nexus3 "/opt/sonatype/nexus…" 9 hours ago Up 9 hours 0.0.0.0:8081->8081/tcp, :::8081->8081/tcp nexus # docker rm -f nexus nexus
- Deploy container Nexus yang baru dengan tambahan persistent volume baru dan port expose baru untuk SSL:
- Port expose:
- 8081
- 8443
- Volume:
- nexus-work
- nexus-opt
- Port expose:
-
# docker run -d -p 8081:8081 -p 8443:8443 -v nexus-opt:/opt/sonatype/nexus -v nexus-work:/nexus-data --name nexus sonatype/nexus3
- Cek running container Nexus:
# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6c03d9941ab1 sonatype/nexus3 "/opt/sonatype/nexus…" 4 seconds ago Up 2 seconds 0.0.0.0:8081->8081/tcp, :::8081->8081/tcp, 0.0.0.0:8443->8443/tcp, :::8443->8443/tcp nexus
Langkah 3: Enable HTTPS Connector
- Masuk ke direktori Docker volume:
# /var/lib/docker/volumes # ls -1 backingFsBlockDev metadata.db nexus-opt nexus-work
- Salin file konfigurasi default Nexus ke work directory container Nexus:
# cp nexus-opt/_data/etc/nexus-default.properties nexus-work/_data/etc/nexus.properties
- Edit file nexus-work/_data/etc/nexus.properties:
- Tambahkan baris berikut dibawah application-port dan sesuaikan port HTTPS (Saya menggunakan port 8443):
application-port-ssl=8443
- Sesuaikan baris nexus-args, tambahkan “,${jetty.etc}/jetty-https.xml” dibelakang argumen HTTP. Berikut contohnya setelah disesuaikan:
nexus-args=${jetty.etc}/jetty.xml,${jetty.etc}/jetty-http.xml,${jetty.etc}/jetty-https.xml,${jetty.etc}/jetty-requestlog.xml
- Tambahkan baris berikut di bagian paling bawah:
# SSL ssl.etc=${karaf.data}/etc/ssl
- Tambahkan baris berikut dibawah application-port dan sesuaikan port HTTPS (Saya menggunakan port 8443):
- Edit file nexus-opt/_data/etc/jetty/jetty-https.xml:
- Sesuaikan baris KeyStorePassword, KeyManagerPassword & TrustStorePassword dengan password SSL certificate Java. Berikut contohnya setelah disesuaikan:
<Set name="KeyStorePassword">Secret123!</Set> <Set name="KeyManagerPassword">Secret123!</Set> <Set name="TrustStorePassword">Secret123!</Set>
- Tambahkan baris berikut diatas <Set name=”KeyStorePath”><Property name=”ssl.etc”/>/keystore.jks</Set>:
<Set name="certAlias">jetty</Set>
- Sesuaikan baris KeyStorePassword, KeyManagerPassword & TrustStorePassword dengan password SSL certificate Java. Berikut contohnya setelah disesuaikan:
- Buat direktori ssl baru di work directory container Nexus:
# mkdir -p nexus-work/_data/etc/ssl
- Salin file SSL certificate Java ke direktori ssl Nexus:
# cp /tmp/keystore.jks nexus-work/_data/etc/ssl/
- Restart container Nexus:
# docker restart nexus
- Tunggu sekitar 2 menit sampai semua modul Nexus running
Testing:
- Akses webui Nexus Repository Manager melalui web browser menggunakan IP address host Docker dan port HTTPS yang sudah didefinisikan pada file konfigurasi:
Opsional: Disable HTTP Connector
Kalian juga bisa disable HTTP connector container Nexus sehingga webui plain HTTP yang kurang secure tidak bisa diakses. Berikut adalah langkah-langkah untuk disable HTTP connector container Nexus:
- Edit file nexus-work/_data/etc/nexus.properties:
- Sesuaikan baris nexus-args, hapus “${jetty.etc}/jetty-http.xml,“. Berikut contohnya setelah disesuaikan:
nexus-args=${jetty.etc}/jetty.xml,${jetty.etc}/jetty-https.xml,${jetty.etc}/jetty-requestlog.xml
- Sesuaikan baris nexus-args, hapus “${jetty.etc}/jetty-http.xml,“. Berikut contohnya setelah disesuaikan:
- Hapus running container Nexus:
# docker rm -f nexus
- Redeploy container Nexus namun tanpa port HTTP 8081:
# docker run -d -p 8443:8443 -v nexus-opt:/opt/sonatype/nexus -v nexus-work:/nexus-data --name nexus sonatype/nexus3