Italian Mysql e SSL

micro

Well-Known Member
Licensed User
Longtime User
Salve ragazzi
Su Aruba ho un cloud linux sul quale ho installato un server mysql che utilizzo da remoto con alcuni miei programmi (B4J) per archiviare quello che mi serve, diciamo che non sono dati sensibili e quindi il traffico avviene in chiaro però anche se poco importanti (i dati) sto pensando di passare all'uso di SSL.
Informandomi ho visto che lato server mysql nella cartella mysql devo crearmi una cartella chiamata ssl e all'interno scaricarmi i vari certificati ca-cert.pem - ca-key-pem ecc.
Lato Client quindi dovrei prepare la stessa cosa con i vari certificati che andranno puntati dalla stringa di connessione a mysql ma quello che non capisco è che certificati usare, quelli che mi ritrovo in mysql/ssl o altro?
Chiedo quindi se qualcuno di Voi ha già utilizzato questo se riesce a darmi una dritta, anche come procedura corretta di scarico dei certificati e loro utilizzo.
Grazie.
 

udg

Expert
Licensed User
Longtime User
Considerando che già utilizzi dei tuoi sw B4J per scambiare dati con tue app B4A, perchè non estendere l'utilizzo di SSL/TLS a tutte le comunicazoni tra questi?
Aggiungi che accedere direttamente al DBMS dall'esterno (fuori dal server) non è mai consigliabile.

Prima di tutto dovresti procurarti un certificato SSL. Let's Encrypt è una possibilità (a costo zero) ma ha la seccatura di dover rinnovare il certificato ogni tre mesi circa (dico circa perchè si presume che tu rinnovi qualche giorno prima della scadenza). In alternativa ssl2buy.com vende certificati annuali per circa $10. E presumo ce ne siano ormai tanti altri che abbiano più o meno gli stessi costi.

Le procedure di installazione variano in base a cosa ti invia l'authority da cui hai ricevuto il certificato.
Lato B4x non c'è molto da fare. Sostanzialmente attivare una porta su JServer (B4J) distinta da quella per il traffico in chiaro ed utilizzare https da B4A quando ti colleghi al tuo servizio B4J.
 

micro

Well-Known Member
Licensed User
Longtime User
Tutto Ok UDG certo ma è il settaggio esatto lato server (cloud) e lato cliente (B4J) che mi spiazza.
Ad esempio sul cloud linux in /etc ho gia una cartella ssl con altre due subdir
upload_2019-6-5_17-3-36.png

In private ho ssl-cert-snakeoil.key
e in certs una miriade di certificati *.pem
----------------------------------------------
Se apro my.cnf in /etc/mysql
trovo:

# For generating SSL certificates I recommend the OpenSSL GUI "tinyca".
#
#ssl-ca=/etc/mysql/cacert.pem
#ssl-cert=/etc/mysql/server-cert.pem
#ssl-key=/etc/mysql/server-key.pem

Quindi per usare ssl devo decommentare le ultime tre
righe ma di quei file pem non ne trovo nessuno in /etc/ssl/certs

Quindi? (è questo che mi confonde)

E poi lato B4J come dici tu un qualunque certificato SSL?

Grazie

P.S.
Non voglio fare modifiche al programma e questa modalità di connessione diretta a mysql sul cloud mi è comoda
altrimenti avrei ovviato all'utilizzo di APi REST o con PHP ma ripeto non ho proprio voglia di stare a modificare il
programma.
 

udg

Expert
Licensed User
Longtime User
Quindi per usare ssl devo decommentare le ultime tre righe ma di quei file pem non ne trovo nessuno in /etc/ssl/certs
Non saprei di preciso, ma la prima riga di commento sembrerebbe suggerire di utilizzare tinyca per generare quei file. Se ciò fosse confermato, il primo problema (accesso SSL a MySql) dovrebbe risolversi in questo modo.

Per il discorso B4J, come dicevo nel post precedente, dovresti prima decidere quale certificato acquisire. Questo perchè il materiale che ti arriva differisce da fornitore a fornitore. In funzione di ciò che ricevi è necessario "assemblare" i file ricevuti in modo che JServer li riconosca ed utilizzi. Ti riporto una ricetta di massima nel prossimo post.

ps: dimenticavo di avvisare che io ho CentOS 7 e non Ubuntu, quindi i comandi potrebebro differire, ma la sostanza dovrebbe rimanere quella.
 
Last edited:

udg

Expert
Licensed User
Longtime User
Qui di seguito ti riporto i miei appunti di quando ho attivato un certificato Let'sEncrypt come base per lo scambio dati B4A-B4J. Sono solo note raccolte leggendo qua e là, ma dovrebbero essere sufficienti.

*****************************************************************************
Key Manager Password: abcdef12pkcs
Keystore password: abcdef12key
*****************************************************************************
NB: le due passwprd precedenti sono esempi generici; utilizza quelle che riteni più opportune, ma ricorda di distinguere bene i ruoli tra KeyManager e Keystore (v. oltre)

***** Installa certbot
sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install certbot

sudo certbot certonly --webroot -w /opt/CloudServer/http_public -d mysitehere.com -d www.mysitehere.com

sudo certbot certonly --standalone -d mysitehere.com -d www.mysitehere.com

(replaced mysitehere.com with my actual domain name for my website where my B4J app is running.)


The above created a folder in etc/letsencrypt/live/mysitehere.com/
In that directory there is a few .pem files.

**** prepara PKCS12 file ****************
sudo openssl pkcs12 -export -out keystore.pkcs12 -in /etc/letsencrypt/live/mysitehere.com/fullchain.pem -inkey /etc/letsencrypt/live/mysitehere.com/privkey.pem

