Saya telah menggunakan WSO2 API Manager selama hampir satu tahun untuk mengekspos API dengan mudah dan aman ke konsumen internal dan eksternal. Semuanya bekerja dengan baik sampai sistem diturunkan untuk aktivitas pemeliharaan. Ketika sistem dilanjutkan kembali ke layanan normal, WSO2 gagal memulai dengan beberapa pengecualian di wso2carbon.log
file – “Disebabkan oleh:com.mysql.cj.exceptions.UnableToConnectException:Pengambilan Kunci Publik tidak diizinkan”. Dalam artikel ini, saya akan membagikan perbaikannya.
Error Public Key Retrieval tidak diizinkan – WSO2 dengan MySQL 8.*
Terlepas dari kesalahan di atas, saya dapat melihat beberapa pengecualian lagi di wso2carbon.log
file, dan ini salinannya.
ERROR {org.wso2.carbon.user.core.internal.Activator} - Cannot start User Manager Core bundle org.wso2.carbon.user.core.UserStoreException: Cannot initialize the realm. at org.wso2.carbon.user.core.common.DefaultRealmService.initializeRealm(DefaultRealmService.java:286) at org.wso2.carbon.user.core.common.DefaultRealmService.<init>(DefaultRealmService.java:102) ::::::::::::::::::::::::::::::::::::::::::::::::: Caused by: java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:110) at ::::::::::::::::::::::::::::::::::::::::::: ERROR {org.wso2.carbon.user.core.internal.Activator} - Cannot start User Manager Core bundle org.wso2.carbon.user.core.UserStoreException: Cannot initialize the realm. at org.wso2.carbon.user.core.common.DefaultRealmService.initializeRealm(DefaultRealmService.java:286) :::::::::::::::::::::::::::::::::::::::::: Caused by: org.wso2.carbon.user.core.UserStoreException: DB error occurred while persisting domain : PRIMARY & tenant id : -1234
Melihat beberapa pengecualian pertama, saya mengerti bahwa kesalahan ini disebabkan oleh koneksi MySQL dan pengecualian yang disebabkan di 'com.mysql.cj.jdbc.exceptions.SQLError ' menegaskannya. Konektor MySQL tampaknya memiliki beberapa masalah dan pencarian cepat di Google mengungkapkan bahwa masalah tersebut umumnya dilaporkan di MySQL versi 8.
Sistem tampaknya telah diperbarui ke versi terbaru MySQL yaitu, versi 8.0.26. Baru-baru ini saya telah memperbaiki beberapa masalah dalam versi MySQL 8, jika Anda ingin melihatnya. Sekarang kembali ke masalah ini. Sebagian besar forum menyarankan untuk menambahkan 'allowPublicKeyRetrieval=true'
ke URL koneksi MySQL dan berhasil juga.
Di WSO2, tambahkan ‘allowPublicKeyRetrieval=true
' ke deployment.toml
file seperti yang ditunjukkan di bawah ini:
[database.apim_db] type = "mysql" #Henry - Retain mysql connnection string as localhost always url = "jdbc:mysql://localhost:3306/apim_db?useSSL=false&allowPublicKeyRetrieval=true" ............. [database.shared_db] type = "mysql" #Henry - Retain mysql connnection string as localhost always url = "jdbc:mysql://localhost:3306/shared_db?useSSL=false&allowPublicKeyRetrieval=true" ........................
Catatan :&
; sebelum allowPublicKeyRetrieval=true
di URL koneksi. Menambahkan hanya '&' alih-alih '&' akan menghasilkan kesalahan di bawah ini:
Caused by: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character '=' (code 61); expected a semi-colon after the reference for entity 'allowPublicKeyRetrieval' at [row,col {unknown-source}]: [39,100] ERROR {org.wso2.carbon.user.core.internal.Activator} - Cannot start User Manager Core bundle java.lang.RuntimeException: Error in looking up data source: Name [jdbc/SHARED_DB] is not bound in this Context. Unable to find [jdbc].
Setelah perubahan dibuat, mulai ulang layanan WSO. Itu dia!
Opsi allowPublicKeyRetrieval=true
memungkinkan klien untuk secara otomatis meminta kunci publik dari server. Baca selengkapnya tentang opsi MySQL di sini.
Jika Anda menjalankan WSO2 di server produksi, useSSL=false tidak disarankan. allowPublicKeyRetrieval=True
dapat memungkinkan serangan man-in-the-middle melalui proxy jahat untuk mendapatkan kata sandi plaintext. allowPublicKeyRetrieval adalah False secara default dan harus diaktifkan secara eksplisit. Jika Anda menggunakan koneksi aman ke database, coba hapus useSSL=false dari URL koneksi dan itu dapat memperbaiki masalah.