Persiapan
- Buat sertifikat jika belum ada. Untuk beberapa distribusi sudah tersedia sertifikat. Untuk ubuntu, sertifikat ada di folder /var/lib/mysql
- Salin ca.pem, client-key.pem dan client-cert.pem ke server aplikasi (jika server aplikasi tidak menjadi satu dengan server MySQL). Agar seragam, salin ke /etc/ssl/mysql untuk Linux, sedangkan C:\ssl\mysql untuk Windows
- Jika server aplikasi terpisah dengan MySQL (Linux)
userserveraplikasi@server-aplikasi:/# sudo mkdir /etc/ssl/mysql
userserveraplikasi@server-aplikasi:/# sudo scp userserverbasisdata@alamatserverbasisdata:/var/lib/mysql/ca.pem /etc/ssl/mysql/ca.pem
userserveraplikasi@server-aplikasi:/# sudo scp userserverbasisdata@alamatserverbasisdata:/var/lib/mysql/client-key.pem /etc/ssl/mysql/client-key.pem
userserveraplikasi@server-aplikasi:/# sudo scp userserverbasisdata@alamatserverbasisdata:/var/lib/mysql/client-cert.pem /etc/ssl/mysql/client-cert.pem - Jika server aplikasi menjadi satu dengan MySQL (Linux)
userserveraplikasi@server-aplikasi:/# sudo mkdir /etc/ssl/mysql
userserveraplikasi@server-aplikasi:/# sudo cp /var/lib/mysql/ca.pem /etc/ssl/mysql/ca.pem
userserveraplikasi@server-aplikasi:/# sudo cp /var/lib/mysql/client-key.pem /etc/ssl/mysql/client-key.pem
userserveraplikasi@server-aplikasi:/# sudo cp /var/lib/mysql/client-cert.pem /etc/ssl/mysql/client-cert.pem - Windows
C:\Users\server-aplikasi>mkdir C:\ssl\mysql
Salin ketiga berkas ke folder C:\ssl\mysql
- Jika server aplikasi terpisah dengan MySQL (Linux)
- Untuk beberapa server aplikasi perlu di ekspor sertifikatnya ke bentuk lain, misalnya untuk java. Untuk yang tidak perlu ekspor, maka tidak perlu melakukan langkah ini.
Catatan:
Untuk perintah openssl harus menginstal openssl terlebih dahulu. Untuk perintah keytool harus menginstal java terlebih dahulu.- Siapkan nama, alias dan password store, misalnya: keystore sebagai namanya, storeMySQL sebagai alias dan katakuncistore sebagai passwordnya. Masukkan kata kunci tersebut jika ditanyakan pada saat menggunakan keytool dan digunakan pada saat mengakses sertifikat yang sudah diekspor tersebut.
- Pada server MySQL
userserverbasisdata@server-basisdata:/# cd /var/lib/mysql
userserverbasisdata@server-basisdata:/var/lib/mysql# openssl pkcs12 -export -inkey client-key.pem -in client-cert.pem -out client.packet -passout pass:katakuncistore - Kemudian ubah ke dalam Keystore Java
Catatan: JKS adalah format proprietary, sedangkan PKCS12 adalah format standar industri- Jika server aplikasi terpisah dengan MySQL (Linux)
userserveraplikasi@server-aplikasi:/# sudo scp userserverbasisdata@alamatserverbasisdata:/var/lib/mysql/client.packet /etc/ssl/mysql/client.packet
userserveraplikasi@server-aplikasi:/# sudo scp userserverbasisdata@alamatserverbasisdata:/var/lib/mysql/ca.pem /etc/ssl/mysql/ca.pem
userserveraplikasi@server-aplikasi:/# cd /etc/ssl/mysql
userserveraplikasi@server-aplikasi:/etc/ssl/mysql# keytool -importkeystore -srckeystore client.packet -srcstoretype pkcs12 -srcstorepass katakuncistore -destkeystore keystore.clientcert -deststoretype pkcs12 -storepass katakuncistore
userserveraplikasi@server-aplikasi:/etc/ssl/mysql# keytool -importcert -alias storeMySQL -file ca.pem -keystore keystore.trustcert -storetype pkcs12 -storepass katakuncistore - Jika server aplikasi menjadi satu dengan MySQL (Linux)
userserveraplikasi@server-aplikasi:/# sudo cp /var/lib/mysql/client.packet /etc/ssl/mysql/client.packet
userserveraplikasi@server-aplikasi:/# sudo cp /var/lib/mysql/ca.pem /etc/ssl/mysql/ca.pem
userserveraplikasi@server-aplikasi:/# cd /etc/ssl/mysql
userserveraplikasi@server-aplikasi:/etc/ssl/mysql# keytool -importkeystore -srckeystore client.packet -srcstoretype pkcs12 -srcstorepass katakuncistore -destkeystore keystore.clientcert -deststoretype pkcs12 -storepass katakuncistore
userserveraplikasi@server-aplikasi:/etc/ssl/mysql# keytool -importcert -alias storeMySQL -file ca.pem -keystore keystore.trustcert -storetype pkcs12 -storepass katakuncistore - Pada server aplikasi (Windows)
Salin berkas client.packet dan ca.pem ke folder C:\ssl\mysql
C:\Users\server-aplikasi>cd C:\ssl\mysql
C:\ssl\mysql>“C:\Program Files\Java\jdkx.x.x_xx\bin\keytool.exe” -importkeystore -srckeystore client.packet -srcstoretype pkcs12 -srcstorepass katakuncistore -destkeystore keystore.clientcert -deststoretype pkcs12 -storepass katakuncistore
C:\ssl\mysql>“C:\Program Files\Java\jdkx.x.x_xx\bin\keytool.exe” keytool -importcert -alias storeMySQL -file ca.pem -keystore keystore.trustcert -storetype pkcs12 -storepass katakuncistore
- Jika server aplikasi terpisah dengan MySQL (Linux)
Penggunaan (Menggunakan Kunci Khusus)
- Aplikasi MySQL, seperti: MySQL Workbench
- Klik kanan pada koneksi yang hendak dibuat aman, kemudian pilih Edit Connection.
- Pilih Tab Connection > SSL, kemudian pilih Require pada Use SSL, dan isi SSL File dengan 3 berkas sertifikat yang ada.
- PHP
- Prosedural (sumber: https://stackoverflow.com/questions/9738712/connect-to-remote-mysql-server-with-ssl-from-php, terakhir diakses 3 Jan 2020)
$db = mysqli_init();
mysqli_options ($db, MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, true);
ssl_set($db, ‘/etc/mysql/ssl/client-key.pem’, ‘/etc/mysql/ssl/client-cert.pem’, ‘/etc/mysql/ssl/ca-cert.pem’, NULL, NULL);
$conn = mysqli_real_connect ($db, $servername, $username, $password, $dbname, 3306, NULL, MYSQLI_CLIENT_SSL);
if (!$conn)
{
die(‘CONNERR’);
} - Objek (transformasi prosedural menjadi objek dari kode di atas)
$conn = new mysqli($servername, $username, $password);
$conn->init();
$conn->options(MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, true);
$conn->ssl_set(‘/etc/mysql/ssl/client-key.pem’, ‘/etc/mysql/ssl/client-cert.pem’, ‘/etc/mysql/ssl/ca-cert.pem’, NULL, NULL);
$conn->real_connect($servername, $username, $password, $dbname, 3306, NULL, MYSQLI_CLIENT_SSL);
if ($conn->connect_errno > 0 || $conn->connect_error)
{
die(‘CONNERR’);
}
- Prosedural (sumber: https://stackoverflow.com/questions/9738712/connect-to-remote-mysql-server-with-ssl-from-php, terakhir diakses 3 Jan 2020)
- Code Igniter (sumber: https://codeigniter.com/user_guide/database/configuration.html, terakhir diakses 3 Jan 2020)
- Buka config\database.php
- Setting driver dengan MySQLi
$db[‘default’][‘dbdriver’] = “mysqli”; - Setting security
$db[‘default’][‘security’] = [“ssl_key” => “/etc/ssl/mysql/client-key.pem”, “ssl_cert” => “/etc/ssl/mysql/client-cert.pem”, “ssl_ca” => “/etc/ssl/mysql/ca.pem”];
- WordPress
- Tambahkan (https://serverfault.com/questions/778393/enabling-ssl-connection-from-wordpress-to-mysql, terakhir diakses 4 Jan 2020)
define(‘MYSQL_CLIENT_FLAGS’, MYSQLI_CLIENT_SSL);
pada wp-config.php - Jika ingin menggunakan kunci khusus
- Install Plugin Secure DB Connection (By Xiao Yu) (https://wordpress.org/plugins/secure-db-connection/, terakhir diakses 4 Jan 2020)
- Ada 5 opsi yang bisa disetting, yang sama dengan opsi yang ada di ssl_set(), yaitu MYSQL_SSL_KEY, MYSQL_SSL_CERT, MYSQL_SSL_CA, MYSQL_SSL_CA_PATH, dan MYSQL_SSL_CIPHER. Tambahkan pada wp-config.php.
contoh:
//plugin secure db connection
define(‘MYSQL_SSL_KEY’, ‘/etc/mysql/ssl/client-key.pem’);
define(‘MYSQL_SSL_CERT’, ‘/etc/mysql/ssl/client-cert.pem’);
define(‘MYSQL_SSL_CA’, ‘/etc/mysql/ssl/ca-cert.pem’);
//jangan lupa
define(‘MYSQL_CLIENT_FLAGS’, MYSQLI_CLIENT_SSL);
jika berhasil maka akan muncul keterangan MySQL Secured di At a Glance pada Dashboard
- Tambahkan (https://serverfault.com/questions/778393/enabling-ssl-connection-from-wordpress-to-mysql, terakhir diakses 4 Jan 2020)
- Java / Tomcat (sumber: https://help.mulesoft.com/s/article/How-to-connect-to-MySQL-using-SSL, terakhir diakses 6 Jan 2020)
- Pastikan Keystore Java untuk sertifikat MySQL sudah ada melalui langkah sebelumnya di atas
- Tambahkan pada url JDBC useSSL, requireSSL, verifyServerCertificate, trustCertificateKeyStoreUrl, trustCertificateKeyStorePassword,clientCertificateKeyStoreUrl dan clientCertificateKeyStorePassword, misalnya:
- Linux
<Resource auth=”Container” driverClassName=”com.mysql.jdbc.Driver” factory=”org.apache.tomcat.jdbc.pool.DataSourceFactory” type=”javax.sql.DataSource” url=”jdbc:mysql://alamatserverbasisdata:3306/namaskema?useSSL=true&requireSSL=true&verifyServerCertificate=true&trustCertificateKeyStoreUrl=file:///etc/ssl/mysql/keystore.trustcert&trustCertificateKeyStorePassword=katakuncistore&clientCertificateKeyStoreUrl=file:///etc/ssl/mysql/keystore.clientcert&clientCertificateKeyStorePassword=katakuncistore” /> - Windows
<Resource auth=”Container” driverClassName=”com.mysql.jdbc.Driver” factory=”org.apache.tomcat.jdbc.pool.DataSourceFactory” type=”javax.sql.DataSource” url=”jdbc:mysql://alamatserverbasisdata:3306/namaskema?useSSL=true&requireSSL=true&verifyServerCertificate=true&trustCertificateKeyStoreUrl=file:///C:\ssl\mysql\keystore.trustcert&trustCertificateKeyStorePassword=katakuncistore&clientCertificateKeyStoreUrl=file:///C:\ssl\mysql\keystore.clientcert&clientCertificateKeyStorePassword=katakuncistore” />
- Linux