This will have you create a password. This is your "Key Manager" password. It's the password that unlocks your key / certificate. Don't forget / loose this password. It will have you enter it twice.

******** prepara il KEYSTORE file ****
sudo keytool -importkeystore -srckeystore keystore.pkcs12 -srcstoretype PKCS12 -destkeystore keystore.jks

oppure
sudo keytool -v -importkeystore -srckeystore domaincert.p12 -srcstoretype PKCS12 -destkeystore keystore.jks -deststoretype JKS

Note: “keystore.jks” will be the name of the final keystore file. You can change it to whatever you like (I named it “jetty.keystore”).

1) This will have you set up a password and re-enter the password. This password is your "Key Store" password. This is the password that opens the key store file.

2) It will then ask you for you password that you used to create the domaincert.p12 file (the "Key Manager" password). The password can be the same for both - if you prefer


Once this is done, you'll have a keystore file named keystore.jks (or whatever you called it).

Now, copy this keystore file to the same place as your jserver .jar file.

****************** Erel tutorial ***
https://www.b4x.com/android/forum/threads/server-ssl-connections.40130/#content

The server configuration is done with SslConfiguration object. This code should be called before the server is stared.
B4X:
Private Sub ConfigureSSL (SslPort As Int)
   'example of SSL connector configuration
   Dim ssl As SslConfiguration
   ssl.Initialize
   ssl.SetKeyStorePath(File.DirApp, "test2.keystore") 'path to keystore file
   ssl.KeyStorePassword = "123456"
   ssl.KeyManagerPassword = "654321"
   srvr.SetSslConfiguration(ssl, SslPort)
   'add filter to redirect all traffic from http to https (optional)
   srvr.AddFilter("/*", "HttpsFilter", False)
End Sub

We need to create a SslConfiguration object and set the path and passwords of the keystore file.
Then we call Server.SetSslConfiguration with the configuration object and the https port we want to listen to.

We can use a Filter class to redirect all http traffic to https:
B4X:
'Return True to allow the request to proceed.
Public Sub Filter(req As ServletRequest, resp As ServletResponse) As Boolean
   If req.Secure Then
     Return True
   Else
     resp.SendRedirect(req.FullRequestURI.Replace("http:", "https:") _
       .Replace(Main.srvr.Port, Main.srvr.SslPort))
     Return False
   End If
End Sub

This code checks whether the request is a secure request. If not it redirects the request to the https port and sets the scheme to https.

Note that trying to connect with http to the https port or with https to the http port will result with an error.

Filters do not apply to web sockets. You can use WebSocket.Secure to make sure that a secure connection has been made (this will be the case if the current request is a https request, unless someone has tampered the JavaScript code).

udg
 

micro

Well-Known Member
Licensed User
Longtime User
Grazie UDG per la lezione ....SSL
Ma devo fare mente locale su cosa fare che sia più giusto e corretto, inoltre è un po diversa la mia situazione.
Vedo un po ed eventualmente ci risentiamo, grazie.
 

udg

Expert
Licensed User
Longtime User
Lezione è un termine decisamente esagerato; diciamo che ho condiviso la mia esperienza avendo affrontato una situazione simile qualche tempo fa.

Buona serata
 

micro

Well-Known Member
Licensed User
Longtime User
Lezione è un termine decisamente esagerato; diciamo che ho condiviso la mia esperienza avendo affrontato una situazione simile qualche tempo fa.
Grazie comunque
Ho ripreso ieri a fare qualche prova ma ho ancora dubbi
Riepilogo:
Sul cloud linux aruba dove ho mysql installato ieri ho installato i certificati usando questa procedura
(sino all'inserimento di un utente) e sin qui tutto ok.
Infatti ora al'interno di mysql ho una cartella ssl con
ca-cert.pem
server-cert.pem
server-key.pem

in my.cnf ho messo i percorsi giusti e ho abilitato il log e già qui un piccolo problema perchè nel log mi ritrovo che per ssl la path dei certificati è errata ma i percorsi però sono quelli.
Comunque lo vedrò dopo.

La parte che mi sfugge è il settaggio sul pc con cui mi connetto al cloud

Quando lavoravo senza ssl avevo:
B4X:
Try
        pool.Initialize("com.mysql.jdbc.Driver", "jdbc:mysql://ip_cloud:3306/name_db", "user", "pass")
        Dim jo As JavaObject = pool
        jo.RunMethod("setMaxIdleTime", Array As Object(3600))
        jo.RunMethod("setMaxPoolSize", Array As Object(200))
        jo.RunMethod("setCheckoutTimeout", Array As Object(3500))
        NotificaShow("Info", "Connessione database Ok!", "info", 2000)
        connessocloud = True
        Inizializza
        CaricaArchivi
        LoadColumn
    Catch As Exception
        NotificaShow("Errore", "Errore connessione server mysql!", "errore", 2000)
        connessocloud = False
    End Try
e sin qui tutto ok perchè funzionava bene (dopo ho usato la connessione asincrona ma è altra cosa)
Ora che ho intenzione di usare ssl (ho installato su win OpenSSl32) la stringa dovrebbe diventare:
B4X:
pool.Initialize("com.mysql.jdbc.Driver", "jdbc:mysql://ip_cloud:3306/name_db?&useSSL=true&serverSSlCert=C:\Program Files (x86)\OpenSSL-Win32\certs\ca-cert.pem", "user", "pass")
Dico bene?
Oppure mi sfugge qualcosa?
Grazie ancora

.....provo a postare nel forum inglese (Edit)
 
Last edited:
Top