Aktivasi Akses HTTPS Container Nexus (SSL) di Docker

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
  • # 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
  • 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>
  • 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
  • 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

Leave a Reply

Your email address will not be published.