Sebelumnya saya sudah menunjukkan langkah-langkah instalasi Nexus pada tutorial “Instalasi Nexus di Ubuntu 22.04“. Namun jika diperhatikan webui Nexus Repository Manager masih menggunakan plain HTTP connector tanpa enkripsi apapun sehingga cukup beresiko jika pengguna Nexus menggunakan wifi publik, terutama apabila Nexus tersebut digunakan sebagai repository private perusahaan.
Untuk mengatasi celah tersebut, berikut adalah langkah-langkah untuk melakukan aktivasi akses HTTPS pada webui Nexus Repository Manager:
Sebelum melakukan proses aktivasi, pastikan sudah mengikuti tutorial instalasi 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: Enable HTTPS Connector
- Salin file konfigurasi default Nexus ke work directory Nexus:
# cp /opt/nexus/etc/nexus-default.properties /opt/sonatype-work/nexus3/etc/nexus.properties
- Edit file /opt/sonatype-work/nexus3/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 /opt/nexus/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 Nexus:
# mkdir -p /opt/sonatype-work/nexus3/etc/ssl
- Salin file SSL certificate Java ke direktori ssl Nexus:
# cp /tmp/keystore.jks /opt/sonatype-work/nexus3/etc/ssl/
- Restart service Nexus:
# systemctl restart nexus
- Tunggu sekitar 2 menit sampai semua modul Nexus running lalu cek menggunakan netstat untuk memastikan HTTPS port Nexus sudah aktif:
# netstat -tlpN --numeric-ports Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 localhost:35419 0.0.0.0:* LISTEN 8265/java tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1023/sshd: /usr/sbi tcp 0 0 0.0.0.0:8443 0.0.0.0:* LISTEN 8265/java tcp 0 0 localhost:53 0.0.0.0:* LISTEN 746/systemd-resolve tcp 0 0 0.0.0.0:8081 0.0.0.0:* LISTEN 8265/java
Testing:
- Akses webui Nexus Repository Manager melalui web browser menggunakan URL HTTPS dan port HTTPS yang sudah didefinisikan pada file konfigurasi:
Opsional: Disable HTTP Connector
Kalian juga bisa disable HTTP connector Nexus sehingga webui plain HTTP yang kurang secure tidak bisa diakses. Berikut adalah langkah-langkah untuk disable HTTP connector Nexus:
- Edit file /opt/sonatype-work/nexus3/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:
- Restart service Nexus:
# systemctl restart nexus
- Tunggu sekitar 2 menit sampai semua modul Nexus running lalu cek menggunakan netstat untuk memastikan HTTP port Nexus sudah tidak ada:
# netstat -tlpN --numeric-ports Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1023/sshd: /usr/sbi tcp 0 0 0.0.0.0:8443 0.0.0.0:* LISTEN 9015/java tcp 0 0 localhost:53 0.0.0.0:* LISTEN 746/systemd-resolve tcp 0 0 localhost:33861 0.0.0.0:* LISTEN 9015/java